XL 2019 une aide d'expert pour un code VBA à actualiser

Sebasto

XLDnaute Nouveau
Bonjour le forum,

La question est simple mais la solution pas évidente (même sur stack aux USA)

J'ai un programme VBA sur un fichier Excel qui marche bien!
Mais Internet évolue et maintenant il faut obtenir des résultats en UTF-8 sans BOM.
(aujourd'hui je contourne en utilisant un logiciel gratuit qui encode en Batch -2000 fichiers- depuis Ansi en UTF-8 sans bom)

le code actuel est (qui produit du Ansi):
Set fs = CreateObject("Scripting.FileSystemObject")
Set a = fs.CreateTextFile(ThisWorkbook.Path & "\taxaIP\zz-" & tablo(n, 2) & ".php", True)

Il me faudrait le modifier pour que les fichiers txt obtenus s'ouvrent directement en UTF-8 sans bom et plus en Ansi (par exemple avec Notepad ++).

Un expert peut-il m'aider?

Merci, Seb
 

patricktoulon

XLDnaute Barbatruc
bonjour
oui on peut t'aider
il faut pas utiliser l'object FSO mais adobdstream
VB:
'Set fs = CreateObject("Scripting.FileSystemObject")
'Set a = fs.CreateTextFile(ThisWorkbook.Path & "\taxaIP\zz-" & tablo(n, 2) & ".php", True)
    Dim oStream
    Set oStream = CreateObject("ADODB.Stream")                                  'creation de l'object stream
    oStream.Charset = "utf-8"                                                   'paramétrage du format(utf-8)
    oStream.Open                                                                'ouverture
    oStream.WriteText "Texte encodé UTF-8"                                      'écrire dedans
    oStream.SaveToFile ThisWorkbook.Path & "\taxaIP\zz-" & tablo(n, 2) & ".php" 'sauver le fichier
End Sub
;)
 

Sebasto

XLDnaute Nouveau
Ah merci, PatrickToulon... mais il y a un bug, quand j'exécute, la macro s'arrête tout de suite à (surligné en jaune)
oStream.SaveToFile ThisWorkbook.Path & "\taxaIP\zz-" & tablo(n, 2) & ".php" 'sauver le fichier

Mais je ne suis pas un expert et il me semble qu'il faut que je mette la suite et fin de la macro (au cas où!)

L = L + 1
tabres(L) = "</body></html>"
'Set fs = CreateObject("Scripting.FileSystemObject")
'Set a = fs.CreateTextFile(ThisWorkbook.Path & "\taxaIP\zz-" & tablo(n, 2) & ".php", True)
Dim oStream
Set oStream = CreateObject("ADODB.Stream") 'creation de l'object stream
oStream.Charset = "utf-8" 'paramétrage du format(utf-8)
oStream.Open 'ouverture
oStream.WriteText "Texte encodé UTF-8" 'écrire dedans
oStream.SaveToFile ThisWorkbook.Path & "\taxaIP\zz-" & tablo(n, 2) & ".php" 'sauver le fichier

For m = LBound(tabres) To UBound(tabres)
If tabres(m) <> "" Then a.WriteLine (tabres(m))
Next m
Next n
a.Close
End Sub

A te lire!
Seb
 

patricktoulon

XLDnaute Barbatruc
re
a ben j'ai repris ta ligne moi
si ton "tablo(n,2) est une erreur ca je n'y peux rien
ou si ton dossier "taxalP" n'existe pas
bref
je crois comprendre que tu veux encoder un PHP en html
on peut avoir un exemple de fichier php ? et la source si possible
car je suppose que la source des données est une plage de cellule
 

Sebasto

XLDnaute Nouveau
Oui tu as raison, je ne comprend pas pourquoi c'est cette ligne qui est en jaune!
Mais honnêtement ce que j'ai écrit est 100% exact.
La macro existe et elle fonctionne mais elle produit des fichiers ansi que je transforme en UTF 8 sans Bom avec Sisulizer.
Donc le bénéfice est juste de me faire gagner du temps.

Merci de t'être intéresser à ce souci.

Seb
 

Sebasto

XLDnaute Nouveau
Bonjour,

Désolé de voir que ma question a été abandonnée après une première réponse encourageante.

Je me suis demandé si on aurait dû aussi modifier des variables qui sont nommées en début de macro comme:

