Macro qui créé des fichiers avec des noms comportant des lettres grecques
Bonjour.
Je dispose d'une feuille Excel qui comporte les colonnes suivantes :
col A : un nom
col B : un texte
col C à F différentes valeurs numériques
J'ai créé une macro VBA qui parcoure toutes les lignes de la feuille et, pour chaque ligne, effectue les actions suivantes :
1/ fait différents calculs avec les colonnes C à F (et d'autres infos externes)
2/ créé un fichier ayant pour nom le contenu de la col A (suffixé par .txt)
3/ rempli le fichier avec pour première ligne la col B et plusieurs lignes avec les résultats des calculs effectués.
Tout marche bien... mais... il se trouve que parfois la colonne A contient des caractères grecs (Unicode/U0370) et du coup les noms de fichiers générés ne sont pas bons. Par exemple : í3.txt au lieu de λ3.txt (lettre lambda suivi du chiffre 3). On voit qu'il y a un problème Unicode
Voici un petit bout du code de la macro:
stF = Cells(i_row, 1) & ".txt"
f = FreeFile
Open stF For Output As #f
Print #f, Cells(L_cell, C_cell).Value
Print #f, Cells(L_cell, C_cell + 1).Value
...
... etc
Close #f
Je n'arrive pas à trouver l'astuce pour que le nom du fichier soit exactement le même que le contenu de la col A.
Notez que les caractères grecs sont correctement affichés dans la feuillle Excel (bonne police installée).
Et aussi que je suis sur PC/Windows 10 et avec Excel 365.
Merci par avance pour vos suggestions.
Bonjour,
Je ne vois pas trop comment tester mais essayez de travailler le String et passez le en concaténation avec "ChrW" Voyez ce mot dans l'aide. (consultez celle de libre Office elle est plus explicite que celle de Microsoft...)
A+
Bonjour
Je bataille depuis ce matin à essayer de trouver comment utiliser la fonction ChrW pour résoudre mon problème mais je n'arrive pas à trouver une solution avec ça.
J'ai tenté des combinaisons d'extractions une à une des valeurs décimales de chaque caractère du nom (avec la fonction ASC) car je suppose que le codage est fait en UTF-8, mais après je sèche pour générer le nom de fichier correctement
Le problème c'est qu'on ne sait rien de tes String
Tu peux essayer de tester le radical (Cells(i_row, 1) caractère par caractère
avec un Regex (nécessite d'activer "Microsoft VBScript Regular Expression 5.5")
Je ne suis pas certain du fonctionnement avec Unicode... Mais mes tests me semblent crédibles !
Sub test()
Dim Nam$, i%, Z$, Y As Boolean
Y = True
Nam = [B5].Value 'A adapter pour ton test avec Cells(i_row, 1).value
For i = 1 To Len(Nam)
Z = Mid(Nam, i, 1)
Y = OkMot(Z)
If Y = False Then Exit For
Next
If Y Then MsgBox "Ok"
End Sub
Function OkMot(Mot$) As Boolean
'nécessite d'activer "Microsoft VBScript Regular Expression 5.5"
Dim MyRegExp As RegExp
Dim myMatches As MatchCollection
Set MyRegExp = New RegExp
MyRegExp.Pattern = "[A-Za-z0-9]"
MyRegExp.ignoreCase = True
MyRegExp.Global = False
Set myMatches = MyRegExp.Execute(Mot)
OkMot = (myMatches.Count = 1)
Set myMatches = Nothing
Set MyRegExp = Nothing
End FunctionEDIT : On pourrait même sans doute tester l'absence de tout caractère étranger directement dans le mot (donc sans tester caractère par caractère) toujours avec un Regex mais je ne suis pas assez compétents pour te bricoler un Regex comme ça...
A+
Bonjour.
J'ai fait le test avec la macro test () et (pour une cellule contenant la lettre λ uniquement), la fonction OkMot(Z) retourne False.
Ce qui ne m'aide pas bien.
Je vais laisser tomber. Je vais faire les substitutions des noms de fichiers à la main.
Merci toutefois pour le support.
C'est curieux parce que mes tests sont bons. Mais cela provient sans doute de la manière dont j'injecte mes caractères...
Peut tu me fournir un fichier avec seulement 2 ou 3 cellules test ?
A+
Bonjour galopin01
Voici un petit extrait du fichier (quelques lignes et quelques colonnes).
Pour tout dire, la colonne A contient la notation d'une couche géologique (selon les conventions du BRGM - Bureau de recherches géologiques et minières) et les autres colonnes contiennent des infos sur la couleur de la couche dans une carte géologique ainsi que le texte de la légende.
Pour afficher correctement la colonne A dans la feuille Excel, il faut une police de caractère spéciale : BRGM_NOT.TTF (du BRGM), mais je n'ai pas trouvé le moyen de l'attacher à ce post. Voici l'URL : http: //infoterre.brgm.fr /telechargements /BDCharm50/Outils.zip (enlever les espaces avant les / ). La police se trouve dans le répertoire Point_Symbols)
Pour faire simple dans le test ici, l'idée est de générer autant de fichiers .txt qu'il y a de lignes (en réalité je génère des fichiers .svg) ayant pour nom de fichier la valeur en colonne A (avec, dans le cas des caractères grecs : Unicode U+0370 à U+03FF) et les colonnes E et F dans le contenu du fichier.
Merci bien par avance.
J'ai téléchargé la police et pour moi ça marche il me biloque dès A1... J'ai supprimé le # et ça passe... Mais A2 et le reste est bloqué. Donc je suis en mesure de te détecter tous les caractères indésirables donc de te restituer un string sans ces caractères.
Par contre ce que je ne sais pas faire c'est quand il y a juste un caractère grec donc il faut m'expliquer la règle du jeu de nommage s'il n'y a qu'un caractère grec. J'ai compris que la plupart du temps tu te contentes des caractères valides donc je peux te faire une fonction qui te retourne ça mais s'il n'y a que des caractères invalides que faire ?
A+
Cette fonction te retourne un string ou la lettre grecque est remplacée par un _ suivi de son N° unicode...
Sub test()
Dim i%, Z$
For i = 2 To 26
MsgBox RetNam(Cells(i, 1).Value)
Next
End Sub
Function RetNam$(Cel$)
Dim i%, Tmp$, Z$, Y As Boolean
For i = 1 To Len(Cel)
Z = Mid(Cel, i, 1)
Y = OkMot(Z)
If OkMot(Z) Then
Tmp = Tmp & Z
Else
Tmp = Tmp & "_" & AscW(Z)
End If
Next
RetNam = Tmp
End Function
Function OkMot(Mot$) As Boolean
'nécessite d'activer "Microsoft VBScript Regular Expression 5.5"
Dim MyRegExp As RegExp
Dim myMatches As MatchCollection
Set MyRegExp = New RegExp
MyRegExp.Pattern = "[A-Za-z0-9]"
MyRegExp.ignoreCase = True
MyRegExp.Global = False
Set myMatches = MyRegExp.Execute(Mot)
OkMot = (myMatches.Count = 1)
Set myMatches = Nothing
Set MyRegExp = Nothing
End FunctionA+
Merci galopin01
Je vais regarder la fonction.
Pour répondre à la question "que faire des caractères grecs ?" et ben c'est tout là mon besoin : les garder dans le nom du fichier.
Par exemple, si la colonne A contient uniquement : λ et bien le nom du fichier doit être : λ.txt
Ma galère depuis le début c'est que ma macro génère : í.txt(le codage UTF-8 n'est pas pris en compte comme il le faudrait, VBA considère le caractère comme de l'ASCII-étendu et propose l'équivalent pour le premier octet uniquement).
Donc, pour moi, tous les caractères doivent être pris en compte, quelle que soit la table UNICODE (latin; grec,...). Ainsi, μη(1)doit générer le nom de fichier : μη(1).txt et non îë(1).txt