OVH Cloud OVH Cloud

Acquerir et rafraichir une table via le web ?

5 réponses
Avatar
Seb...
Bonjour,

J'uilise une macro pour acquerir une table du web.
Cette macro marche impec sauf que, lorsque je desire
réxecuter cette macro ma plage de données et agrandi
de la nouvelle plage, et non pas seulement rafraichit.

Pourtant dans le script, j'ai l option .Refresh Ou ai je faux ?

merci,
seb .


Set shProd = ThisWorkbook.Worksheets("production")
' Modifier le chemin ci dessous, pour acceder à la requete issue de la base
de données
' Essai avec un fichier afin de ne pas perturber le serveur.
Set oProdResults = shProd.QueryTables _
.Add(Connection:="URL;E:\Documents\##Macro - fichier
production\sqlquery1.htm", _
Destination:=shProd.Cells(2, 1))

With oProdResults
.WebFormatting = xlNone
.WebSelectionType = xlSpecifiedTables
.WebTables = "1,2"
'Ajuste la largeur des colonnes aux nouvelles données
.AdjustColumnWidth = True
.Refresh
.FieldNames = True
' la variable rProdResults contient la plage des données
.ResultRange = rProdResults
EndWith

5 réponses

Avatar
Seb...
En fait il semblerait que cette procedure crée la requete QueryTable (ligne
Set .... =Query)
et ensuite affiche la table dans la feuille avec .Refresh.

Le fait d executer .Refresh par la suite rafraichi les données comme je le
souhaite.

Question : Comment tester l existence de ma requete QueryTable afin de ne
pas la recréer ?

Si oProdResults existe alors oProdResults.Refresh
Sinon Set oProdResults =..... et oProdResults.Refresh.

Merci,

seb.


"Seb..." a écrit dans le message de
news:4014f28e$0$13235$

Set shProd = ThisWorkbook.Worksheets("production")
' Modifier le chemin ci dessous, pour acceder à la requete issue de la
base

de données
' Essai avec un fichier afin de ne pas perturber le serveur.
Set oProdResults = shProd.QueryTables _
.Add(Connection:="URL;E:Documents##Macro - fichier
productionsqlquery1.htm", _
Destination:=shProd.Cells(2, 1))

With oProdResults
.WebFormatting = xlNone
.WebSelectionType = xlSpecifiedTables
.WebTables = "1,2"
'Ajuste la largeur des colonnes aux nouvelles données
.AdjustColumnWidth = True
.Refresh
.FieldNames = True
' la variable rProdResults contient la plage des données
.ResultRange = rProdResults
EndWith




Avatar
michdenis
Bonjour Seb,

Lorsque tu crées un "Querytable", Excel crée un "Nom" ( barre des menus/insertion/nom) qui représente la plage de données
occupée par les données de la requête.

Et pour baptiser cette plage du nom que tu as choisi, ajoute cette ligne à ta procédure au moment de la création de ta
requête

With oProdResults
.Name = "Seb1"
.WebFormatting = xlNone
.WebSelectionType = xlSpecifiedTables
.WebTables = "1,2"
'/....

end with

Si tu vérifies que ce "Nom" existe, cela signifie que la requête de ta querytable existe. Si tu détruis ce "nom" il te sera
impossible de rafraîchir les données obtenues de ta requête.. le lien n'existant plus.

Et pour vérifier l'existence d'un plage nommée : (il y a aussi d'autre méthode par la gestion d'erreur)

