Bonjour Pierre, Merci pour ce tuto que j'ai utilisé sur un document Word. Cela m'a épargné de nombreuses lignes de code et en plus qui n'auraient pas été fiables à 100%. Amicalement.
Monsieur Fauconnier,Je vous remercie pour tout travail que vous êtes entrain partagé avec nous, vous êtes un expert,merci beaucoup🙂
Je vous remercie pour tout travail que vous êtes entrain partagé avec nous, vous êtes un expert,merci beaucoup🙂
Bonjour quelle différence entre le module xlTools et le module Tools ? Je n'ai pas bien saisi la subtilité. Merci
Attention qu'avec LAMBDA, les paramètres optionnels doivent être signalés par des ; 🙄🙄🙄 =DATE.JOURSEMDECALAGE( ; ; )
La formule pour un copier:coller: =LAMBDA(_Date;_Jour;_Decalage;LET(_DateCalcul;SI(ISOMITTED(_Date);AUJOURDHUI();_Date);_DateCalcul-JOURSEM(_DateCalcul;10+SI(ISOMITTED(_Jour);1;_Jour))+8+7*SI(ISOMITTED(_Decalage);0;_Decalage)))
Bonjour Pierre, Je viens de mettre en oeuvre ta solution 4, le chemin est directement le fichier qu'on choisit à partir d'une liste de validation. C'est suffisamment clair pour qu'un "has been" comme moi peut comprendre. Sans rancune...
Envoyé par g.rullier Bonjour, J'utilise l'ensemble de ton code depuis peu et je te remercie pour la mise à disposition. Seulement, je rencontre un problème avec le caractère 244 correspondant au ô. En effet, la méthode ChrW présente comme exception CharCode < -32768 ou > 65535 :roll: Connais tu un moyen de contourner ? Je te remercie pour ton retour. Gwen Bonjour, Il faudrait essayer avec l'API : ConvertUTF8ToString (ou inversement : ConvertStringToUTF8) Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667Private Const CP_UTF8 = 65001 Private Declare PtrSafe Function MultiByteToWideChar Lib "kernel32" (ByVal CodePage As Long, _ ByVal dwFlags As Long, ByVal lpMultiByteStr As LongPtr, _ ByVal cchMultiByte As Long, ByVal lpWideCharStr As LongPtr, _ ByVal cchWideChar As Long) As Long Private Declare PtrSafe Function WideCharToMultiByte Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, _ ByVal lpWideCharStr As LongPtr, ByVal cchWideChar As Long, _ ByVal lpMultiByteStr As LongPtr, ByVal cbMultiByte As Long, _ ByVal lpDefaultChar As Long, ByVal lpUsedDefaultChar As Long) As Long '------------------------------------------------------------------------------------------------ Public Function ConvertStringToUTF8(StrInput As String) As String '------------------------------------------------------------------------------------------------ Dim nBytes As Long, abBuffer() As Byte, i As Long If Len(StrInput) > 0 Then ' Get length in bytes *including* terminating null nBytes = WideCharToMultiByte(CP_UTF8, 0&, ByVal StrPtr(StrInput), -1, 0&, 0&, 0&, 0&) ' We don't want the terminating null in our byte array, so ask for `nBytes-1` bytes ReDim abBuffer(nBytes - 2) ' NB ReDim with one less byte than you need nBytes = WideCharToMultiByte(CP_UTF8, 0&, ByVal StrPtr(StrInput), -1, ByVal VarPtr(abBuffer(0)), nBytes - 1, 0&, 0&) ' Génèration d'une chaîne à partir du tableau: For i = LBound(abBuffer) To UBound(abBuffer) ConvertStringToUTF8 = ConvertStringToUTF8 & Chr(abBuffer(i)) Next i End If End Function '------------------------------------------------------------------------------------------------ Private Function sUTF8ToUni(bySrc() As Byte) As String '------------------------------------------------------------------------------------------------ ' Converts a UTF-8 byte array to a Unicode string Dim lBytes As Long, lNC As Long, lRet As Long lBytes = UBound(bySrc) - LBound(bySrc) + 1 lNC = lBytes sUTF8ToUni = String$(lNC, Chr(0)) lRet = MultiByteToWideChar(CP_UTF8, 0, VarPtr(bySrc(LBound(bySrc))), lBytes, StrPtr(sUTF8ToUni), lNC) sUTF8ToUni = Left$(sUTF8ToUni, lRet) End Function '------------------------------------------------------------------------------------------------ Public Function ConvertUTF8ToString(UTF8String As String) As String '------------------------------------------------------------------------------------------------ Dim bData() As Byte, sData As String, lSize As Long, i As Long sData = UTF8String lSize = Len(sData) If lSize > 0 Then ReDim bData(0 To lSize - 1) For i = 1 To lSize bData(i - 1) = Asc(Mid(sData, i, 1)) Next i ' Convert all the data to Unicode sData = sUTF8ToUni(bData) Else sData = "" End If ConvertUTF8ToString = sData End Function '------------------------------------------------------------------------------------------------ Bonne programmation.
Private Const CP_UTF8 = 65001 Private Declare PtrSafe Function MultiByteToWideChar Lib "kernel32" (ByVal CodePage As Long, _ ByVal dwFlags As Long, ByVal lpMultiByteStr As LongPtr, _ ByVal cchMultiByte As Long, ByVal lpWideCharStr As LongPtr, _ ByVal cchWideChar As Long) As Long Private Declare PtrSafe Function WideCharToMultiByte Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, _ ByVal lpWideCharStr As LongPtr, ByVal cchWideChar As Long, _ ByVal lpMultiByteStr As LongPtr, ByVal cbMultiByte As Long, _ ByVal lpDefaultChar As Long, ByVal lpUsedDefaultChar As Long) As Long '------------------------------------------------------------------------------------------------ Public Function ConvertStringToUTF8(StrInput As String) As String '------------------------------------------------------------------------------------------------ Dim nBytes As Long, abBuffer() As Byte, i As Long If Len(StrInput) > 0 Then ' Get length in bytes *including* terminating null nBytes = WideCharToMultiByte(CP_UTF8, 0&, ByVal StrPtr(StrInput), -1, 0&, 0&, 0&, 0&) ' We don't want the terminating null in our byte array, so ask for `nBytes-1` bytes ReDim abBuffer(nBytes - 2) ' NB ReDim with one less byte than you need nBytes = WideCharToMultiByte(CP_UTF8, 0&, ByVal StrPtr(StrInput), -1, ByVal VarPtr(abBuffer(0)), nBytes - 1, 0&, 0&) ' Génèration d'une chaîne à partir du tableau: For i = LBound(abBuffer) To UBound(abBuffer) ConvertStringToUTF8 = ConvertStringToUTF8 & Chr(abBuffer(i)) Next i End If End Function '------------------------------------------------------------------------------------------------ Private Function sUTF8ToUni(bySrc() As Byte) As String '------------------------------------------------------------------------------------------------ ' Converts a UTF-8 byte array to a Unicode string Dim lBytes As Long, lNC As Long, lRet As Long lBytes = UBound(bySrc) - LBound(bySrc) + 1 lNC = lBytes sUTF8ToUni = String$(lNC, Chr(0)) lRet = MultiByteToWideChar(CP_UTF8, 0, VarPtr(bySrc(LBound(bySrc))), lBytes, StrPtr(sUTF8ToUni), lNC) sUTF8ToUni = Left$(sUTF8ToUni, lRet) End Function '------------------------------------------------------------------------------------------------ Public Function ConvertUTF8ToString(UTF8String As String) As String '------------------------------------------------------------------------------------------------ Dim bData() As Byte, sData As String, lSize As Long, i As Long sData = UTF8String lSize = Len(sData) If lSize > 0 Then ReDim bData(0 To lSize - 1) For i = 1 To lSize bData(i - 1) = Asc(Mid(sData, i, 1)) Next i ' Convert all the data to Unicode sData = sUTF8ToUni(bData) Else sData = "" End If ConvertUTF8ToString = sData End Function '------------------------------------------------------------------------------------------------
Bonjour, J'utilise l'ensemble de ton code depuis peu et je te remercie pour la mise à disposition. Seulement, je rencontre un problème avec le caractère 244 correspondant au ô. En effet, la méthode ChrW présente comme exception CharCode < -32768 ou > 65535 Connais tu un moyen de contourner ? Je te remercie pour ton retour. Gwen
Envoyé par Pierre Fauconnier Bonjour Malick, C'est bien tardivement que je réponds à ton intervention. J'espère que tu vas bien Merci pour tes encouragements qui me donnent envie de continuer à écrire des billets. On a parfois l'impression d'écrire "pour du vent", et il est donc toujours agréable de savoir que le billet sert à quelqu'un. Au plaisir de te croiser sur les forums Salut Pierre, Je suis une personne qui commente rarement mais ça fais plusieurs années que j'apprécie suivre et lire tes billets, j'y cherche souvent les bonnes pratiques à utiliser ! Typiquement, je ne savais pas qu'il était mieux de passer par la plage que feuille + listobject ! Même si tu en écris moins ces derniers temps, merci pour tout ! Bonne journée, Baboutz
Bonjour Pierre, N'étant pas un développeur "expert", je tiens d'abord à te remercier pour ta série de 4 billets très pédagogiques sur l'utilisation de chemin relatif dans Power Query. Je pense avoir à peu près compris ce que je faisais :D, mais j'ai un souci avec l'adressage de mon fichier à partir de la formule = GAUCHE(CELLULE("nomfichier");CHERCHE("[";CELLULE("nomfichier"))-2) Au lieu d'avoir le chemin C:\Users\bcadi\OneDrive\Dossier auquel je m'attendais (et qui fonctionne), j'obtiens un chemin "https://entreprise-my.sharepoint.com/personal/bruno_entreprise_com/Documents/Dossier". Aurais-tu une idée de comment je peux corriger cela ? Merci pour ton aide.
Bonjour Pierre, Avant tout, d''une manière générale, merci pour tous tes écrits de grande qualité. Concernant le passage de paramètre(s) de Power Query à un script SQL, il existe à mon sens une alternative encore plus puissante passant par une seconde étape avec Value.NativeQuery: Je ne précise pas la requête dans Sql.Database mais dans Value.NativeQueryCette fonction permet de laisser une requête SQL en l'état, avec ses paramètres SQL du type @Paramètre. On peut ensuite préciser les valeurs à affecter à chacun des paramètres SQL (en y affectant une constante, une valeur calculée ou un paramètre Power Query, c'est-à-dire n'importe quel code Power Query retournant une valeur scalaire) C'est peut-être moins utile avec une procédure stockée mais ça l'est avec un SELECT: cela facilite grandement la maintenance de la requête SQL (typiquement si elle est assurée dans SSMS) et évite également des concaténations à répétition dans le cas où un paramètre est utilisé plusieurs fois dans la requête. Exemple: https://blog.crossjoin.co.uk/2016/12...-and-power-bi/ A noter: sur SQL Server (et probablement sur d'autres), il est également possible de passer des tables en paramètre en "trichant" un peu (typiquement envoyer une colonne construite dynamiquement par Power Query et constituée d'éléments destinés à une éventuelle jointure ou un filtre "WHERE ... IN (...)" directement dans la base de données, dans le but de réduire le nombre d'éléments retournés vers Power Query): sur les versions plus anciennes (et bien sûr aussi sur les actuelles), il faut passer une chaîne de caractères en argument concaténant la colonne avec un séparateur donné, puis, dans le script SQL, remplacer ce séparateur par des balises XML et ensuite utiliser la fonction XML.node de SQL Server (il est bien sûr possible d'utiliser les balises XML directement comme séparateur dans la chaîne power query).sur les versions plus récentes, on peut utiliser STRING_SPLIT pour la séparation s'il n'y a qu'une seule colonne. Exemple: https://expert-only.com/en/t-sql/spl...lit-functions/ ça donne au final des possibilités très intéressantes.
Depuis le temps que je bosse sur Excel (et que parfois je perds la boule avec les dates et que je cherche à mieux comprendre le sujet), je n'avais jamais trouvé ces infos très précieuses pour comprendre le sujet. A compléter éventuellement avec des infos sur les paramètres régionaux? (j'ai parfois l'impression que les paramètres régionaux pris en comptes ne sont pas les mêmes dans Excel et en VBA)? Quoiqu'il en soit, merci beaucoup!
Bonjour, Merci pour ce tutoriel très facile à utiliser, ça fonctionne super bien. J'aurais voulu créer plusieurs cellules contenant une liste déroulante comme dans l'exemple. Le problème étant que pour chaque liste déroulante je dois créer un tableau avec la formule donnée dans le tutoriel. Je me demandais s'il était possible d'utiliser la liste déroulante sans passer par une cellule annexe ? L'idée serait de rentrer la formule directement dans la source de la validation de données, lorsque j'essaye j'ai un message me disant que la source est reconnue comme erronée et rien ne s'affiche alors dans le menu déroulant. Peut-être que ce n'est pas faisable et qu'il faut forcément faire référence à une cellule annexe mais je trouverai ça plus pratique. Merci Florian
Bonsoir Pierre, J'ai suivi avec intérêt tes billets sur Power Query, je me demande s'il y aura une suite ? Bonne continuation. Bien cordialement. Goube
Bonjour, merci pour ces explications. Pour être cohérent concernant votre dénomination afin que seules les lignes qui ne sont pas communes sont reprises. J'opterai pour "Interne opposée" plutôt que "Externe opposée" Bien à vous.
Salut Pierre Encore une nouvelle fois merci pour ce partage de connaissance. Je vais devoir utiliser "une gestion de BD" pour un projet et cette fois je vais un peu plus m’intéresse à Power Query (plutôt que d'utiliser des recordset... ). L'insertion de la colonne Condition me semble prometteuse, c'est une méthode que je trouve élégante et intéressante pour faciliter le tri y compris avec du paramétrage plus complexe. J'espère que tu trouveras le temps d'écrire la suite PS: Sur le cours n° 2, je pense qu'il manque un mot ici Intégration d'une plage nommée L'intégration d'une plage nommée est un peu plus délicate, Je te souhaite une bonne continuation et une bonne journée Qwaz
Salut Pierre, L'exemple porte sur un fichier, mais s'il s'agit d'un dossier contenant plusieurs fichiers à importer, comment procéder ? Code : Sélectionner tout - Visualiser dans une fenêtre à part = Folder.Files("C:\Users\Malick\Documents\Perso\TimeSheets\2022\Janvier2022") Avec ceci, cela fonctionne bien : Code : Sélectionner tout - Visualiser dans une fenêtre à part = Folder.Files(CheminDossierImport) Est-ce la bonne démarche ? Merci
= Folder.Files("C:\Users\Malick\Documents\Perso\TimeSheets\2022\Janvier2022")
= Folder.Files(CheminDossierImport)
Bonjour Pierre, au hasard d'une recherche, je suis tomber sur cet article.... qui résout pleinement mon besoin. C'est nickel. On a a présent la réponse à une question qu'on n'a pas encore posé.... c'est noël avant noël J'en profite pour te souhaiter un excellent noël et de très bonnes fêtes de fin d'année. Curt
Bonjour Pierre , J'espère que tu vas bien ? Petite Question : y'aura-t-il de ci de là un Fichier exemple qui permettrait de passé de la théorie à la manipulation . Cela depuis un Fichier récapitulatifs des éléments étudiés. Bonne fin de Journée Merci encore de ce partage Cordialement Jean marie