Extraction M-Code d´un classeur
Bonjour,
J´ai un classeur Excel comportant plus de 30 requêtes Power Query.
Je cherche une solution pour exporter tous les M-Code de ces requêtes vers un autre classeur Excel, Word ou autre..
L´intérêt ici est bien entendu d´éviter l´étape bien fastidieuse du 30 fois copier-coller depuis l´éditeur de code Power Query
Connaissez-vous une solution ?
Merci d´avance
JW
Bonsoir à tous !
J´ai un classeur Excel comportant plus de 30 requêtes Power Query.
Je cherche une solution pour exporter tous les M-Code de ces requêtes vers un autre classeur Excel, Word ou autre..
L´intérêt ici est bien entendu d´éviter l´étape bien fastidieuse du 30 fois copier-coller depuis l´éditeur de code Power Query
30 fois le copier-coller ?
Une seule opération est suffisante : Sélection des 30 requêtes...... copier...... coller.
Bonjour à tous,
Je plussoie la proposition de @JFL, le plus pratique pour c/c d'un classeur à un autre.
Je me permets de joindre une petite alternative VBA que j'utilise pour sauvegarder mes queries dans des fichiers txt (extension en .pq) afin de pouvoir les ouvrir dans VSCode. J'utilise beaucoup l'IA sur PowerQuery et avoir un backup de ma version précédente est utile avant de "tout remplacer".
Public Sub ExportAllQueriesToText()
Dim saveDir As String: saveDir = ThisWorkbook.path ' if_error_52: = using onedrive : "put_your_full_path_here_instead"
If Len(saveDir) = 0 Then Err.Raise vbObjectError + 513, , "Save the workbook first."
Dim fso As Object: Set fso = CreateObject("Scripting.FileSystemObject")
If Not fso.FolderExists(saveDir) Then fso.CreateFolder saveDir
Dim q As Object, count As Long
For Each q In ThisWorkbook.Queries
Dim filePath As String: filePath = fso.BuildPath(saveDir, q.Name & ".pq")
WriteUtf8Text filePath, CStr(q.Formula)
count = count + 1
Next
MsgBox "Export complete: " & count & " file(s) saved to:" & vbCrLf & saveDir, vbInformation
End Sub
Private Sub WriteUtf8Text(ByVal path As String, ByVal content As String)
Dim stm As Object: Set stm = CreateObject("ADODB.Stream")
With stm
.Type = 2
.Charset = "utf-8"
.Open
.WriteText content, 0
.Position = 0
.SaveToFile path, 2
.Close
End With
End SubBonjour JFL, saboh12617,
Merci pour vos messages :)
JFL, en fait je ne souhaite pas reprendre les 30 requêtes dans un nouveau classeur, je souhaite reprendre le M-Code de ces 30 requêtes dans un nouveau classeur.
A part aller individuellement dans l´éditeur de chaque requête et faire du copier coller, je ne vois pas comment faire..
saboh12617, ton code VBA va dans ce sens :) merci pour ta contribution, je vais m´en inspirer pour d´autres échéances
J´ai mis un cas exemple en PJ de ce que je souhaite obtenir sans copier-coller
Je suis preneur de toute solution simple et rapide
Cordialement
JW
Mais heu excusez-moi, pourquoi vous souhaitez mettre le code dans des cellules ?
C'est sujet à erreurs avec l'autocorrection ou ces choses-là…
Vous faites un tutoriel peut-être ?
J´aurais peut-être du préciser, je cherche à mettre tout le code dans un espace de travail qui comporte une fonctionnalité "Rechercher/Remplacer" comme on trouve dans un classeur excel/word.
La raison sous jacente est que j´ai beaucoup d´en-têtes de colonnes à modifier et ces en-têtes se retrouvent dans la plupart des cas dans plusieurs requêtes différentes donc dont le M-Code est cloisonné par requête dans Power Query
Je ne sais si j´exprime correctement mon cas de figure.
Redites moi
Ah d'accord, dans ce cas voici la macro légèrement modifiée pour exporter dans un fichier unique toutes les queries au lieu de 1 fichier/query.
Je vous conseille d'utiliser ensuite un Editeur (avancé) de texte comme Notepad++ ou VSCode pour rechercher-remplacer (ctrl+H) vos données. FAITES ATTENTION : je pense qu'il est important que vous incluiez les guillements "colonneX" dans votre recherche car sinon vous risquez de modifier des étapes du code.
Public Sub ExportAllQueriesToSingleText()
Dim saveDir As String
saveDir = ThisWorkbook.path ' si erreur 52 (OneDrive), utiliser un chemin fixe
If Len(saveDir) = 0 Then
Err.Raise vbObjectError + 513, , "Enregistrez d'abord le classeur."
End If
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
If Not fso.FolderExists(saveDir) Then
fso.CreateFolder saveDir
End If
Dim fileName As String
fileName = "QUERY_" & Format(Now, "yyyy.mm.dd-hh.mm.ss") & ".pq"
Dim filePath As String
filePath = fso.BuildPath(saveDir, fileName)
Dim q As Object
Dim count As Long
Dim buf As String
' Concaténation de toutes les queries
For Each q In ThisWorkbook.Queries
count = count + 1
' Séparateur
buf = buf & "////////////////////////////// " & q.Name & " //////////////////////////////" & vbCrLf & vbCrLf
buf = buf & CStr(q.Formula) & vbCrLf & vbCrLf
Next
If count = 0 Then
MsgBox "Aucune query à exporter.", vbInformation
Exit Sub
End If
' Écriture unique du fichier
WriteUtf8Text filePath, buf
MsgBox "Export terminé : " & count & " requête(s) combinée(s) dans :" & vbCrLf & filePath, vbInformation
End Sub
Private Sub WriteUtf8Text(ByVal path As String, ByVal content As String)
With CreateObject("ADODB.Stream")
.Type = 2 ' adTypeText
.Charset = "utf-8" ' Encodage UTF-8
.Open
.WriteText content, 0 ' adWriteLine=1, ici 0 = adWriteChar
.Position = 0
.SaveToFile path, 2 ' adSaveCreateOverWrite
.Close
End With
End SubHello,
J'utilise souvent powerbi, il me semble que powerquery est sensiblement identique avec celui d'excel.
Dans powerquery excel tu devrais être en mesure de remplacer ta requête par une fonction et d'y insérer des paramètres. Paramètre = variable
Avec les paramètres plus besoin de faire des remplacements, ça devient dynamique. En espérant avoir répondu à ton problème...
Paul
Bonjour à tous,
La solution était toute simple en fait, il suffisait de faire un copier de toutes les requêtes dans le panneau latéral du classeur Excel et de coller dans un éditeur type Notepad.
Navré mais je ne savais pas ca, on en apprend tous les jours finalement..
Merci beaucoup pour votre aide et vos contributions et encore désolé d'avoir ignorer cette opération simplissime
Bonne journée la communauté !
Bonjour,
Bonjour à tous,
La solution était toute simple en fait, il suffisait de faire un copier de toutes les requêtes dans le panneau latéral du classeur Excel et de coller dans un éditeur type Notepad.
Navré mais je ne savais pas ca, on en apprend tous les jours finalement..
Merci beaucoup pour votre aide et vos contributions et encore désolé d'avoir ignorer cette opération simplissime
Bonne journée la communauté !
Merci pour cette information, je ne la connaissais pas. Et effectivement, bon fonctionnement.
Merci