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

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

Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
18
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²
Messages postés
10
Date d'inscription
samedi 24 novembre 2007
Statut
Membre
Dernière intervention
26 novembre 2007

Merci pour votre aide
Messages postés
10
Date d'inscription
samedi 24 novembre 2007
Statut
Membre
Dernière intervention
26 novembre 2007

Dsl pour le flood, mais comment édite t'on nos messages ? merci
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
18
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²
Messages postés
10
Date d'inscription
samedi 24 novembre 2007
Statut
Membre
Dernière intervention
26 novembre 2007

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

et aussi, existe t'il un CountIF avec plusieurs conditions ?
Peut on les imbriquer comme les IF ?
Messages postés
10
Date d'inscription
samedi 24 novembre 2007
Statut
Membre
Dernière intervention
26 novembre 2007

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.
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
18
Pour plusieurs conditions, regarde du côté de SOMMEPROD ou SUMPRODUCT pour les formules anglaises.

MPi²
Messages postés
10
Date d'inscription
samedi 24 novembre 2007
Statut
Membre
Dernière intervention
26 novembre 2007

ouaip, j'ai vu ca, j'ai réussi à faire 2 conditions mais pas 3 ou 4
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
18
=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²
Messages postés
10
Date d'inscription
samedi 24 novembre 2007
Statut
Membre
Dernière intervention
26 novembre 2007

Que veux tu dire par "zone de somme" ?

merci
Messages postés
10
Date d'inscription
samedi 24 novembre 2007
Statut
Membre
Dernière intervention
26 novembre 2007

<hr />
Merci beaucoup pour ton aide, c'est parfait
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
18
À utiliser avec modération, par contre...
C'est une fonction qui demande beaucoup de ressources au système...

MPi²
Messages postés
10
Date d'inscription
samedi 24 novembre 2007
Statut
Membre
Dernière intervention
26 novembre 2007

ca m'a l'air le plus simple possible pour ce que je souhaite faire et moins lourd que des traitements faits "maison"