XL 2019 Copier une partie de contenu d'une cellule dans une autre - Macro

Blessmywill

XLDnaute Nouveau
Bonjour à tous,

Je suis traducteur et prof domicilié à Pékin. Dans le cadre de mon travail, je reçois des fichiers de glossaire de mes collègues chinois. Même je leur dis souvent de mettre les infos dans deux colonnes distinctes, c'est rarement fait :)

J'aimerais du coup trouver une macro qui me permette de séparer le texte en chinois du texte français.

Je suis débutant en macro, donc tous vos conseils et votre aide sont les bienvenus.
Je vous laisse un document pour vous montrer ce que je souhaiterai obtenir comme résultat.

Bien à vous,
 

Pièces jointes

  • Exemple fichier.xlsx
    10 KB · Affichages: 20
Solution
Re le fil, le forum

pour le fun, ,la même macro avec un tableau, cela restera très rapide même sur un très grand nombre de données à traiter.

Bien cordialement
VB:
Sub CH_FR3()
    Dim Tableau_en_Cours, Tableau_Range As Range, Compteur As Integer, Compteur2 As Integer, Compteur3 As Integer, Compteur4 As Long, Texte_Cellule$
    Set Tableau_Range = Range("A1:C" & Range("A1000000").End(xlUp).Row)
    Tableau_en_Cours = Tableau_Range.Value
    'détecte le premier caractère > 255
    For Compteur4 = LBound(Tableau_en_Cours, 1) To UBound(Tableau_en_Cours, 1)
        Compteur2 = 0
        Compteur3 = 0
        Texte_Cellule = Tableau_en_Cours(Compteur4, 1)
        For Compteur = 1 To Len(Texte_Cellule)
            If AscW(Mid(Texte_Cellule...

Bernard_XLD

XLDnaute Barbatruc
Membre du Staff
Bonjour Blessmywill, le forum

Une proposition en formule avec ta chaine en A1,
formule en B1 =GAUCHE(DROITE(A1;NBCAR(A1)-CHERCHE(" ";A1;1));CHERCHE(" ";DROITE(A1;NBCAR(A1)-CHERCHE(" ";A1;1));1))
formule en C1 =DROITE(DROITE(A1;NBCAR(A1)-CHERCHE(" ";A1;1));NBCAR(DROITE(A1;NBCAR(A1)-CHERCHE(" ";A1;1)))-CHERCHE(" ";DROITE(A1;NBCAR(A1)-CHERCHE(" ";A1;1));1))
voir fichier joint

Bien cordialement
 

Pièces jointes

  • Exemple fichier - Copie.xlsx
    12.1 KB · Affichages: 3

Hasco

XLDnaute Barbatruc
Repose en paix
bonjour,

Dans le fichier joint, une extraction par power query (présent dans xl 2019) en colonne C et par formule un peu plus loin (E:F).

Cordialement
 

Pièces jointes

  • Exemple fichier.xlsx
    19.7 KB · Affichages: 4

Jacky67

XLDnaute Barbatruc
Bonjour à tous,

Je suis traducteur et prof domicilié à Pékin. Dans le cadre de mon travail, je reçois des fichiers de glossaire de mes collègues chinois. Même je leur dis souvent de mettre les infos dans deux colonnes distinctes, c'est rarement fait :)

J'aimerais du coup trouver une macro qui me permette de séparer le texte en chinois du texte français.

Je suis débutant en macro, donc tous vos conseils et votre aide sont les bienvenus.
Je vous laisse un document pour vous montrer ce que je souhaiterai obtenir comme résultat.

Bien à vous,
Bonjour à tous
Une proposition par macro avec ce code
VB:
Sub extrait()
    Dim i&, C
    Columns(2).Clear
    For Each C In Range("a1:a" & Cells(Rows.Count, "A").End(xlUp).Row)
        For i = 1 To Len([C])
            If Asc(Mid([C], i, 1)) > 64 And IsNumeric(Left(C, 1)) Then
                C.Offset(, 1) = Mid([C], i, 9 ^ 9)
                Exit For
            End If
        Next
    Next
End Sub
 

Pièces jointes

  • Exemple fichier.xlsm
    18.2 KB · Affichages: 4
Dernière édition:

Blessmywill

XLDnaute Nouveau
Bonsoir Jacky,

Permettez moi dans un premier de saluer votre professionnalisme et votre rapidité pour cet épineux problème (pour moi hahaha). La formule fonctionne parfaitement pour extraire le texte français en un éclair (il me fallait des heures de travail pour réaliser cette opération qui désormais ne prend plus que quelques secondes 🤣 ).

Je vais essayer de comprendre la formule en détail pour la reproduire dans de futurs travaux.

Pourrais-je abuser de votre gentillesse en m'aidant à mettre le texte chinois dans la colonne B et le texte français dans la colonne C ?

Je dois vraiment affuter mes connaissances en VBA, c'est vraiment un outil formidable pour mon travail de traducteur.

Un grand merci à vous !
 

Blessmywill

XLDnaute Nouveau
Bon, je suis stupéfait par ces trois approches différentes, mais toutes aussi efficaces.

Bernard_XLD, votre solution par formules se rapproche le plus de ce que cherche comme résultat, à savoir enlever les chiffres, mettre le chinois en B, et le français en C. Si mon collègue chinois ne colle pas le texte français au chinois, ce marche du tonnerre de dieu.

Quand à votre approche avec une fonction personnalisée, elle permet d'obtenir exactement le résultat que je souhaite. Pour avoir les contenus bruts sans formule, je peux faire un copié collé des valeurs dans les colonnes D et E, et j'ai le résultat parfait.

Roblonchon, votre approche via power query m'a permis de prendre conscience de l'existence de cette solution. Je ne connais rien du tout sur ce point, j'ai commencé à regarder le mécanisme, je pense que je dois aussi étudier cette approche pour d'autres travaux auxquels je serai confronté. Merci encore de ce coup de maître !

Si j'arrive à obtenir le résultat de l'approche de Yeahou avec l'approche de Jacky en VBA (qui me semble plus à mon niveau, c'est vraiment pour progresser en VBA hahhaha) , je crois que je pourrai vous bénir toute ma vie depuis ma douce Chine.

En espérant vous lire
 

job75

XLDnaute Barbatruc
Bonjour Blessmywill, bienvenue sur XLD,

Voyez le fichier joint et la macro du bouton :
VB:
Sub Resultat()
Dim tablo, i&, x$, j%
tablo = [A1].CurrentRegion.Resize(, 2) 'matrice, plus rapide
For i = 1 To UBound(tablo)
    x = tablo(i, 1)
    j = InStr(x, ",")
    If j Then If IsNumeric(Left(x, j - 1)) Then x = Mid(x, j + 1)
    For j = 1 To Len(x)
        If UCase(Mid(x, j, 1)) Like "[A-Z]" Then Exit For
    Next j
    tablo(i, 1) = Trim(Left(x, j - 1))
    tablo(i, 2) = Mid(x, j)
Next i
'---restitution---
With Sheets("Résultat")
    .[A1].Resize(i - 1, 2) = tablo
    .[A1].Offset(.Rows.Count - i + 1, 2).ClearContents 'RAZ en dessous
    .Columns.AutoFit 'ajustement largeurs
    .Activate 'facultatif
End With
End Sub
Edit : je reviens de déjeuner et je vois qu'il y a du monde, bonjour à tous.

A+
 

Pièces jointes

  • Exemple fichier(1).xlsm
    19.1 KB · Affichages: 2
Dernière édition:

Blessmywill

XLDnaute Nouveau
Re Bernard_XLD,

Alors chose étrange, votre avant dernière solution tronque le premier caractère chinois :
par exemple, pour 与某国签署互不侵犯对方网络空间条约 (oui, pour le coup c'est vraiment du chinois !), on obtient comme résultat 某国签署互不侵犯对方网络空间条约.

Quand à votre dernière solution, elle tronque le dernier caractère, c'est à dire :
Pour 与某国签署互不侵犯对方网络空间条约, on obtient 与某国签互不侵对方网络空间条.

Étrange, mais bon, pourquoi pas, je peux le rajouter à la main au pire.

Job 75, bonsoir et merci pour cette participation ! Votre approche est celle qui fonctionne le plus chez moi, sauf qu'elle n'aime pas quand le premier caractère est un accent aigu grave ou circonflexe.

Je reste abasourdi par tant de réactivité, c'est Noël avant l'heure !
 

job75

XLDnaute Barbatruc
Job 75, bonsoir et merci pour cette participation ! Votre approche est celle qui fonctionne le plus chez moi, sauf qu'elle n'aime pas quand le premier caractère est un accent aigu grave ou circonflexe.
Ou tout caractère accentué au début du texte français, alors utilisez ce fichier (2) avec :
VB:
Sub Resultat()
Dim tablo, i&, x$, j%, y$
tablo = [A1].CurrentRegion.Resize(, 2) 'matrice, plus rapide
For i = 1 To UBound(tablo)
    x = tablo(i, 1)
    j = InStr(x, ",")
    If j Then If IsNumeric(Left(x, j - 1)) Then x = Mid(x, j + 1)
    For j = 1 To Len(x)
        y = UCase(Mid(x, j, 1))
        If y Like "[A-Z]" Or InStr("ÀÁÂÃÄÅÒÓÔÕÖØÈÉÊËÌÍÎÏÙÚÛÜÑÇ", y) Then Exit For
    Next j
    tablo(i, 1) = Trim(Left(x, j - 1))
    tablo(i, 2) = Mid(x, j)
Next i
'---restitution---
With Sheets("Résultat")
    .[A1].Resize(i - 1, 2) = tablo
    .[A1].Offset(.Rows.Count - i + 1, 2).ClearContents 'RAZ en dessous
    .Columns.AutoFit 'ajustement largeurs
    .Activate 'facultatif
End With
End Sub
 

Pièces jointes

  • Exemple fichier(2).xlsm
    19.4 KB · Affichages: 3

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
312 472
Messages
2 088 709
Membres
103 928
dernier inscrit
MIKETUAU