Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Automatiser Microsoft Query

2 réponses
Avatar
Cyrille
Bonjour,
J'ai cr=E9e un fichier Excel avec plrs feuilles et plusieurs=20
plages nom=E9es. Ce classeur va me servir de Base de=20
donn=E9es. A partir d'un autre classeur, je veux interroger=20
le premier. Dans un premier temps, j'ai cr=E9e une=20
requ=EAte "de base" dans Microsoft Query (elle s'appelle=20
ReqPrelim"). Cette requ=EAte est constitu=E9e de certaines des=20
plages nomm=E9es (qui deviennent donc des tables), ces=20
plages =E9tant alors li=E9es entre elles (comme dans une bd=20
relationnelle). La requ=EAte marche impec. L'=E9tape suivante=20
est donc pour moi de pouvoir declencher la requ=EAte a=20
partir du second classeur Excel. La methode suivante est=20
une bonne approche :=20

With ActiveSheet.QueryTables.Add(Connection:=3D _
"FINDER;C:\....\ReqPrelim.dqy" _
, Destination:=3DRange("A1"))
.Name =3D "ReqPrelim"
.FieldNames =3D True
.RowNumbers =3D False
.FillAdjacentFormulas =3D False
.PreserveFormatting =3D True
.RefreshOnFileOpen =3D False
.BackgroundQuery =3D True
.RefreshStyle =3D xlInsertDeleteCells
.SavePassword =3D True
.SaveData =3D True
.AdjustColumnWidth =3D True
.RefreshPeriod =3D 0
.PreserveColumnInfo =3D True
.Refresh BackgroundQuery:=3DFalse
End With

Mais elle ne me satisfait pas enti=E8rement puisque je dois=20
executer cette requ=EAte selon des crit=E8res qui seront=20
variables (et qui seront saisi dans le classeur excel par=20
l'utilisateur).

En r=E9sum=E9 : mon probl=E8me est de construire un code me=20
permettant de d=E9clencher la requ=EAte tout en integrant le=20
ou les crit=E8res. Il faut donc que j'int=E8gre =E0 mon code la=20
Chaine SQL.

Avez-vous une id=E9e??
Merci d'avance

Cyrille

2 réponses

Avatar
michdenis
Bonsoir Cyrille,

Voici un exemple comment faire... le type de critère pour les fins de l'exemple est "Date", mais, tu peux réaliser ceci
sur n'importe quel champ de ta requête.

Je suppose que tu as défini une requête paramétrée dans query. Pour ce faire, directement dans la fenêtre "Query", tu
utilises les crochets droits et tu insères un petit texte significatif pour l'usager pour définir les paramètres de ta
requête. Les symboles ">" et "<" sert à déterminer l'intervalle entre les dates choisies.

Exemple :

Dans la fenêtre "Critères"

NomDuChamp : Date
critère : >[Date de début] Et <[Date de fin]


Tu retournes le résultat de la requête dans une feuille de ton classeur.

Avec un clic droit sur la plage de résultat, dans le menu déroulant , choisi : "Paramètre"

Dans la fenêtre qui s'ouvre : Tu sélectionnes dans la partie gauche de la fenêtre : " Date de début" et tu sélectionne
le bouton radio :"Obtenir la valeur de la cellule suivante" : Tu indiques la cellule devant servir pour ce critère. Et
pour finir, Tu coches le bouton radio si tu veux qu'excel actualise les données dès que tu modifieras le contenu de
cette cellule
(date de début) . Maintenant il te reste à faire la même chose concernant "Date de fin" . Voilà.

Si tu voulais obtenir le même résultat à partir d'une macro qui servirait à actualiser ton "querytable", tu pourrais
t'inspirer de ceci. À copier dans la feuille module où l'action se déroule :

'----------------------------------
Private Sub Worksheet_Change(ByVal Target As Range)

'il est pris pour acquis que G1, G2 contiennent des dates
'ET
'G1 est plus petit que G2 ... tu peux ajouter une gestion
'd'erreur le cas échéant....! ( pas défini ici ! )

If Target.Address = [G1].Address Or _
Target.Address = [G2].Address Then
'En supposant que ton QueryTable se situe
'sur la feuille "Feuil1"
'Plage de critère de tes dates :
'Date de début : "Feuil1!G1"
'Date de Fin : "Feuil1!G2"

Dim P1 As Parameter
Dim P2 As Parameter

'utilise l'index ou le nom de la requête
With Worksheets("Feuil1").QueryTables(1)
Set P1 = .Parameters(1)
Set P2 = .Parameters(2)
P1.SetParam xlRange, Range("Feuil1!G1")
P2.SetParam xlRange, Range("Feuil1!G2")
.Refresh False
End With
End If

End Sub
'----------------------------------



Salutations!



"Cyrille" a écrit dans le message de
news:912901c4336c$1cf4db30$
Bonjour,
J'ai crée un fichier Excel avec plrs feuilles et plusieurs
plages nomées. Ce classeur va me servir de Base de
données. A partir d'un autre classeur, je veux interroger
le premier. Dans un premier temps, j'ai crée une
requête "de base" dans Microsoft Query (elle s'appelle
ReqPrelim"). Cette requête est constituée de certaines des
plages nommées (qui deviennent donc des tables), ces
plages étant alors liées entre elles (comme dans une bd
relationnelle). La requête marche impec. L'étape suivante
est donc pour moi de pouvoir declencher la requête a
partir du second classeur Excel. La methode suivante est
une bonne approche :

With ActiveSheet.QueryTables.Add(Connection:= _
"FINDER;C:....ReqPrelim.dqy" _
, Destination:=Range("A1"))
.Name = "ReqPrelim"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = True
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.Refresh BackgroundQuery:úlse
End With

Mais elle ne me satisfait pas entièrement puisque je dois
executer cette requête selon des critères qui seront
variables (et qui seront saisi dans le classeur excel par
l'utilisateur).

En résumé : mon problème est de construire un code me
permettant de déclencher la requête tout en integrant le
ou les critères. Il faut donc que j'intègre à mon code la
Chaine SQL.

Avez-vous une idée??
Merci d'avance

Cyrille
Avatar
Ok compris,
merci beaucoup pour ton aide :)
A+
-----Message d'origine-----
Bonsoir Cyrille,

Voici un exemple comment faire... le type de critère pour
les fins de l'exemple est "Date", mais, tu peux réaliser

ceci
sur n'importe quel champ de ta requête.

Je suppose que tu as défini une requête paramétrée dans
query. Pour ce faire, directement dans la fenêtre "Query",

tu
utilises les crochets droits et tu insères un petit texte
significatif pour l'usager pour définir les paramètres de

ta
requête. Les symboles ">" et "<" sert à déterminer
l'intervalle entre les dates choisies.


Exemple :

Dans la fenêtre "Critères"

NomDuChamp : Date
critère : >[Date de début] Et <[Date de
fin]



Tu retournes le résultat de la requête dans une feuille
de ton classeur.


Avec un clic droit sur la plage de résultat, dans le menu
déroulant , choisi : "Paramètre"


Dans la fenêtre qui s'ouvre : Tu sélectionnes dans la
partie gauche de la fenêtre : " Date de début" et tu

sélectionne
le bouton radio :"Obtenir la valeur de la cellule
suivante" : Tu indiques la cellule devant servir pour ce

critère. Et
pour finir, Tu coches le bouton radio si tu veux qu'excel
actualise les données dès que tu modifieras le contenu de

cette cellule
(date de début) . Maintenant il te reste à faire la même
chose concernant "Date de fin" . Voilà.


Si tu voulais obtenir le même résultat à partir d'une
macro qui servirait à actualiser ton "querytable", tu

pourrais
t'inspirer de ceci. À copier dans la feuille module où
l'action se déroule :


'----------------------------------
Private Sub Worksheet_Change(ByVal Target As Range)

'il est pris pour acquis que G1, G2 contiennent des dates
'ET
'G1 est plus petit que G2 ... tu peux ajouter une gestion
'd'erreur le cas échéant....! ( pas défini ici ! )

If Target.Address = [G1].Address Or _
Target.Address = [G2].Address Then
'En supposant que ton QueryTable se situe
'sur la feuille "Feuil1"
'Plage de critère de tes dates :
'Date de début : "Feuil1!G1"
'Date de Fin : "Feuil1!G2"

Dim P1 As Parameter
Dim P2 As Parameter

'utilise l'index ou le nom de la requête
With Worksheets("Feuil1").QueryTables(1)
Set P1 = .Parameters(1)
Set P2 = .Parameters(2)
P1.SetParam xlRange, Range("Feuil1!G1")
P2.SetParam xlRange, Range("Feuil1!G2")
.Refresh False
End With
End If

End Sub
'----------------------------------



Salutations!



"Cyrille" a écrit
dans le message de

news:912901c4336c$1cf4db30$
Bonjour,
J'ai crée un fichier Excel avec plrs feuilles et plusieurs
plages nomées. Ce classeur va me servir de Base de
données. A partir d'un autre classeur, je veux interroger
le premier. Dans un premier temps, j'ai crée une
requête "de base" dans Microsoft Query (elle s'appelle
ReqPrelim"). Cette requête est constituée de certaines des
plages nommées (qui deviennent donc des tables), ces
plages étant alors liées entre elles (comme dans une bd
relationnelle). La requête marche impec. L'étape suivante
est donc pour moi de pouvoir declencher la requête a
partir du second classeur Excel. La methode suivante est
une bonne approche :

With ActiveSheet.QueryTables.Add(Connection:= _
"FINDER;C:....ReqPrelim.dqy" _
, Destination:=Range("A1"))
.Name = "ReqPrelim"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = True
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.Refresh BackgroundQuery:úlse
End With

Mais elle ne me satisfait pas entièrement puisque je dois
executer cette requête selon des critères qui seront
variables (et qui seront saisi dans le classeur excel par
l'utilisateur).

En résumé : mon problème est de construire un code me
permettant de déclencher la requête tout en integrant le
ou les critères. Il faut donc que j'intègre à mon code la
Chaine SQL.

Avez-vous une idée??
Merci d'avance

Cyrille


.