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

Macros et VBA Excel Discussion :

Traquer et supprimer des patterns spécifiques [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    Bonjour à tous, Je suis nouveau ici

    Je vous expose en vitesse ma situation: j'ai 18 ans et je fais un stage en entreprise principalement axé sur de l'analyse de donnée. Je n'ai pas accès à Acces et donc je fais ça avec Excel (je n'ai pas le choix). La quantité de donnée à classer m'a forcé (bon ok, je le voulais aussi) à apprendre le Vba. Nous arrivons à mon problème:

    J'ai un tableau avec un certain nombre de donnée (des documents) que je ne peux partager. Les documents sont disposés de cette manière:

    Nom du document - Info 1 - Info 2 - Info3 - ....

    Certaines des colonnes d'infos sont exploitables mais d'autres sont comme celle-ci:

    26;#InfoA
    24;#InfoB;#258;#InfoC
    24;#InfoA;#258;#InfoC

    Je requiert votre aide pour que la macro traque ce genre de patterns "nombre;#" et "#nombre;#" et les supprime. (traquer suffit, je me chargerai du reste ^^)

    Je ne vous demande pas de rédiger toute la macro mais si vous saviez m'apporter des pistes de réponses ou qu'importe ce que vous savez à ce propos, ça m'aiderait Ou alors me dire si c'est impossible. (Même si je pars du principe que rien n'est impossible..)

    J'ai cherché dans le forum et sur internet mais je n'ai rien trouvé qui pouvais m'aider...

  2. #2
    Membre averti
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 199
    Points : 319
    Points
    319
    Par défaut
    Bonjour,

    En gros si j'ai bien compris, vous voulez supprimer les colonnes qui contiennent au moins le caractére # ?

    Cordialement

  3. #3
    Membre expérimenté
    Avatar de tototiti2008
    Homme Profil pro
    Formateur/développeur
    Inscrit en
    Octobre 2008
    Messages
    747
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Formateur/développeur

    Informations forums :
    Inscription : Octobre 2008
    Messages : 747
    Points : 1 332
    Points
    1 332
    Par défaut
    Bonjour AvalonLight, Bonjour GoldStar,

    Comme tu es sur Excel, j'utiliserais les outils d'Excel pour simplifier le travail
    Par exemple, j'utiliserais Convertir (onglet Données) pour séparer tes données en colonnes sur le caractère #
    Après je supprimerais les colonnes superflues
    et je concatenerais en ligne ce qui reste

    Mais une approche d'analyse pure des caractères est possible aussi
    Le plus puissant pour ça c'est RegExp (http://cafeine.developpez.com/access/tutoriel/regexp/) mais pas forcément le plus simple a comprendre
    Sinon on devrait pouvoir bidouiller avec les fonctions VBA de texte natives

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    @Goldstar: Non je veux supprimer les balises devant les infos car ces balises me gènent (et qu'il y en a beaucoup beaucoup)

    @tototiti2008: J'y ai pensé mais des fois il y a 8 infos à la suite, je me suis dit que ça allait ralentir considérablement le processus de suppression et que le fichier risquait de planter avec l'ajout/suppression de colonne. J'ai aussi pensé au find & replace mais ça ne fonctionne pas car il y a un nombre considérable de balises différentes..

    Sinon, merci bcp pour vos réponses

  5. #5
    Membre expérimenté
    Avatar de tototiti2008
    Homme Profil pro
    Formateur/développeur
    Inscrit en
    Octobre 2008
    Messages
    747
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Formateur/développeur

    Informations forums :
    Inscription : Octobre 2008
    Messages : 747
    Points : 1 332
    Points
    1 332
    Par défaut
    Re,

    à tester sur tes lignes

    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
    Function TraiteTexte(Txt As String) As String
    Dim Pattern As String, i As Long, Traite As String
        Traite = Txt
        Pattern = ""
        For i = 1 To Len(Txt)
            If Not IsNumeric(Mid(Txt, i, 1)) And Mid(Txt, i, 1) <> "#" And Mid(Txt, i, 1) <> ";" Then
                Pattern = ""
            ElseIf (IsNumeric(Mid(Txt, i, 1)) Or Mid(Txt, i, 1) = "#") And Pattern = "" Then
                Pattern = Mid(Txt, i, 1)
            ElseIf Pattern <> "" Then
                Pattern = Pattern & Mid(Txt, i, 1)
            End If
            If Pattern Like "#*;[#]" Or Pattern Like "[#]#*;[#]" Then
                Traite = Replace(Traite, Pattern, "")
                Pattern = ""
            End If
        Next i
        TraiteTexte = Traite
    End Function

  6. #6
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 898
    Points : 8 529
    Points
    8 529
    Par défaut
    Salut

    Voila une piste pour limité le temps de recherche/modification, maintenant il reste le plus complexe, c'est à dire comprendre la structure.
    Je pencherais aussi pour les expressions rationnelles comme ça a été proposé par tototiti2008, bien que je ne les ai jamais vraiment utilisées :p

    Voila un début
    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
    Sub FindAndDelSharp()
    Dim TheCell As Range
     
        'On fige le rafraichissement
        Application.ScreenUpdating = False
     
        'A adapter le CodeName de la feuille
        With Feuil1
            'on cherche les cellule contenant le caractère Sharp
            Set TheCell = .Cells.Find("#", , xlValues, xlPart)
            'On crée une boucle
            Do Until TheCell Is Nothing
                'Il faut étudier ici la structure pour ne garder que que les infos
                '....
                '....
                'On refait une nouvelle recherche
                Set TheCell = .Cells.FindNext(TheCell)
            Loop
        End With
     
        'On remet le rafraichissement
        Application.ScreenUpdating = True
     
    End Sub
    Il faudrait avoir une liste exhaustive des cas de figure que tu peux rencontrer pour être sur de faire un code efficace.
    Également savoir si dans les parties "InfoX" il peut y avoir des données numériques ou les caractères "#" ou ";".

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    @Tototiti2008: Génial ça fonctionne!!! Je ne sais pas encore pourquoi mais ça fonctionne x) Je vais m'atteler à le comprendre avant de l'utiliser.

    @Qwazerty: J'ai modifié le nom de la feuille dans la macro mais il me retourne une erreur à la ligne 10 :o En plus je comprend moins cette macro que la function de Toto alors je n'ai pas su la modifier Mais merci quand même d'avoir proposé ta solution


    Merci à tous pour m'avoir aidé

  8. #8
    Membre expérimenté
    Avatar de tototiti2008
    Homme Profil pro
    Formateur/développeur
    Inscrit en
    Octobre 2008
    Messages
    747
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Formateur/développeur

    Informations forums :
    Inscription : Octobre 2008
    Messages : 747
    Points : 1 332
    Points
    1 332
    Par défaut
    Bonjour,

    De rien AvalonLight
    Le code de Qwazerty est complémentaire au mien pour trouver les cellules à traiter

    Je pencherais aussi pour les expressions rationnelles comme ça a été proposé par tototiti2008, bien que je ne les ai jamais vraiment utilisées
    Moi non plus, d'où mon code alambiqué

  9. #9
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 898
    Points : 8 529
    Points
    8 529
    Par défaut
    Salut

    Tu peux nous donner le message d'erreur stp, je ne vois pas bien de quoi cela peu venir, même si aucune cellule ne correspond, cela ne provoque pas de défaut pour autant.


    [Edit]
    Je complète le code avec une solution simple à ton problème je pense.

    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
    Sub FindAndDelSharp()
    'But du code rechercher les cellules contenant #
    'Permet de ne pas avoir à tester toutes les cellules une par une
    Dim TheCell As Range
    Dim TmpTableau, iTab As Integer, StrTmp As String
     
        'On fige le rafraichissement (gain de temps d'execution énorme
        Application.ScreenUpdating = False
     
        'A adapter le CodeName de la feuille
        With Feuil1
            'Le code suivant correspond à une recherche sur la feuille excel (Ctrl+f)
            'on cherche les cellule contenant le caractère Sharp
            Set TheCell = .Cells.Find("#", , xlValues, xlPart)
            'On crée une boucle (la boucle sera executé tant que TheCell ne sera pas "vide", c'est à dire tant qu'on trouvera une cellule contenant # dans la feuille
            Do Until TheCell Is Nothing
                'Il faut étudier ici la structure pour ne garder que que les infos
                'Peut-être comme =ça tout simplement
                TmpTableau = Split(TheCell.Value, ";#")
                'TmpTableau contient maintant le numéro et les info
                'par exemple si la cellule contient 24;#InfoB;#258;#InfoC
                'TmpTableau = Split("24;#InfoB;#258;#InfoC", ";#") 'tu peux activer cette ligne et suivre l'execution du code en mode pas à pas
                'TmpTableau contient 4 lignes
                '24
                'InfoB
                '258
                'InfoC
                'On vide la chaine de sont ancien contenu
                StrTmp = ""
                'Il suffit ensuite de ne garder qu'une ligne sur 2 et de refaire un texte
                For iTab = LBound(TmpTableau) + 1 To UBound(TmpTableau) Step 2
                    'On ajoute un espace entre les informations
                    If StrTmp <> "" Then StrTmp = StrTmp & " "
                    'On ajoute l'info suivante à la suite
                    StrTmp = StrTmp & TmpTableau(iTab)
                Next
                'On met à jour la cellule
                TheCell.Value = strtmp
                'On refait une nouvelle recherche
                'le code suivant correspond à la recherche de la cellule suivant e respectant la recherche de départ(F3)
                Set TheCell = .Cells.FindNext(TheCell)
            Loop
        End With
     
        'On remet le rafraichissement
        Application.ScreenUpdating = True
     
    End Sub
    [/Edit]

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 30/03/2015, 10h45
  2. Supprimer des lignes spécifiques d'un fichier
    Par Noirham dans le forum Langage
    Réponses: 4
    Dernier message: 20/06/2011, 16h50
  3. HELP!Comment supprimer des enregistrements de tables jointes
    Par ROOTPARIS dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 10/06/2004, 16h41
  4. Réponses: 14
    Dernier message: 15/01/2004, 01h15
  5. Réponses: 2
    Dernier message: 12/01/2004, 13h56

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