[VBA] Compter les lignes d'une requête SQL

Résolu
Bonjour,

Je cherche à récupérer le nombre de lignes d'une requête SQL, le tout en VBA.
J'ai essayé d'utiliser un RecordCount, cependant il me renvoie systématiquement -1...

En espérant avoir une lumière sur ce RecordCount qui me pose un problème...:?

Sub CompleteTableauCommandeProvisoire()

    'Déclaration des variables
    Dim cnx As ADODB.Connection
    Dim rst As ADODB.Recordset

    'Instanciation des variables
    Set cnx = New ADODB.Connection
    Set rst = New ADODB.Recordset
    
    Dim sql1 As String
    Dim debutperiode As Date
    Dim ddeb As String
    Dim dfin As String
    Dim Ligne As Integer
    Dim j As Integer
    Dim result_sql
    Dim Col
    Dim cptLigne As Integer
    
    cnx.ConnectionString = "DSN=Stats;UID=***;PWD=***;"
    cnx.Open
    
    cptLigne = 6
    
    'Changer la date de début d'année
    For cptLigne = 6 To 263
        For debutperiode = DateSerial(2008, 12, 29) To Now() - 6 Step 7
            ddeb = Format(debutperiode, "dd/mm/yyyy")
            dfin = Format(debutperiode + 6, "dd/mm/yyyy")
            'Nombre total d'envois périodique (courrier ):
             sql1 = "select m.mp_l, count(*), sum(c.cde_tot_ttc)" + _
                " from   e_cde c, e_mode_paiement m" + _
                " where  c.cde_ty_se_c = 'WV2'" + _
                " and    c.cde_mp_c in ('KM','KI','KW','KT', 'KA','KC', 'CA')" + _
                " and    c.cde_mp_c = m.mp_c" + _
                " and    c.cde_d between" + _
                " to_date('" + ddeb + " 00:00:00' , 'dd/mm/yyyy hh24:mi:ss')" + _
                " and to_date('" + dfin + " 23:59:59', 'dd/mm/yyyy hh24:mi:ss') " + _
                " group by m.mp_l" + _
                " order by 1"

            rst.Open sql1, cnx
            rst.MoveFirst
            j = 0

            result = rst.RecordCount
            

            Do
                For Ligne = cptLigne To cptLigne + result
                    For Col = 65 To 67
                    'Lecture en ligne
                    Range(Chr(Col) & Ligne).Select
                    'Récupère résultat
                    result_sql = rst.Fields(j).Value
                    'Transfert le résultat dans la cellule
                    ActiveCell.FormulaR1C1 = result_sql
                    j = j + 1
                    Next
                j = 0
                rst.MoveNext
                Next
            Loop While rst.BOF
            cptLigne = cptLigne + 12
            rst.Close
            
        Next
    Next
End Sub


Cordialement,
Clément.
Configuration: Windows XP
Firefox 3.0.11

5 réponses

  1. Essayez ceci :

    Dim i As Integer
    Dim maCmd As New SqlCommand("VOTRE_REQUETE_ICI", Conn)
    Conn.Open()
    Dim monRead As SqlDataReader = maCmd.ExecuteReader() 'execution de la requete
    While monRead.Read()
    i = i + 1
    End While
    Conn.Close() 'fermeture de la connexion a la base


    Et voila , maintenant i contient le nombre des lignes de votre requête ...
    1. Bonjour

      je cherche aussi la solution à ce problème

      j'utilise vba sous excel pour me connecter à Oracle.

      voici mon code (mon objet connection appartient déjà à ma classe):

      'Déclaration des variables
      Dim cmd As ADODB.Command
      Dim rst As ADODB.Recordset

      'Instanciation des variables
      Set cmd = New ADODB.Command
      Set rst = New ADODB.Recordset

      'Préparation de l'objet Command
      cmd.CommandText = "SELECT * FROM MA_TABLE"
      cmd.ActiveConnection = mobjCon 'attribut de classe

      'Exécution de la requête
      Set rst = cmd.Execute

      rst.MoveLast 'renvoi l'erreur "L'ensemble des lignes ne prend pas en charge les récupérations arrière"

      rst.RecordCount 'renvoi toujours -1

      Visiblement le problème viendrait du parametrage du recordset.
      certains recordset n'acceptent pas cette méthode
      d'ou ma question comment avoir le bon recordset?

      merci d'avance
      1. Bonjour,

        J'aurai plutôt fait un rst.MoveLast avant le RecordCount et ensuite le MoveFirst.

        D'autre part, il faut remplacer le "+" de ta requête par "&". Le signe "+" est l'opérateur de l'addition et non de la concaténation. Il peut être mal interprété dans la requête.

        ;o)

        1. J'ai essayé ta technique avec le MoveLast auparavant mais j me suis pas attardé dessus car il me renvoie un message d'erreur : "L'ensemble des lignes ne prend pas en charge les récupérations arrière"...