Dim Rg as Range
set Rg =range("NomDeLaRequête)

If rg is nothing = True then
Msgbox "La requête n'existe pas"
else
Msgbox "La requête existe"
end if


Est-ce que cela répond à tes attentes ?


Salutations!


"Seb..." a écrit dans le message de news:401515b1$0$13234$
En fait il semblerait que cette procedure crée la requete QueryTable (ligne
Set .... =Query)
et ensuite affiche la table dans la feuille avec .Refresh.

Le fait d executer .Refresh par la suite rafraichi les données comme je le
souhaite.

Question : Comment tester l existence de ma requete QueryTable afin de ne
pas la recréer ?

Si oProdResults existe alors oProdResults.Refresh
Sinon Set oProdResults =..... et oProdResults.Refresh.

Merci,

seb.


"Seb..." a écrit dans le message de
news:4014f28e$0$13235$

Set shProd = ThisWorkbook.Worksheets("production")
' Modifier le chemin ci dessous, pour acceder à la requete issue de la
base

de données
' Essai avec un fichier afin de ne pas perturber le serveur.
Set oProdResults = shProd.QueryTables _
.Add(Connection:="URL;E:Documents##Macro - fichier
productionsqlquery1.htm", _
Destination:=shProd.Cells(2, 1))

With oProdResults
.WebFormatting = xlNone
.WebSelectionType = xlSpecifiedTables
.WebTables = "1,2"
'Ajuste la largeur des colonnes aux nouvelles données
.AdjustColumnWidth = True
.Refresh
.FieldNames = True
' la variable rProdResults contient la plage des données
.ResultRange = rProdResults
EndWith




Avatar
Seb...
Bonjour ,

L idée est là, mais je viens de tester et j ai une erreur 1004.
Le classeur vient d etre ouvert, la macro pas encore executée,
et la plage des valeurs importés existe ( plage ou nom de requete).

J ai essayé de modifié ton code en mettant If Range("nomrequete") is nothing
...
mais marche pas non plus.

J ai essayé :
oProdResult est ma querytable.
If oProdResult is nothing (erreur 424)
If oProdResult.Name is nothing (erreur 1004).

Je vois pas comment faire.

Merci pour ton aide,

Seb.

"michdenis" a écrit dans le message de
news:
Bonjour Seb,

Lorsque tu crées un "Querytable", Excel crée un "Nom" ( barre des
menus/insertion/nom) qui représente la plage de données

occupée par les données de la requête.

Et pour baptiser cette plage du nom que tu as choisi, ajoute cette ligne à
ta procédure au moment de la création de ta

requête

With oProdResults
.Name = "Seb1"
.WebFormatting = xlNone
.WebSelectionType = xlSpecifiedTables
.WebTables = "1,2"
'/....

end with

Si tu vérifies que ce "Nom" existe, cela signifie que la requête de ta
querytable existe. Si tu détruis ce "nom" il te sera

impossible de rafraîchir les données obtenues de ta requête.. le lien
n'existant plus.


Et pour vérifier l'existence d'un plage nommée : (il y a aussi d'autre
méthode par la gestion d'erreur)


Dim Rg as Range
set Rg =range("NomDeLaRequête)

If rg is nothing = True then
Msgbox "La requête n'existe pas"
else
Msgbox "La requête existe"
end if


Est-ce que cela répond à tes attentes ?


Salutations!


"Seb..." a écrit dans le message de
news:401515b1$0$13234$

En fait il semblerait que cette procedure crée la requete QueryTable
(ligne

Set .... =Query)
et ensuite affiche la table dans la feuille avec .Refresh.

Le fait d executer .Refresh par la suite rafraichi les données comme je le
souhaite.

Question : Comment tester l existence de ma requete QueryTable afin de ne
pas la recréer ?

Si oProdResults existe alors oProdResults.Refresh
Sinon Set oProdResults =..... et oProdResults.Refresh.

Merci,

seb.


"Seb..." a écrit dans le message de
news:4014f28e$0$13235$

Set shProd = ThisWorkbook.Worksheets("production")
' Modifier le chemin ci dessous, pour acceder à la requete issue de la
base

de données
' Essai avec un fichier afin de ne pas perturber le serveur.
Set oProdResults = shProd.QueryTables _
.Add(Connection:="URL;E:Documents##Macro - fichier
productionsqlquery1.htm", _
Destination:=shProd.Cells(2, 1))

With oProdResults
.WebFormatting = xlNone
.WebSelectionType = xlSpecifiedTables
.WebTables = "1,2"
'Ajuste la largeur des colonnes aux nouvelles données
.AdjustColumnWidth = True
.Refresh
.FieldNames = True
' la variable rProdResults contient la plage des données
.ResultRange = rProdResults
EndWith









Avatar
isabelle
bonjour Seb,

Lors de l'enregistrement d'une macro qui comprend une requête, Excel
n'exécute pas la requête en arrière-plan. Pour modifier la macro
enregistrée afin qu'elle s'exécute en arrière-plan, remplacez la méthode
d'actualisation de l'objet QueryTable « BackgroundQuery := Faux » par «
BackgroundQuery := Vrai » dans Visual Basic Editor.

.Refresh BackgroundQuery:=True

isabelle


Bonjour ,

L idée est là, mais je viens de tester et j ai une erreur 1004.
Le classeur vient d etre ouvert, la macro pas encore executée,
et la plage des valeurs importés existe ( plage ou nom de requete).

J ai essayé de modifié ton code en mettant If Range("nomrequete") is nothing
...
mais marche pas non plus.

J ai essayé :
oProdResult est ma querytable.
If oProdResult is nothing (erreur 424)
If oProdResult.Name is nothing (erreur 1004).

Je vois pas comment faire.

Merci pour ton aide,

Seb.

"michdenis" a écrit dans le message de
news:
Bonjour Seb,

Lorsque tu crées un "Querytable", Excel crée un "Nom" ( barre des
menus/insertion/nom) qui représente la plage de données

occupée par les données de la requête.

Et pour baptiser cette plage du nom que tu as choisi, ajoute cette ligne à
ta procédure au moment de la création de ta

requête

With oProdResults
.Name = "Seb1"
.WebFormatting = xlNone
.WebSelectionType = xlSpecifiedTables
.WebTables = "1,2"
'/....

end with

Si tu vérifies que ce "Nom" existe, cela signifie que la requête de ta
querytable existe. Si tu détruis ce "nom" il te sera

impossible de rafraîchir les données obtenues de ta requête.. le lien
n'existant plus.


Et pour vérifier l'existence d'un plage nommée : (il y a aussi d'autre
méthode par la gestion d'erreur)


Dim Rg as Range
set Rg =range("NomDeLaRequête)

If rg is nothing = True then
Msgbox "La requête n'existe pas"
else
Msgbox "La requête existe"
end if


Est-ce que cela répond à tes attentes ?


Salutations!


"Seb..." a écrit dans le message de
news:401515b1$0$13234$

En fait il semblerait que cette procedure crée la requete QueryTable
(ligne

Set .... =Query)
et ensuite affiche la table dans la feuille avec .Refresh.

Le fait d executer .Refresh par la suite rafraichi les données comme je le
souhaite.

Question : Comment tester l existence de ma requete QueryTable afin de ne
pas la recréer ?

Si oProdResults existe alors oProdResults.Refresh
Sinon Set oProdResults =..... et oProdResults.Refresh.

Merci,

seb.


"Seb..." a écrit dans le message de
news:4014f28e$0$13235$

Set shProd = ThisWorkbook.Worksheets("production")
' Modifier le chemin ci dessous, pour acceder à la requete issue de la
base

de données
' Essai avec un fichier afin de ne pas perturber le serveur.
Set oProdResults = shProd.QueryTables _
.Add(Connection:="URL;E:Documents##Macro - fichier
productionsqlquery1.htm", _
Destination:=shProd.Cells(2, 1))

With oProdResults
.WebFormatting = xlNone
.WebSelectionType = xlSpecifiedTables
.WebTables = "1,2"
'Ajuste la largeur des colonnes aux nouvelles données
.AdjustColumnWidth = True
.Refresh
.FieldNames = True
' la variable rProdResults contient la plage des données
.ResultRange = rProdResults
EndWith











Avatar
michdenis
Bonjour Seb,

J'avoue avoir de la difficulté à suivre !

Si tu éditais l'ensemble de ta procédure ici et si tu indiquais la ligne de code où ta procédure bloque ?

Dans mon exemple : If Range("nomrequete") is nothing

Tu dois remplacer "nomrequete" par le vrai nom de ta querytable. Pour trouver ce nom, tu sélectionnes une cellule de la plage
de cellules représentant le résultat de la requête et tu exécutes un clic droit sur le bouton de la souris. Dans le menu
contextuel, tu exploites "Propriétés.."
de la requête... et tu trouveras le nom réel de ta requête. Maintenant si tu regardes dans la fenêtre ( barre des menus /
insertion / nom / définir) tu trouveras un "Nom"(plage nommées) de la même appellation de ta requête.

Dans la ligne de code : If Range("nomrequete") is nothing , C'est l'existence de cette plage nommée de cellules que tu
testes.

Espérons que c'est plus clair !


Salutations!



"Seb..." a écrit dans le message de news:401639e8$0$28716$
Bonjour ,

L idée est là, mais je viens de tester et j ai une erreur 1004.
Le classeur vient d etre ouvert, la macro pas encore executée,
et la plage des valeurs importés existe ( plage ou nom de requete).

J ai essayé de modifié ton code en mettant If Range("nomrequete") is nothing
...
mais marche pas non plus.

J ai essayé :
oProdResult est ma querytable.
If oProdResult is nothing (erreur 424)
If oProdResult.Name is nothing (erreur 1004).

Je vois pas comment faire.

Merci pour ton aide,

Seb.

"michdenis" a écrit dans le message de
news:
Bonjour Seb,

Lorsque tu crées un "Querytable", Excel crée un "Nom" ( barre des
menus/insertion/nom) qui représente la plage de données

occupée par les données de la requête.

Et pour baptiser cette plage du nom que tu as choisi, ajoute cette ligne à
ta procédure au moment de la création de ta

requête

With oProdResults
.Name = "Seb1"
.WebFormatting = xlNone
.WebSelectionType = xlSpecifiedTables
.WebTables = "1,2"
'/....

end with

Si tu vérifies que ce "Nom" existe, cela signifie que la requête de ta
querytable existe. Si tu détruis ce "nom" il te sera

impossible de rafraîchir les données obtenues de ta requête.. le lien
n'existant plus.


Et pour vérifier l'existence d'un plage nommée : (il y a aussi d'autre
méthode par la gestion d'erreur)


Dim Rg as Range
set Rg =range("NomDeLaRequête)

If rg is nothing = True then
Msgbox "La requête n'existe pas"
else
Msgbox "La requête existe"
end if


Est-ce que cela répond à tes attentes ?


Salutations!


"Seb..." a écrit dans le message de
news:401515b1$0$13234$

En fait il semblerait que cette procedure crée la requete QueryTable
(ligne

Set .... =Query)
et ensuite affiche la table dans la feuille avec .Refresh.

Le fait d executer .Refresh par la suite rafraichi les données comme je le
souhaite.

Question : Comment tester l existence de ma requete QueryTable afin de ne
pas la recréer ?

Si oProdResults existe alors oProdResults.Refresh
Sinon Set oProdResults =..... et oProdResults.Refresh.

Merci,

seb.


"Seb..." a écrit dans le message de
news:4014f28e$0$13235$

Set shProd = ThisWorkbook.Worksheets("production")
' Modifier le chemin ci dessous, pour acceder à la requete issue de la
base

de données
' Essai avec un fichier afin de ne pas perturber le serveur.
Set oProdResults = shProd.QueryTables _
.Add(Connection:="URL;E:Documents##Macro - fichier
productionsqlquery1.htm", _
Destination:=shProd.Cells(2, 1))

With oProdResults
.WebFormatting = xlNone
.WebSelectionType = xlSpecifiedTables
.WebTables = "1,2"
'Ajuste la largeur des colonnes aux nouvelles données
.AdjustColumnWidth = True
.Refresh
.FieldNames = True
' la variable rProdResults contient la plage des données
.ResultRange = rProdResults
EndWith