PowerQuery - Changement de source via VBA uniquement (UserForm)

Bonjour,

Me voici confronté à un problème bien singulier,

Je souhaite automatiser la

modification d'une source de données (.CSV) sur laquelle se base une requête PowerQuery
et cela, sans aucune (ou très) peu d'action de l'utilisateur du fichier excel support (i.e ne pas aller dans données > changer souce PowerQuery etc.)
(l'utilisateur final ayant des compétences ultra limitées sur Excel)

Je souhaite réaliser cela en passant par un tableau excel nommé "Table1" qui je passerai en argument de la première ligne Source de powerquery
(déjà testé la méthode via le chemin d'accès remplacé par une variable dans la ligne source powerquery, cela ne fonctionne pas pour moi)

Aussi voilà mon plan

1 / Récupérer le chemin d'accès du CSV à mettre à jour - OK

2 / Importer le contenu du CSV dans une sheet "Import" - OK

3 / Convertir le contenu de la sheet "Import" (et donc du dernier CSV branché) en un tableu "Table1" -> Problème

4 / Donner en Input de powerquery la "Table1" et faire tourner les requêtes désirées

----------

Détail du problème

Le résultat de l'import du CSV stocké dans l'onglet "Import" a généré des liens "données externes" visibles dans l'onglet données > connexion

ici notamment on voit bien la connexion au CSV A pris comme exemple

image image

Le problème semble venir de ces connexions, maintenant avec l'enregistreur de macro j'insère un tableau sur le contenu de l'onglet "Import" en cochant "oui" quand on demande de supprimer les connexions actives

j'obtiens ceci :

Sub Macro1()
'
' Macro1 Macro
'
ActiveSheet.QueryTables("DonnéesExternes_28").Delete
ActiveSheet.QueryTables("DonnéesExternes_27").Delete
ActiveSheet.QueryTables("DonnéesExternes_24").Delete
ActiveSheet.QueryTables("DonnéesExternes_13").Delete
ActiveSheet.QueryTables("DonnéesExternes_19").Delete
ActiveSheet.QueryTables("DonnéesExternes_8").Delete
ActiveSheet.QueryTables("DonnéesExternes_17").Delete
ActiveSheet.QueryTables("DonnéesExternes_23").Delete
ActiveSheet.QueryTables("DonnéesExternes_15").Delete
ActiveSheet.QueryTables("DonnéesExternes_22").Delete
ActiveSheet.QueryTables("DonnéesExternes_7").Delete
ActiveSheet.QueryTables("DonnéesExternes_21").Delete
ActiveSheet.QueryTables("DonnéesExternes_26").Delete
ActiveSheet.QueryTables("DonnéesExternes_25").Delete
ActiveSheet.QueryTables("DonnéesExternes_10").Delete
ActiveSheet.QueryTables("DonnéesExternes_20").Delete
ActiveSheet.ListObjects.Add(xlSrcRange, Range("$A$1:$C$4"), , xlNo).Name = _
"Tableau1"
Range("Tableau1[#All]").Select
End Sub

J'ai donc tenté de supprimer ces connexions directement dans mon code VBA pour pouvoir insérer ce fameux tableau "Table1" à l'aide d'une boucle Do while

        'Transformer en tableau l'import CSV
        Selection.CurrentRegion.Select
        Do While i < 1000
         i = i + 1
         Sheets("Import").QueryTables("DonnéesExternes_" & i).Delete
         On Error Resume Next
        Loop

Cela fonctionne sur le premier essai et l'objectif semble atteint, seulement quand on renouvelle l'opération on constate que les numéro "X" des lignes de codes nécessaires à la suppression des connexions varient de manière imprévisible
ActiveSheet.QueryTables("DonnéesExternes_X").Delete

Aussi me voila avec une nouvelle erreur en raison de cet indice X qui varie et que je souhaite supprimer à l'aveugle (via ma boucle do while), et le On error resume next ne me semble d'aucun secours pour y remédier

image image

-> Après recherches sur le net et sur les forums EN et FR, je ne retrouve aucun cas similaire au mien

-> Auriez-vous des pistes de solutions svp?

En PJ mon fichier source (aucune donnée confidentielle)

et un jeu de deux CSV pour l'exemple

Point d'attention, mon userform nécessite que les CSV se situent dans votre dossier "Téléchargements"

Merci par avance pour vos retours

15projet1.xlsm (39.37 Ko)
18csv-a.csv (52.00 Octets)
12csv-b.csv (91.00 Octets)

Bonjour,

Passer par une boucle FOR ne conviendrait-il pas mieux?

    For i = 1 To 1000
        On Error Resume Next
        Sheets("Import").QueryTables("DonnéesExternes_" & i).Delete
        If Err.Number <> 0 Then On Error GoTo 0
    Next i

Attention, pas testé, vu qu'avec ma version d'excel trop ancienne, je n'accède pas à POWER QUERY.

Cdlt

Bonjour à tous !

Je crains de n'avoir pas correctement appréhendé votre besoin....

Cependant, et sur la base de vos 2 fichiers CSV, je vous propose d'étudier le classeur joint. Il opérè simplement le chargement dans Power Query du fichier CSV dont le chemin est fourni.
Libre à vous d'enrichir ensuite la requête selon vos souhaits.

Bonjour à tous, merci pour vos retours,

@Arturo83 je vais tester cela (semble fonctionner sur mon pc!) mais reste à passer l'épreuve d'un test sur un pc d'un autre user -

@JFL, merci mais comme précisé au début du post, je ne souhaite pas passer par le chemin du CSV pour des raisons techniques (confidentialité des données partagées) je souhaite trouver une autre méthode - d'où la proposition de passer par un tableau excel

je vous tiens informé si c'est bien résolu via la boucle for au lieu du do while (je n'ai pas bien compris la subtilité)

Bien à vous,

Cdt

Bonjour,
Lien à consulter !?
A te relire.
Cdlt.

Exemple

Si quelqu'un peut me confirmer que le fichier fonctionne bien de son côté avec les CSV tests en PJ

-> L'étape de création de table semble résolue !

-> Dernier point bloquant sur la mise à jour de la requête PowerQuery "Main" via la ligne de code

J'ai pour ma part une erreur sur la màj de la requête (seule et non refresh all que je souhaite éviter)

ThisWorkbook.Connections("Requête - Main").Refresh"
image

En PJ la dernière version à tester

21projet1-rev1.xlsm (43.14 Ko)
Rechercher des sujets similaires à "powerquery changement source via vba uniquement userform"