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

Résolu/Fermé
eXqO Messages postés 49 Date d'inscription vendredi 25 avril 2008 Statut Membre Dernière intervention 26 septembre 2009 - 2 juil. 2009 à 09:31
 parpins - 17 juil. 2009 à 11:30
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.

5 réponses

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
eXqO Messages postés 49 Date d'inscription vendredi 25 avril 2008 Statut Membre Dernière intervention 26 septembre 2009 2
2 juil. 2009 à 10:38
Up !
0
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
2 juil. 2009 à 11:19
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)

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
eXqO Messages postés 49 Date d'inscription vendredi 25 avril 2008 Statut Membre Dernière intervention 26 septembre 2009 2
2 juil. 2009 à 11:42
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"...
0