Sub testtext()
debut = Timer
Dim tabres
Dim tablo
Dim n As Integer
Dim m As Integer
Dim nn As Integer
Dim x As Variant

J'espère qu'un autre expert saura m'aider.

Merci d'avance!

Bien cordialement, Seb
 

patricktoulon

XLDnaute Barbatruc
re
bonjour
ben c'est surtout que tu n'a rien compris
dans ton post 3 tu melange ta version et la mienne
tu cherche a ecrire dans le fichier "a" alors qu'il n'existe pas puisqu'il n'est pas créer

comment faut te le dire ;)
FSO tu oublie
ce que je t'ai donné suffit amplement ,j'ai testé avant bien sur

comme je t'ai dis il te faut vérifier
si ton dossier existe
si tablo(n,2) veut dire quelque chose

après tu nous donne une bribe de code et sans fichier en plus
comment veux tu que l'on t'aide dans un cas pareil?

il faut faire un peu plus d'efforts dans vos demande , il n'y a pas de devins sur XLD
;)
 

Sebasto

XLDnaute Nouveau
Bon, je ne suis pas un expert mais je ne suis pas un débutant non plus.
J'ai désactivé les 2 lignes:
'Set fs = CreateObject("Scripting.FileSystemObject")
'Set a = fs.CreateTextFile(ThisWorkbook.Path & "\taxaIP\zz-" & tablo(n, 2) & ".php", True)
OK?
Ensuite j'ai vérifié si
si le dossier existe
si tablo(n,2) veut dire quelque chose
Evidemment que oui puisque la macro sans tes ajouts et en rétablissant les 2 lignes marche bien mais produit des fichiers ansi
Aucun intérêt de mettre toute la macro car c'est une longue suite de
L = L + 1
tabres(L) = "<p>Gender/Accordance: <b>" & tablo(n, 77) & "</b></p><p>&nbsp;</p>"
où seule la ligne et le texte du titre changent (ici 77)
le tout dans une boucle 'for'
Plus clair?
A mon tour, amicalement, de te suggérer de lire précisément mon post
Merci quand même de ton dévouement!

A+, j'espère
Seb
 

patricktoulon

XLDnaute Barbatruc
re
A mon tour, amicalement, de te suggérer de lire précisément mon post
VB:
Mais je ne suis pas un expert et il me semble qu'il faut que je mette la suite et fin de la macro (au cas où!)

L = L + 1
tabres(L) = "</body></html>"
'Set fs = CreateObject("Scripting.FileSystemObject")
'Set a = fs.CreateTextFile(ThisWorkbook.Path & "\taxaIP\zz-" & tablo(n, 2) & ".php", True)
Dim oStream
Set oStream = CreateObject("ADODB.Stream") 'creation de l'object stream
oStream.Charset = "utf-8" 'paramétrage du format(utf-8)
oStream.Open 'ouverture
oStream.WriteText "Texte encodé UTF-8" 'écrire dedans
oStream.SaveToFile ThisWorkbook.Path & "\taxaIP\zz-" & tablo(n, 2) & ".php" 'sauver le fichier

For m = LBound(tabres) To UBound(tabres)
If tabres(m) <> "" Then a.WriteLine (tabres(m))
Next m
Next n
a.Close
End Sub

A te lire!
Seb

allez relis toi va 🤣
et si tu nous faisait un petit fichier anonymisé de quelque lignes + ta macro
 

Sebasto

XLDnaute Nouveau
Bonjour,
J'ai pris le taureau par les cornes et il semble que le problème soit plus compliqué qu'au début.
J'ai vidé le dossier taxaIP (réception des fichiers), j'ai nettoyé avec ccleaner
J'ai copié le fichier de départ avec un autre nom au même endroit et j'ai fait tourner la macro
1- avec la version ancienne (sans UTF-8), tout roule et j'ai mes fichers MAIS en ansi pour certains et en UTF-8 pour d'autres SANS aucun rationnel apparent!!
J'ai bien mais 2248 fichiers de 5 à 6 Ko chacun, tous datés de la même heure.
2- avec tes corrections, alors cela bugue mais à une ligne différente (un peu plus loin) à
If tabres(m) <> "" Then a.WriteLine (tabres(m))
précisément en jaune : a.WriteLine (tabres(m))
Mais cette macro nouvelle a quand même produit 1 fichier, pas en Ansi, et pas en UTF-8 sans bom (!), plutôt en UTF-8-BOM (avec Bom)
Et le seul fichier (le premier généré) ne contient que
Texte encodé UTF-8
Rien d'autre!

