compléter une macro...

Bonsoir,

Pour récupérer des textes taper avec un police non standard j'utilise une macro qui marche bien sauf pour un caractère. Voici la macro que vous reconnaîtrez car elle n'est pas de moi et j'ai laissé le commentaire...
Sub police
'Andy dit que dans le futur, ils devront peut-être être de type Variant pour travailler avec Array()
Dim mauvais(5) As String, bon(5) As String

Dim oDocument as object, oReplace as object
mauvais() = Array("Ø","$","‡","æ","ó","á","é","Δ","©","ú","Æ")
bon() = Array("ė","ą̃","Š","š","ų","ẽ","ó","á","é","ǽ","©")
oReplace = ThisComponent.createReplaceDescriptor()
oReplace.SearchCaseSensitive = True
For n = lbound(mauvais()) To ubound(bon())
oReplace.SearchString = mauvais(n)
oReplace.ReplaceString = bon(n)
ThisComponent.ReplaceAll(oReplace)
Next n
End Sub

j'ai réduit les tableaux pour qu'il ne soient pas coupés.
Il me reste à replacer "Â + tiret insécable" par í.
Comment peut-on faire ? sachant que je ne sais rien en basic !

Merci

Gérard

Bonsoir Gérard,

Sub police
'Andy dit que dans le futur, ils devront peut-être être de type Variant
pour travailler avec Array()
Dim mauvais(5) As String, bon(5) As String

Dim oDocument as object, oReplace as object
mauvais() = Array("Ø","$","‡","æ","ó","á","é","Δ","©","ú","Æ")
bon() = Array("ė","ą̃","Š","š","ų","ẽ","ó","á","é","ǽ","©")
oReplace = ThisComponent.createReplaceDescriptor()
oReplace.SearchCaseSensitive = True
For n = lbound(mauvais()) To ubound(bon())
oReplace.SearchString = mauvais(n)
oReplace.ReplaceString = bon(n)
ThisComponent.ReplaceAll(oReplace)
Next n
End Sub

j'ai réduit les tableaux pour qu'il ne soient pas coupés.
Il me reste à replacer "Â + tiret insécable" par í.
Comment peut-on faire ? sachant que je ne sais rien en basic !

Il semblerait que le code Ascii du tiret insécable soit 150.

Donc "Â" & Chr(150) te donne la chaîne à rechercher.

A+

et
mauvais() = Array("Ø","$","‡","æ","ó","á","é","Δ","©","ú","Æ", "Â" & Chr(150))

merci pour la rapidité mais cela ne donne rien
en fait je me suis trompé, il s'agit d'un tiret conditionel
d'après le tableau 8-3 de
Programmation OpenOffice.org 3

HARD_HYPHEN Insérer ici un tiret insécable (le mot ne doit jamais être
coupé après ce tiret). chr(8209)
SOFT_HYPHEN Insérer ici un tiret conditionnel (le mot peut être coupé à
cet endroit). chr(173)

J'ai essayé les deux mais sans succès.
à demain car il se fait tard chez moi...
Merci

Gérard

Vu. Es-tu sûr de ce que tu cherches ? Tu peux fournir un document de test ?

Bonne nuit,

en fait je me suis trompé, il s'agit d'un tiret conditionel
d'après le tableau 8-3 de
Programmation OpenOffice.org 3

HARD_HYPHEN Insérer ici un tiret insécable (le mot ne doit jamais être
coupé après ce tiret). chr(8209)
SOFT_HYPHEN Insérer ici un tiret conditionnel (le mot peut être coupé à
cet endroit). chr(173)

J'ai essayé les deux mais sans succès.

Vu. Es-tu sûr de ce que tu cherches ? Tu peux fournir un document de test ?

ce sera de fait plus simple, voici quelques mots latins
https://framadrop.org/r/2uwGcKQIT5#jFHbgc9ftXE4twQAY3biHhh95ZxPbRRMKtz4K8Jsr/w=

adresse à mettre sur une seule ligne bien sûr

Bonne nuit,

un grand merci et bonjour

Gérard

J'ai refait quelques tests
c'est bien le tiret conditionnel car si je mets
mauvais() = Array("Ø","$",Chr(173))
le caractère est bien remplacé mais il ne se passe rien avec
mauvais() = Array("Ø","$", "Â" & Chr(173))

