IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Word Discussion :

[VBA-W]Convertir des valeurs Chiffres FR>UK et UK>FR


Sujet :

VBA Word

  1. #1
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 20
    Points : 11
    Points
    11
    Par défaut [VBA-W]Convertir des valeurs Chiffres FR>UK et UK>FR
    Bonjour à tous !
    J'ai besoin de convertir des valeurs chiffrées dans des tableaux Word de l'anglais vers le français, ou au contraire du français vers l'anglais.
    C'est une manipulation assez simple à l'aide d'un simple chercher/remplacer.
    Pour passer du français à l'anglais, je remplace la virgule par un point et l'espace par une virgule :
    1 123,56 > 1,234.56
    Pour passer de l'anglais vers le français, je remplace la virgule par une espace et le point par une virgule :
    1,234.56 > 1 123,56

    Cette recherche s'effectue sur une sélection de cellules et lorsque Word demande si on doit étendre au reste du document, la réponse "Non" suffit à limiter cette recherche à la sélection...

    Tout ceci fonctionne admirablement bien manuellement et lorsque j'enregistre mes manips dans une macro... Le problème, c'est que quand je relance cette macro, le traitement s'opère, non pas seulement sur la sélection, mais sur tout le document... (tous mes espaces sont remplacés par des "virgules", les "virgules" par des "points"... Bref c'est la chianlit...
    J'ai cherché partout d'où cela peut bein provenir et je sèche lamentablement...

    Je travailles sous WinXP, et Office 2003...

    Voici un exemple de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
     
    Sub Macro1()
    ' UK FR
    ' Conversion de l'anglais vers le français
        Selection.Find.ClearFormatting
        Selection.Find.Replacement.ClearFormatting
        With Selection.Find
            .Text = ","
            .Replacement.Text = "^s"
            .Forward = True
            .Wrap = wdFindAsk
            .Format = False
            .MatchCase = False
            .MatchWholeWord = False
            .MatchWildcards = False
            .MatchSoundsLike = False
            .MatchAllWordForms = False
        End With
        Selection.Find.Execute Replace:=wdReplaceAll
     
        Selection.Find.ClearFormatting
        Selection.Find.Replacement.ClearFormatting
        With Selection.Find
            .Text = "."
            .Replacement.Text = ","
            .Forward = True
            .Wrap = wdFindAsk
            .Format = False
            .MatchCase = False
            .MatchWholeWord = False
            .MatchWildcards = False
            .MatchSoundsLike = False
            .MatchAllWordForms = False
        End With
        Selection.Find.Execute Replace:=wdReplaceAll
    End Sub
    Sub Macro2()
    ' FR UK
    ' Conversion du français vers l'anglais
    '
        Selection.Find.ClearFormatting
        Selection.Find.Replacement.ClearFormatting
        With Selection.Find
            .Text = ","
            .Replacement.Text = "."
            .Forward = True
            .Wrap = wdFindAsk
            .Format = False
            .MatchCase = False
            .MatchWholeWord = False
            .MatchWildcards = False
            .MatchSoundsLike = False
            .MatchAllWordForms = False
        End With
        Selection.Find.Execute Replace:=wdReplaceAll
     
        Selection.Find.ClearFormatting
        Selection.Find.Replacement.ClearFormatting
        With Selection.Find
            .Text = " "
            .Replacement.Text = ","
            .Forward = True
            .Wrap = wdFindAsk
            .Format = False
            .MatchCase = False
            .MatchWholeWord = False
            .MatchWildcards = False
            .MatchSoundsLike = False
            .MatchAllWordForms = False
        End With
        Selection.Find.Execute Replace:=wdReplaceAll
     
        Selection.Find.ClearFormatting
        Selection.Find.Replacement.ClearFormatting
        With Selection.Find
            .Text = "^s"
            .Replacement.Text = ","
            .Forward = True
            .Wrap = wdFindAsk
            .Format = False
            .MatchCase = False
            .MatchWholeWord = False
            .MatchWildcards = False
            .MatchSoundsLike = False
            .MatchAllWordForms = False
        End With
        Selection.Find.Execute Replace:=wdReplaceAll
    End Sub

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 7
    Points : 6
    Points
    6
    Par défaut hum...
    Je pense que tu devrai sélectionner une zone avant de lancer ta routine... quand tu ouvres ton classeur en automatique, aucune sélection n'est en cours donc par défaut la sélection est probablement l'ensemble de la feuille active non ?

    Je suggère donc un Range(quelquechose).Select avant de lancer ta macro.

    Dites moi si j'me fourvoie... ^^

  3. #3
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    tu peu parcourir les tableaux de ton document WORD ... et ensuite les cellules de ces tableaux ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
     
    Option Explicit
     
    Sub ModifTableaux()
     Dim t As Table
     Dim c As Cell
     Dim tb
     For Each t In ActiveDocument.Tables
      For Each c In t.Range.Cells
         tb = Split(c.Range.Text, Chr(13) & Chr(7)) 'les cellules des tableaux word finissent par les caractéres 13 et 7..
         c.Range.Text = Replace(tb(0), ",", ".")
        Next
     Next
    End Sub

  4. #4
    Membre régulier
    Avatar de mortalino
    Inscrit en
    Janvier 2007
    Messages
    72
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Janvier 2007
    Messages : 72
    Points : 116
    Points
    116
    Par défaut
    Salut,

    dans ton code, remplace dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Selection.Find.Execute Replace:=wdReplaceAll
    le wdReplaceAll par wdReplaceOne

    @++

  5. #5
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 20
    Points : 11
    Points
    11
    Par défaut [VBA-W] - On avance !!!
    GRAND MERCI à toi BBil...
    Ta réponse est géniale et j'ai réussi à régler grâce à toi la quasi majorité de mon problème...

    Cependant, il me reste quelques points à résoudre...

    Comme tu peux le voir dans le code ci-dessous, j'ai dupliqué ton bout de code pour en faire plusieurs macros que j'appelle successivement pour réaliser les tâches de rechercher / remplacer nécessaires à mon passage du français vers l'anglais et inversement pour les valeurs chiffrées de mes tableaux Word.

    C'est redoutable d'efficacité. Me reste le cas ou il ne s'agit pas d'une espace standard mais d'une espace insécable... J'ai tenté de mettre le code ^s (voir partie du code placée en commentaire) mais cela ne fonctionne pas. J'imagine que dans ton code cela doit être renseigné différemment. Comment coder l'insécable dans ta macro ?

    J'ai compensé ce problème en recherchant par avance tous les blancs de toute sortes (^w) mais dans ce cas évidemment le traitement s'effectue sur tout mon document avec les effets de bord que cela suppose... Cette solutions ne convient pas.

    Ta macro (géniale j'insiste pour moi qui débute en la matière) est parfaite pour un tableau constitué uniquement de chiffres, ce qui n'est pas le cas des documents que je doit traiter... Les têtières, certaines colonnes, contiennent souvent des textes et donc de la ponctuation (. , ...).

    Comment modifier ta macro pour qu'elle ne s'exécute que sur une sélection? (ce qui implique un lancement manuel de la dite-macro, j'en suis conscient)...

    Une dernière chose qui s'écarte un peu du sujet initial... Bien souvent, les tableaux que je traite sont des imports d'excel et les auteurs de ces tableaux utilisent les espace (sic) avant et/ou après les valeurs pour centrer ou aligner leur valeurs ce qui induit la présence de ces espaces dans Word une fois copiés/collés.

    Une solution simple dans Word consiste à centrer les valeurs puis à les aligner de nouveau à droite pour voir disparaitre les espaces avant et après les valeurs (mais pas les espaces présents au sein d'un chiffre formaté de la manière suivante par exemple 1 123,12).
    J'ai enregistré la manip via l'enregistreur de macro (le code généré est très simple) mais lorsque j'execute la macro l'effet désiré ne se produit pas (les espaces demeurent) alors que la même opération réalisée manuellement fonctionne... Une idée ?

    En tout cas, Merci beaucoup d'ores et déjà pour les renseignements que tu m'as donné...

    Voici mon code actuel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
     
    Option Explicit
     
    Sub AnglaisFrancais()
    Application.Run MacroName:="blancs"
    Application.Run MacroName:="UKFR01"
    Application.Run MacroName:="UKFR02"
    End Sub
     
    Sub FrancaisAnglais()
    Application.Run MacroName:="blancs"
    Application.Run MacroName:="FRUK01"
    Application.Run MacroName:="FRUK02"
    End Sub
     
    Sub UKFR01()
     Dim t As Table
     Dim c As Cell
     Dim tb
     For Each t In ActiveDocument.Tables
      For Each c In t.Range.Cells
         tb = Split(c.Range.Text, Chr(13) & Chr(7)) 'les cellules des tableaux word finissent par les caractéres 13 et 7..
         c.Range.Text = Replace(tb(0), ",", " ")
        Next
     Next
    End Sub
     
    Sub UKFR02()
     Dim t As Table
     Dim c As Cell
     Dim tb
     For Each t In ActiveDocument.Tables
      For Each c In t.Range.Cells
         tb = Split(c.Range.Text, Chr(13) & Chr(7)) 'les cellules des tableaux word finissent par les caractéres 13 et 7..
         c.Range.Text = Replace(tb(0), ".", ",")
        Next
     Next
    End Sub
     
    Sub FRUK01()
     Dim t As Table
     Dim c As Cell
     Dim tb
     For Each t In ActiveDocument.Tables
      For Each c In t.Range.Cells
         tb = Split(c.Range.Text, Chr(13) & Chr(7)) 'les cellules des tableaux word finissent par les caractéres 13 et 7..
         c.Range.Text = Replace(tb(0), ",", ".")
        Next
     Next
    End Sub
     
    Sub FRUK02()
     Dim t As Table
     Dim c As Cell
     Dim tb
     For Each t In ActiveDocument.Tables
      For Each c In t.Range.Cells
         tb = Split(c.Range.Text, Chr(13) & Chr(7)) 'les cellules des tableaux word finissent par les caractéres 13 et 7..
         c.Range.Text = Replace(tb(0), " ", ",")
        Next
     Next
    End Sub
     
    ' ********** Ceci ne fonctionne pas ***********
    'Sub FRUK03()
    ' Dim t As Table
    ' Dim c As Cell
    ' Dim tb
    ' For Each t In ActiveDocument.Tables
    '  For Each c In t.Range.Cells
    '     tb = Split(c.Range.Text, Chr(13) & Chr(7)) 'les cellules des tableaux word finissent par les caractéres 13 et 7..
    '     c.Range.Text = Replace(tb(0), "^s", ",")
    '    Next
    ' Next
    'End Sub
     
     
    Sub blancs()
    ' Macro pour supprimmer tous les espaces blancs inutiles et en surnombre
    '
        Selection.Find.ClearFormatting
        Selection.Find.Replacement.ClearFormatting
        With Selection.Find
            .Text = "^w"
            .Replacement.Text = " "
            .Forward = True
            .Wrap = wdFindContinue
            .Format = False
            .MatchCase = False
            .MatchWholeWord = False
            .MatchWildcards = False
            .MatchSoundsLike = False
            .MatchAllWordForms = False
        End With
        Selection.Find.Execute Replace:=wdReplaceAll
    End Sub

  6. #6
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    déjà tu n'as pa besoin de faire trois macros ... pour cela .. tu peu enchaîner tes 3 tâches à l'intérieur de la ta boucle...
    du genre :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    ...
    For Each t In ActiveDocument.Tables
      For Each c In t.Range.Cells
         tb = Split(c.Range.Text, Chr(13) & Chr(7)) 'les cellules des tableaux word finissent par les caractéres 13 et 7..
          tb(0) = Replace(tb(0), ",", " ")
         c.Range.Text = Replace(tb(0), ".", ",")
        Next
     Next
    ...

    dans cette boucle tb(0) ... contient la valeur de ta cellule tu peu commencer par tester celle-ci histoire de voir si tu dois la traduire où pas..? pour cela à toi de déterminer les conditions .. par exemple .. : s'il y as autre chose que des "chiffres" dans tb(0) je ne le traite pas....


    pour ce qui est de l'espace insécable ...? j'ai pas bien compris de qu'el genre d'espace il sagissai...?

  7. #7
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 20
    Points : 11
    Points
    11
    Par défaut On continue à avancer, c'est Cool...
    Hello BBil,

    en fait, la voie vers laquelle tu m'emmène m'intéresse au plus haut point... Cependant Mes faibles compétences en VBA (qui ne demandent qu'à évoluer) ne me permettent pas de parfaitement comprendre tout ce que tu me dit...

    Peux-tu m'exliquer comment, dans ta boucle, je fais le test en question ?

    Ton exemple est parfait, il faudrait effectivement qu'un test puisse détecter la présence unique de chiffres pour exécuter le travail, ça règle mon problème d'emblée...
    Si il y a du texte, et donc potentiellement des points et des virgules utilisés comme ponctuation, le traitement ne s'effectue pas. Si au contraire il y a seulement des chiffres, alors le travail s'effectue.

    Est-il possible que tu me commentes un peu ton code, la boucle et le test conditionnel... ?

    J'ai réussi à faire quelque chose de ressemblant en utilisant les caractères génériques dans mes recherches :
    [(0-9)],[(0-9)] pour ne remplacer QUE les virgules encadrées par des chiffres seulement par exemple... mais je ne sais pas comment intégrer les caractères génériques à ta macro...

    Pour répondre à ta question :
    Une espace insécable est un caractère typographique que l’on intercale entre deux mots (ou un mot et une ponctuation) qui ne doivent pas être séparés par un éventuel retour à la ligne automatique. L’espace insécable permet d’éviter qu’un mot ou une ponctuation soit rejeté et isolé en début de ligne lorsque cela nuirait à la fluidité de la lecture. PAr exemple, lorsque tu tapes du texte en français dans word, dès que tu insères les deux points ":", le point-virgule ";" ou le point d'interrogation "?", Word insère automatiquement une espace insécable pour que le signe de ponctuation soit toujours acclé au mot qui le précède... Sous word, dans les rechercher/remplacer cette espace est codifiée avec le symbole "^s"... J'ai essayé de l'intégrer au code mais VBA ne reconnait pas ce code dans ce contexte...

    Voila voila... J'espère ne pas trop t'ennuyer avec mes questions et j'espère que ce cas d'école sera utile au plus grand nombre... Il me tarde de te lire ...

    Merci encore .

Discussions similaires

  1. [VBA-W]prendre des valeurs "texte" dans Excel
    Par teromah dans le forum VBA Word
    Réponses: 12
    Dernier message: 14/06/2007, 16h20
  2. [VBA-E] incrémenter des valeurs excel grâce à des boutons
    Par keiserjo dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 19/07/2006, 11h32
  3. [VBA-E] Lire des valeurs dans un fichier excel
    Par nicobox dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 11/05/2006, 15h40
  4. [VBA-E] Addition des valeurs des textbox
    Par DonKnacki dans le forum Macros et VBA Excel
    Réponses: 49
    Dernier message: 15/02/2006, 14h49
  5. Convertir des valeurs hexadécimal en integer
    Par Bernard Martineau dans le forum Langage
    Réponses: 4
    Dernier message: 11/10/2005, 16h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo