VBA - SQL - Récupérer une requête dans une variable

Résolu
VibiA Messages postés 10 Date d'inscription samedi 24 novembre 2007 Statut Membre Dernière intervention 26 novembre 2007 - 24 nov. 2007 à 12:46
VibiA Messages postés 10 Date d'inscription samedi 24 novembre 2007 Statut Membre Dernière intervention 26 novembre 2007 - 26 nov. 2007 à 21:04
Bonjour à tous,

J'ai découvert depuis peu de temps qu'il était possible de générer des requêtes SQL directement via Excel, via MS Query plus précisément.

Je sais que ce n'est pas aussi puissant qu'Acces ou que MySql qui sont de 'vraies' BDD mais je n'ai que cela sous la main.

Mon problème est certainement très simple, je cherche simplement à récupérer le résultat de ma requête dans une variable et non la renvoyer directement sur Excel.

Je n'utilise que le 'Count' donc ce résultat n'est qu'une valeur.

Ex de code que je dois modifier (code provenant du mode enregistrement d'Excel)

    With ActiveSheet.QueryTables.Add(Connection:=Array(Array( _
        "ODBC;DBQ=C:\Documents and Settings\jbw\Bureau\sql test\Classeur1.xls;DefaultDir=C:\Documents and Settings\jbw\Bureau\sql test;Driver" _
        ), Array( _
        "={Driver do Microsoft Excel(*.xls)};DriverId=790;FIL=excel 8.0;MaxBufferSize=2048;MaxScanRows=8;PageTimeout=5;ReadOnly=1;SafeTr" _
        ), Array("ansactions=0;Threads=3;UID=admin;UserCommitSync=Yes;")), Destination _
        :=Range("G8"))
        .CommandText = Array( _
         "SELECT Count(AAA1.ColA)" & Chr(13) & "" & Chr(10) & "FROM `C:\Documents and Settings\jbw\Bureau\sql test\Classeur1`.AAA1 AAA1, `C:\Documents and Settings\jbw\Bureau\sql test\Classeur1`.ZZZ1 ZZZ1" & Chr(13) & "" & Chr(10) & "WHERE AAA1.ColA = ZZZ1.ColB" _
        )
        .Name = "Lancer la requête à partir de aaaaaaaaaaaaaaaaaaaa"
        .FieldNames = False
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .PreserveColumnInfo = True
        .Refresh BackgroundQuery:=False
    End With

14 réponses

cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
25 nov. 2007 à 18:26
Voici un exemple:
En A, il y a des noms
En B, il y a des prénoms
En C, il y a des pays
En D, il y a des valeurs à additionner ("zone de somme" ou zone à additionner)

SOMMEPROD((A2:A100"Gates")*(B2:B100="Bill")*(C2:C100="USA")*(D2:D100))

Ça te donnera la somme de la colonne D pour tous les Bill Gates des USA
Remarque les zones qui vont de 2 à 100. Ces zones doivent toutes être équivalentes.

MPi²
3
VibiA Messages postés 10 Date d'inscription samedi 24 novembre 2007 Statut Membre Dernière intervention 26 novembre 2007
24 nov. 2007 à 12:48
Merci pour votre aide
0
VibiA Messages postés 10 Date d'inscription samedi 24 novembre 2007 Statut Membre Dernière intervention 26 novembre 2007
24 nov. 2007 à 12:50
Dsl pour le flood, mais comment édite t'on nos messages ? merci
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
24 nov. 2007 à 14:36
Pourquoi ne pas utiliser les fonctions Excel plutôt que de te compliquer la vie avec MsQuery ?

ex:
    Dim nbValeurs As Long

    ' nombre de fois que le chiffre 2 apparaît en colonne A
    nbValeurs = [COUNTIF(A:A, "2")]  ' équivaut à NB.SI
    MsgBox nbValeurs

MPi²
0

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

Posez votre question
VibiA Messages postés 10 Date d'inscription samedi 24 novembre 2007 Statut Membre Dernière intervention 26 novembre 2007
24 nov. 2007 à 15:19
Je ne peux pas car en fait je cherche un équivalent du VLOOKUP, je souhaite comparer 2 fichiers, d'un jour sur l'autre savoir combien de lignes ont apparu et/ou disparu (sachant que je compare seulement 2 colonnes car j'ai une colonne avec des entrées uniques).

Donc avec un vlookup, je le fais sans problème mais c'est long (les 2 fichiers font plus de 50k lignes), donc j'ai pensé qu'une requête SQL 'count' ferait l'affaire beaucoup plus rapidement.
0
VibiA Messages postés 10 Date d'inscription samedi 24 novembre 2007 Statut Membre Dernière intervention 26 novembre 2007
24 nov. 2007 à 15:32
et aussi, existe t'il un CountIF avec plusieurs conditions ?
Peut on les imbriquer comme les IF ?
0
VibiA Messages postés 10 Date d'inscription samedi 24 novembre 2007 Statut Membre Dernière intervention 26 novembre 2007
24 nov. 2007 à 17:06
Finalement, je me rends compte que c'est inutile, car je peux réécrire par dessus, donc ni vu ni connu

mais par contre, le countif avec plusieurs conditions, ca m'interesserait de savoir car je me suis mis au SQL juste parce que le countif (ou sumif) ne gère (selon moi) qu'une condition.
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
24 nov. 2007 à 18:48
Pour plusieurs conditions, regarde du côté de SOMMEPROD ou SUMPRODUCT pour les formules anglaises.

MPi²
0
VibiA Messages postés 10 Date d'inscription samedi 24 novembre 2007 Statut Membre Dernière intervention 26 novembre 2007
24 nov. 2007 à 19:56
ouaip, j'ai vu ca, j'ai réussi à faire 2 conditions mais pas 3 ou 4
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
25 nov. 2007 à 02:02
=SOMMEPROD((1ere condition)*(2e condition)*(3e condition)*(zone de somme))

L'important , c'est que les plages de chaque condition et de la somme soient de même grandeur.

MPi²
0
VibiA Messages postés 10 Date d'inscription samedi 24 novembre 2007 Statut Membre Dernière intervention 26 novembre 2007
25 nov. 2007 à 17:47
Que veux tu dire par "zone de somme" ?

merci
0
VibiA Messages postés 10 Date d'inscription samedi 24 novembre 2007 Statut Membre Dernière intervention 26 novembre 2007
26 nov. 2007 à 09:38
<hr />
Merci beaucoup pour ton aide, c'est parfait
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
26 nov. 2007 à 11:26
À utiliser avec modération, par contre...
C'est une fonction qui demande beaucoup de ressources au système...

MPi²
0
VibiA Messages postés 10 Date d'inscription samedi 24 novembre 2007 Statut Membre Dernière intervention 26 novembre 2007
26 nov. 2007 à 21:04
ca m'a l'air le plus simple possible pour ce que je souhaite faire et moins lourd que des traitements faits "maison"
0
Rejoignez-nous