Dans la boite de dialogue de chercher/remplacer on ne peut pas non plus joindre les deux., Il me semble que c'était possible autrefois mais je en suis pas assez sûr pour l'affirmer

Merci

Gérard

J'ai refait quelques tests
c'est bien le tiret conditionnel car si je mets
mauvais() = Array("Ø","$",Chr(173))
le caractère est bien remplacé mais il ne se passe rien avec
mauvais() = Array("Ø","$", "Â" & Chr(173))

et si tu déclares une variable texte :

Dim MaVar As String

puis que tu l'initialises :

MaVar = "Â" & Chr(173)

enfin que tu la places dans la déclaration du tableau Mauvais()

mauvais() = Array("Ø","$", MaVar)

ça donne quoi ?

Ta Sub devient donc :
8< ---------------------------------------------
Sub police
'Andy dit que dans le futur, ils devront peut-être être de type Variant pour travailler avec Array()
Dim MaVar As String
Dim mauvais(5) As String, bon(5) As String
Dim oDocument as object, oReplace as object

MaVar = "Â" & Chr(173)
' Attention ! Mauvais() et Bon() DOIVENT avoir le même nombre d'éléments !
mauvais() = Array("Ø","$","‡","æ","ó","á","é","Δ","©","ú","Æ", MaVar)
bon() = Array("ė","ą̃","Š","š","ų","ẽ","ó","á","é","ǽ","©", "í")

oReplace = ThisComponent.createReplaceDescriptor()
oReplace.SearchCaseSensitive = True

For n = lbound(mauvais()) To ubound(mauvais())
  oReplace.SearchString = mauvais(n)
  oReplace.ReplaceString = bon(n)
  ThisComponent.ReplaceAll(oReplace)
Next n
End Sub
--------------------------------------------- >8

Dans la boite de dialogue de chercher/remplacer on ne peut pas non plus
joindre les deux., Il me semble que c'était possible autrefois mais je
en suis pas assez sûr pour l'affirmer

Dans le dialogue Rechercher & remplacer, il faut rechercher 'Â' et coller le tiret insécable qu'on aura copié dans le texte. Là, ça marche. Le chr() ne peut pas marcher.

Hors de toute macro, as-tu essayé l'extension AltSearch ? Elle est vraiment très puissante et très utile dans bien des situations. Peut-être que ça pourrait le faire dans ton cas. Reste à connaître le contexte pour savoir si AltSearch est mieux qu'une macro ou pas.

et si tu déclares une variable texte :

Dim MaVar As String

puis que tu l'initialises :

MaVar = "Â" & Chr(173)

enfin que tu la places dans la déclaration du tableau Mauvais()

mauvais() = Array("Ø","$", MaVar)

ça donne quoi ?

Pas mieux. Ã est chr(195)
si je le mets seul, il est bien remplacé
chr(175) seul est bien remplacé
les deux ensembles sont ignorés
j'ai essayé + qui peut éventuellement servir à la concaténation mais c'est le même résultat

Dans la boite de dialogue de chercher/remplacer on ne peut pas non plus
joindre les deux., Il me semble que c'était possible autrefois mais je
en suis pas assez sûr pour l'affirmer

Dans le dialogue Rechercher & remplacer, il faut rechercher 'Â' et
coller le tiret insécable qu'on aura copié dans le texte. Là, ça marche.
Le chr() ne peut pas marcher.

Il n'admet plus cela ! caractère introuvable

Hors de toute macro, as-tu essayé l'extension AltSearch ? Elle est
vraiment très puissante et très utile dans bien des situations.
Peut-être que ça pourrait le faire dans ton cas. Reste à connaître le
contexte pour savoir si AltSearch est mieux qu'une macro ou pas.

avec environ 40 caractères à chercher/remplacer, cela me semble difficile mais il y a longtemps que je ne l'ai pas utilisé

Merci
Gérard

Il faut utiliser la recherche avec les expressions régulières. Pour le tiret insécable, le code est \u00AD. Voir ici :
http://sirius.on-rev.com/regex/regular_expressions_writer.html

J'ai essayé sur ton échantillon (ne mets pas les quotes simples ') :
Rechercher : 'Ã\u00AD'
Remplacer : 'í'

-> ça marche.

