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

Messages postés
10
Date d'inscription
samedi 24 novembre 2007
Statut
Membre
Dernière intervention
26 novembre 2007
- - Dernière réponse : 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
Afficher la suite 

14 réponses

Meilleure réponse
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
15
3
Merci
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²

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 217 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_MPi
Messages postés
10
Date d'inscription
samedi 24 novembre 2007
Statut
Membre
Dernière intervention
26 novembre 2007
0
Merci
Merci pour votre aide
Commenter la réponse de VibiA
Messages postés
10
Date d'inscription
samedi 24 novembre 2007
Statut
Membre
Dernière intervention
26 novembre 2007
0
Merci
Dsl pour le flood, mais comment édite t'on nos messages ? merci
Commenter la réponse de VibiA
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
15
0
Merci
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²
Commenter la réponse de cs_MPi
Messages postés
10
Date d'inscription
samedi 24 novembre 2007
Statut
Membre
Dernière intervention
26 novembre 2007
0
Merci
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.
Commenter la réponse de VibiA
Messages postés
10
Date d'inscription
samedi 24 novembre 2007
Statut
Membre
Dernière intervention
26 novembre 2007
0
Merci
et aussi, existe t'il un CountIF avec plusieurs conditions ?
Peut on les imbriquer comme les IF ?
Commenter la réponse de VibiA
Messages postés
10
Date d'inscription
samedi 24 novembre 2007
Statut
Membre
Dernière intervention
26 novembre 2007
0
Merci
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.
Commenter la réponse de VibiA
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
15
0
Merci
Pour plusieurs conditions, regarde du côté de SOMMEPROD ou SUMPRODUCT pour les formules anglaises.

MPi²
Commenter la réponse de cs_MPi
Messages postés
10
Date d'inscription
samedi 24 novembre 2007
Statut
Membre
Dernière intervention
26 novembre 2007
0
Merci
ouaip, j'ai vu ca, j'ai réussi à faire 2 conditions mais pas 3 ou 4
Commenter la réponse de VibiA
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
15
0
Merci
=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²
Commenter la réponse de cs_MPi
Messages postés
10
Date d'inscription
samedi 24 novembre 2007
Statut
Membre
Dernière intervention
26 novembre 2007
0
Merci
Que veux tu dire par "zone de somme" ?

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

MPi²
Commenter la réponse de cs_MPi
Messages postés
10
Date d'inscription
samedi 24 novembre 2007
Statut
Membre
Dernière intervention
26 novembre 2007
0
Merci
ca m'a l'air le plus simple possible pour ce que je souhaite faire et moins lourd que des traitements faits "maison"
Commenter la réponse de VibiA