J'ai fait un autre fichier en ne conservant que 25 lignes de données actives
J'ai d'abord exécuté la nouvelle macro et là comme avant cela bugue à
oStream.SaveToFile ThisWorkbook.Path & "\taxaIP\zz-" & tablo(n, 2) & ".php" 'sauver le fichier
et aucun fichier n'est produit
J'ai ensuite exécuté l'ancienne macro et j'ai bien mes 25 fichiers, mais 10 sont en Ansi et 15 sont en UTF-8 (directement bons)!!!
J'ai scruté les 10 fichiers en Ansi, TOUS ont au moins un caractère spécial de type é, ou ü, etc., dans les textes de données (variables)
J'ai scruté les 15 fichiers en UTF-8, AUCUN n'a un caractère spécial de type é, ou ü, etc., dans les textes de données (variables)
J'ai sondé au hasard les autres quelques 2000 fichiers et la règle est vérifiée.
Il semblerait que Microsoft attribue un codage Ansi automatiquement quand il y a au moins un caractère spécial!!! (le site est en Anglais mais il y a parfois des caractères spéciaux à des mots Français, Allemands, etc.

Est-ce que cela peut-être réglé avec une macro et ton codage corrigé? Grande question!

Voilà.
J'ai questionné l'administrateur des fichiers et il n'est pas d'accord pour envoyer le fichier complet mais il est d'accord pour que je te transmette en privé le fichier avec les 25 lignes actives et les 2 macros, mais alors si tu es d'accord, je ne sais pas comment faire!

Merci (et pardon pour mon rationnel limité précédent)

Cordialement, Seb
 

patricktoulon

XLDnaute Barbatruc
re
Bonjour
tes lignes a.write... c'est normal le fso n'est pas créé elle ne servent à rien

c'est si compliqué de nous donner un fichier excel avec des données bidons (juste quelques lignes)
avec des accents et tout ce que tu voudra bien mettre
et le fichier php produit comme il le devrait par rapport aux données du fichier excel

sérieusement c'est si compliqué
il n'y a pas besoins de connaissance pour ça
c'est quoi une table html dans ce php ?
 

Sebasto

XLDnaute Nouveau
Bonjour PatrickToulon

Dans mon pays (pas le même sud), on dit que la plus belle fille ne peut donner que ce qu'elle a.
J'ai proposé que l'administrateur envoie un fichier test limité avec les 2 macros.
On ne peut pas mieux pour tester.
Je suis un exécutant. Je ne peux pas plus.
Sincèrement
Seb
 

Sebasto

XLDnaute Nouveau
salut,

Pas de souci.
Il a près de 75 ans.
Si j'ai bien compris, il ne veut pas divulguer en public le code Vba qu'un ancien de ce forum lui a fait.
Respect donc.
Mêmes bénévoles nous ne sommes que peu de choses sur cette planète.
Peut-être Microsoft après 50 ans d'Excel corrigera!!!
Pour ma part je suis incompétent mais avec un peu de temps je coderai en MySql!
Tout est contournable en informatique.
Seb
 

patricktoulon

XLDnaute Barbatruc
bonjour @Sebasto

Il a près de 75 ans.
Si j'ai bien compris, il ne veut pas divulguer en public le code Vba qu'un ancien de ce forum lui a fait.
donc si je comprends bien il est d'accords que tu vienne chercher de l'aide
mais il l'est moins pour partager
75 ans ou pas tu lui diras mon fond de pensée
pour info je l'ai le code qu'il faut pour créer un fichier en utf-8 sans bom ou avec bom
mais comme le partage ne semble pas réciproque je vais m'abstenir
voici ma macro
1709044956181.png


et voici le résultat dans les fichiers

j'attire ton attention sur ce qui est entouré en rouge
1709045132679.png


montre lui bien les captures à mr pas loin des 75 ans
et dis lui bien que c'est de ma part :D 😂🤣
@plus ....peut être
 

Statistiques des forums

Discussions
313 309
Messages
2 097 034
Membres
106 812
dernier inscrit
Excellou74