Par macro, il faut écrire ceci :
8< --------------------------------------------------------
Sub police
'Andy dit que dans le futur, ils devront peut-être être de type Variant pour travailler avec Array()

  Dim mauvais() As String
  Dim bon() As String
  Dim oDoc as object
  Dim oReplace as Object
  Dim n As Long

  oDoc = ThisComponent
  ' Attention ! Mauvais() et Bon() DOIVENT avoir le même nombre d'éléments !
  mauvais() = Array("Ø","$","‡","æ","ó","á","é","Δ","©","ú","Æ","Ã\u00AD")
  bon() = Array("ė","ą̃","Š","š","ų","ẽ","ó","á","é","ǽ","©", "í")
  
  oReplace = oDoc.createReplaceDescriptor()
  oReplace.SearchCaseSensitive = True
  oReplace.SearchRegularExpression = True
  
  For n = lbound(mauvais()) To ubound(mauvais())
      oReplace.SearchString = mauvais(n)
      oReplace.ReplaceString = bon(n)
      oDoc.ReplaceAll(oReplace)
  Next n
End Sub
-------------------------------------------------------- >8

avec la boite de dialogue chercher/remplacer

mais pas dans la macro !
je remets le fichier avec la macro incluse
https://framadrop.org/r/vddMqXYOWm#qMehL4261gb5/tu6RQ/NPVsvB4O5r4PdHsowIwyxNWU=

On a déjà fait un pas mais si cela pouvait marcher dans la macron ce serait mieux

Un grand merci
Gérard

Gérard,

pour info, la macro fonctionne chez moi sur le fichier échantillon que tu m'avais fait passer.
Je ne peux pas accéder à Framadrop depuis le travail. Je le ferai ce soir chez moi.

A+

La macro chez moi ne fonctionne pas : il ne se passe rien, pas de message de quoi que ce soit ou autre. Évidemment le fichier ne bouge pas d'un iota.

je viens de mettre un nouveau fichier avec quelques caractères qui seront effectivement remplacer, cela permet de voir que la macro tourne!
https://framadrop.org/r/rpCwsDZp2Q#6u7vnEW+EnBtjsKF/cTCtEqKebU01jzrl4GOlPy3/hM=
ce n'est donc plus du latin ...
Merci

Gérard

bonjour,

serait il possible d'employer soit iconv ou recode pour windows ?

https://docs.moodle.org/19/fr/Conversion_de_fichiers_en_UTF-8

sous woindows c'est du balte 1252

slt
benrard

ben pas chez moi, mais je viens de faire la bêtise d'installer la version 5.1.2.2 et c'est une catastrophe !

hé non car il s'agit d'une police non standard donc les caractères existent bien et le problème n'est pas l'encodage mais il ne sont pas au bon endroit et de plus la plus part du temp
  ce sera récupéré d'un pdf
exemple : $ = ą̃, £ = ũ, ® = ū́

Gérard

euh... là je ne comprends plus : la macro intégrée à ce document (qui est l'ancienne version) ne fonctionne pas chez moi.

En revanche, la version modifiée que j'avais proposée dans mon message du 10/4 à 19:08 fonctionne. Pour mémoire :

8< --------------------------------------------------------
Sub police2

     Dim mauvais() As String
     Dim bon() As String
     Dim oDoc as object
     Dim oReplace as Object
     Dim n As Long

     oDoc = ThisComponent
     ' Attention ! Mauvais() et Bon() DOIVENT avoir le même nombre d'éléments !
     mauvais() = Array("Ø","$","‡","æ","ó","á","é","Δ","©","ú","Æ","Ã\u00AD")
     bon() = Array("ė","ą̃","Š","š","ų","ẽ","ó","á","é","ǽ","©", "í")

     oReplace = oDoc.createReplaceDescriptor()
     oReplace.SearchCaseSensitive = True
     oReplace.SearchRegularExpression = True

     For n = lbound(mauvais()) To ubound(mauvais())
         oReplace.SearchString = mauvais(n)
         oReplace.ReplaceString = bon(n)
         oDoc.ReplaceAll(oReplace)
     Next n
End Sub
-------------------------------------------------------- >8

Recopie la sub Police2 dans ton fichier et exécute-la.

ok, ça marche
la différence est la ligne oReplace.SearchRegularExpression = True
qui n'était pas dans mon code.
Je n'ai plus qu'à compléter avec les quelques caractères qui me manquetn

un grand merci

Gérard