Macro pour préparer du texte ?

Bonjour,

Je reçois des fichiers excel contenant une liste d'entrées, toujours dans une colonne unique mais avec un nombre variable qui peut être assez important (plusieurs dizaines parfois).

Exemple :

0AB;A1

0AB;B2

0AC;C3

Je peux utiliser ces entrées dans un autre logiciel pour obtenir d'autres informations, sous forme de ligne de commande.

Pour ce faire, je dois préparer ces données mais c'est laborieux et comme c'est très répétitif, je vous sollicite pour savoir une macro permettrait d'automatiser un peu plus le process suivant ?

1/ Garder uniquement les 5 derniers caractères

2/ Remplacer les ; par ,

3/ Supprimer les doublons

4/ ligne de commande attendue (c'est à dire implémenter les entrées dans le texte qui n'évolue pas) :

SELECT * FROM Document WHERE datascheme:idu LIKE 'AB,A1' AND lastrecord = yes

OR datascheme:idu LIKE 'AB,B2' AND lastrecord = yes

OR datascheme:idu LIKE 'AC,C3' AND lastrecord = yes

Pensez-vous qu'une macro puisse faire cela ? Sachant que les nombres d'entrées changent à chaque fois !

Dans l'attente de vous lire, j'y retourne !

Merci d'avance pour votre aide !

Bonjour,

Oui je pense que c'est possible de faire ça par macro:

1/ Garder uniquement les 5 derniers caractères

Right(texte,5) 'renvoie les 5 derniers caractères d'un texte

2/ Remplacer les ; par ,

Replace(texte, ";", ",") 'renvoie le texte en remplaçant tous les ";" par ","

3/ Supprimer les doublons

En utilisant un objet Collection, on peut savoir si on a déjà recontré une ligne identique et snober les doublons


4/ ligne de commande attendue (c'est à dire implémenter les entrées dans le texte qui n'évolue pas) :

For Each valeur in colec
    resultat = IIf(resultat = "", "SELECT * FROM Document WHERE", "OR") & " datascheme:idu LIKE '" & _
    valeur & "' AND lastrecord = yes"
Next valeur

SELECT * FROM Document WHERE datascheme:idu LIKE 'AB,A1' AND lastrecord = yes

OR datascheme:idu LIKE 'AB,B2' AND lastrecord = yes

OR datascheme:idu LIKE 'AC,C3' AND lastrecord = yes

On peut très bien faire ça avec une macro

Bonjour,

En supposant que ta plage de valeurs débute en A1, et que la référence Microsoft Forms x.x Object Library soit activée (Outils > Références... dans l'éditeur VBA) :

Public Sub Preparer()
    Dim i%, chaine$, valeur$
    Dim chaineOK As New dataObject
    Dim dico As Object: Set dico = CreateObject("Scripting.Dictionary")
    chaine = "SELECT * FROM Document WHERE"
    For i = 1 To Range("A1").End(xlDown).Row
        valeur = Right(Replace(Cells(i, 1).Value, ";", ","), 5)
        If Not dico.exists(valeur) Then
            dico(valeur) = ""
            chaine = chaine & IIf(i > 1, " OR ", " ") & "datascheme:idu LIKE '" & valeur & "' AND lastrecord = yes"
        End If
    Next i
    chaineOK.SetText chaine
    chaineOK.PutInClipboard
End Sub

Le code copie la chaîne dans le presse-papiers.

Excellente nouvelle !

Merci à tous les deux pour votre aide !

Par contre je suis un peu perdu avec la macro d'oyobrans sur la marche à suivre

J'ai créé une macro Test mais quand je l'execute c'est indiqué Erreur de compilation type défini par l'utilisateur non défini ?

Que dois je en conclure ?

Merci encore, vous êtes géniaux !

Tu as bien activé la référence ?

Non, je te prie de m'excuser, je m'étais trompé de référence, elle n'existait pas dans le référentiel. J'ai du ajouter FM20.dll et à présent je n'ai plus l'erreur !

Ca copie/colle bien dans le presse papiers mais seulement la première entrée et pas les suivantes. Est-ce que j'ai raté autre chose ?

Merci encore !

Pas de cellules vides dans ta colonne ?

Joins un fichier éventuellement, c'est plus simple.

Non pas de vide

Envoie un fichier.

J'ai modifié le code que j'avais envoyé, il y avait un souci.

5classeur1.xlsm (19.45 Ko)

Ca fonctionne, et c'est miraculeux !

Tu vas me faire gagner un sacré temps ! Mille mercis !

Merci à tous les deux, vraiment !

Pour chipoter ( ), s'il y a une entête de colonne et que je veux commencer le traitement à A2, c'est possible ? J'ai essayé de remplacer A1 par A2 mais ça n'a pas l'air de faire effet

For i=2...

Public Sub Preparer()
    Dim i%, chaine$, valeur$
    Dim chaineOK As New dataObject
    Dim dico As Object: Set dico = CreateObject("Scripting.Dictionary")
    chaine = "SELECT * FROM Document WHERE"
    For i = 2 To Range("A1").End(xlDown).Row
        valeur = Right(Replace(Cells(i, 1).Value, ";", ","), 5)
        If Not dico.exists(valeur) Then
            dico(valeur) = ""
            chaine = chaine & IIf(i > 2, " OR ", " ") & "datascheme:idu LIKE '" & valeur & "' AND lastrecord = yes"
        End If
    Next i
    Set dico = Nothing
    chaineOK.SetText chaine
    chaineOK.PutInClipboard
End Sub

Merci à tous, vraiment !

Question subsidiaire, dans le cas où pour une cellule il y a plusieurs entrées séparées par un tiret, est-ce que c'est faisable de faire un "convertir vertical" avant de lancer la super macro que vous m'avez donné ?

Sachant que pour corser le tout... le nombre d'entrées peut être variable (donc il peut y avoir 0, 1 ou n tirets)

J'ai pas l'impression que ce soit possible d'après les topics que j'ai parcouru mais sait-on jamais, je relance une bouteille à la mer !

Bonjour,

Une proposition en PJ.

Public Sub Preparer()
    Dim i%, j%, chaine$, valeur$, tableau() As String
    Dim chaineOK As New dataObject
    Dim dico As Object: Set dico = CreateObject("Scripting.Dictionary")
    chaine = "SELECT * FROM Document WHERE"
    For i = 2 To Range("A1").End(xlDown).Row
        ReDim tableau(Len(Replace(Cells(i, 1).Value, "-", "--")) - Len(Cells(i, 1).Value))
        tableau = Split(Cells(i, 1).Value, "-")
        For j = 0 To UBound(tableau)
            valeur = Right(Replace(tableau(j), ";", ","), 5)
            If Not dico.exists(valeur) Then
                dico(valeur) = ""
                chaine = chaine & IIf(i > 2, " OR ", " ") & "datascheme:idu LIKE '" & valeur & "' AND lastrecord = yes"
            End If
        Next j
    Next i
    Set dico = Nothing
    chaineOK.SetText chaine
    chaineOK.PutInClipboard
End Sub
0preparequete.xlsm (21.19 Ko)
Rechercher des sujets similaires à "macro preparer texte"