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 :

Aide macro excel


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Inscrit en
    Juin 2012
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juin 2012
    Messages : 16
    Par défaut Aide macro excel
    Bonjour,

    J'ai un fichier excel contenant les données suivantes sur les casinos en France:


    J'ai donc trois colonnes: Commune, casino, societe

    Je voudrais avoir un fichier excel sous cette forme: Commune, casino, adresse, code_postal, ville, complement_adresse, societe

    Comme vous pouvez le voir le soucis est que certains casinos ont 4 lignes au lieu de trois pour la colonne Casino.

    Je voulais donc savoir si c'était possible de faire une macro pour automatiser ce traitement, et si vous n'auriez pas un tuto ou des noms de commandes à me donner pour que je recherche des détails car pour le moment je ne trouve rien.
    Fichiers attachés Fichiers attachés

  2. #2
    Membre Expert Avatar de ZebreLoup
    Homme Profil pro
    Ingénieur Financier
    Inscrit en
    Mars 2010
    Messages
    994
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Financier
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 994
    Par défaut
    On peut le faire assez facilement, mais il faudrait une règle de traitement spécifique vu que le nombre de lignes peut varier. Peut-être que par exemple, on est sûr que la dernière ligne est toujours Code Postal + Ville et la première Nom du casino. Sinon, ce sera comme de jouer à la roulette (désolé, mais je n'ai pas pu me retenir)

  3. #3
    Membre expérimenté Avatar de L'Albatros
    Homme Profil pro
    Chercheur en économie - statistique
    Inscrit en
    Avril 2012
    Messages
    150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur en économie - statistique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2012
    Messages : 150
    Par défaut
    Pour commencer, on peut isoler facilement le code postal.
    Ici, ce champ a 3 propriétés:
    • il est composé uniquement de chiffres
    • il est composé de 5 caractères
    • il se situe en "fin de cellule"
    on peut donc faire un double filtre:
    • on prélève tous les chiffres présents dans une cellule
    • on filtre pour ne garder que les 5 derniers chiffres

    cf code ci-dessous, assez sale, mais facilement intégrable
    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
    Sub trouve_isole_code_postal()
     
    Dim c As Range
    Dim i As Integer, x As String, n As String
    b = 1
     
    Sheets("Feuil1").Select 'Sélection de la feuille contenant les données sources
    Range("A1:A100").Select 'Sélection de la colonne des adresses
     
    'Prélève les chiffres et les copie sur la même colonne mais en feuille 2
    For Each c In Selection
        For i = 1 To Len(c)
            x = Mid(c, i, 1)
            If IsNumeric(x) Then n = n & x
        Next i
        If n <> "" Then
            Sheets("Feuil2").Range("A" & b).Value = n
            n = ""
            b = b + 1
        End If
     
    Next c
     
    'Pointe sur la feuille 2 et prélève les 5 derniers chiffres de la colonne nouvellement créée (un code postal a toujours 5 chiffres
    Sheets("Feuil2").Select
     
    'Ecrit le code postale dans la colonne juste à côté
    For i = 1 To 100
        Cells(i, 2) = Right(Cells(i, 1), 3)
    Next i
     
    End Sub

  4. #4
    Membre Expert
    Avatar de pc75
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    3 662
    Détails du profil
    Informations personnelles :
    Âge : 70
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 3 662
    Par défaut
    Bonjour,

    Je me suis "amusé" à bricoler un petit truc.

    Il y a certainement des adaptations à faire.
    Fichiers attachés Fichiers attachés

  5. #5
    Membre Expert Avatar de ZebreLoup
    Homme Profil pro
    Ingénieur Financier
    Inscrit en
    Mars 2010
    Messages
    994
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Financier
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 994
    Par défaut
    Voici ce que j'ai fait de mon coté
    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
    Option Explicit
     
    Public Sub TransformeListeCasino()
     
        Dim ws1 As Worksheet, ws2 As Worksheet
     
        Dim commune As String
        Dim casino As String
        Dim adresse As String
        Dim codePostal As Long
        Dim ville As String
        Dim complementAdresse As String
        Dim societe As String
     
        Dim i1, i2 As Integer
        Dim maxRow As Integer
        Dim row2 As Integer
     
        Set ws1 = Worksheets("FeuilleOriginale")
        Set ws2 = Worksheets("FeuilleDestination")
     
        maxRow = ws1.Range("B65000").End(xlUp).Row
     
        i1 = 2
        row2 = 2
        commune = ws1.Cells(i1, 1).Value
     
        Do While commune <> ""
            'On cherche la ligne de la commune suivante
            i2 = i1 + 1
            Do While ws1.Cells(i2, 1).Value = "" And i2 <= maxRow
                i2 = i2 + 1
            Loop
     
            societe = ws1.Cells(i1, 3).Value
            casino = ws1.Cells(i1, 2).Value
            adresse = ws1.Cells(i2 - 2, 2).Value
            codePostal = Left(ws1.Cells(i2 - 1, 2).Value, 5)
            ville = Right(ws1.Cells(i2 - 1, 2).Value, Len(ws1.Cells(i2 - 1, 2).Value) - 6)
            complementAdresse = IIf(i2 - i1 >= 4, ws1.Cells(i2 - 3, 2).Value, "")
     
            ws2.Cells(row2, 1).Value = commune
            ws2.Cells(row2, 2).Value = casino
            ws2.Cells(row2, 3).Value = adresse
            ws2.Cells(row2, 4).Value = codePostal
            ws2.Cells(row2, 5).Value = ville
            ws2.Cells(row2, 6).Value = complementAdresse
            ws2.Cells(row2, 7).Value = societe
            row2 = row2 + 1
     
            i1 = i2
            commune = ws1.Cells(i1, 1).Value
        Loop
     
    End Sub
    @l'Albatros : Je n'ai pas bien compris ce que tu essayais de faire dans ton code, mais juste une remarque : On essaie régulièrement de sensibiliser les débutants pour qu'ils évitent au maximum les Select ou Activate dans leur code (vraiment une grosse source d'erreurs et de ralentissements potentiels), alors il serait surement mieux d'essayer de leur proposer du code sans ça.

    Je précise que mon code part du principe que les données de la colonne B sont sur plusieurs lignes et que les cellules des colonnes A et C sont fusionnées, ce qui me semblait être le cas dans la capture d'écran, d'où la différence avec les autres codes.

  6. #6
    Membre averti
    Inscrit en
    Juin 2012
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juin 2012
    Messages : 16
    Par défaut
    Merci de votre aide.

    @L'Albatros: Je vais tester ton script.

    @pc75: As tu mis ta macro das ton fichier xls?
    Je ne la vois pas.

  7. #7
    Membre Expert
    Avatar de pc75
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    3 662
    Détails du profil
    Informations personnelles :
    Âge : 70
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 3 662
    Par défaut
    Citation Envoyé par gregtw29 Voir le message
    Merci de votre aide.

    @L'Albatros: Je vais tester ton script.

    @pc75: As tu mis ta macro das ton fichier xls?
    Je ne la vois pas.
    Elles sont dans l'éditeur Visual Basic ; ce sont des fonctions personnalisées.

  8. #8
    Membre averti
    Inscrit en
    Juin 2012
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juin 2012
    Messages : 16
    Par défaut
    Oui c'est exactement cela qu'il me faut.

    J'ai vu les codes dans l'éditeur VB:
    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
    Function Casino(Origine As String) As String
        For i = 1 To Len(Origine)
            If Asc(Mid(Origine, i, 1)) = 10 Then
                Casino = Left(Origine, i - 1)
                Exit For
            End If
        Next
    End Function
     
    Function Postal(Origine As String) As String
        For i = Len(Origine) - 2 To 1 Step -1
            If Asc(Mid(Origine, i, 1)) >= 48 And Asc(Mid(Origine, i, 1)) <= 57 Then
                Postal = Mid(Origine, i - 4, 5)
                Exit For
            End If
        Next
    End Function
     
    Function Adresses(Origine As String) As String
        For i = 1 To Len(Origine)
            If Asc(Mid(Origine, i, 1)) = 10 Then
                DebAdresse = i + 1
                Chaine = Mid(Origine, i + 1)
                Exit For
            End If
        Next
     
        For i = Len(Chaine) - 2 To 1 Step -1
            If Asc(Mid(Chaine, i, 1)) >= 48 And Asc(Mid(Chaine, i, 1)) <= 57 Then
                FinAdresse = i - 6
                Adresses = Mid(Chaine, 1, i - 6)
                Exit For
            End If
        Next
    End Function
     
    Function Ville(Origine As String) As String
        For i = Len(Origine) - 2 To 1 Step -1
            If Asc(Mid(Origine, i, 1)) >= 48 And Asc(Mid(Origine, i, 1)) <= 57 Then
                Ville = Mid(Origine, i + 2)
                Exit For
            End If
        Next
    End Function
    Du coup je créé la macro "tri", ce qui me créé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub tri()
     
    End Sub
    Que faudrait-il mettre dans le main pour que ça me donne les résultats que tu as obtenu?
    Désolé mais je débute dans les macro, je capte ton code mais je ne sais pas comment appeler les fonction dans mon main.

  9. #9
    Membre Expert Avatar de ZebreLoup
    Homme Profil pro
    Ingénieur Financier
    Inscrit en
    Mars 2010
    Messages
    994
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Financier
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 994
    Par défaut
    Attention, le code de pc75 marche très bien si les différentes lignes viennent d'un passage à la ligne dans une cellule (via Alt+Enter par exemple). Vérifie donc ce point avant de partir sur sa solution ou sur la mienne. (Ta copie d'écran laissait entrevoir des bordures et donc des cellules différentes)

  10. #10
    Membre averti
    Inscrit en
    Juin 2012
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juin 2012
    Messages : 16
    Par défaut
    En effet.

    J'ai testé ton code mais j'ai l'erreur suivante:

    Erreur d’exécution '9':
    L'indice n'appartient pas à la sélection.
    J'ai rajouté mon excel en fichier joint dans mon premier message si ça peut vous aider.

  11. #11
    Membre Expert
    Avatar de pc75
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    3 662
    Détails du profil
    Informations personnelles :
    Âge : 70
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 3 662
    Par défaut
    Citation Envoyé par gregtw29 Voir le message
    Que faudrait-il mettre dans le main pour que ça me donne les résultats que tu as obtenu?
    Désolé mais je débute dans les macro, je capte ton code mais je ne sais pas comment appeler les fonction dans mon main.
    Dans une cellule vide tu fais insertion => fonction personnalisée et tu choisis la fonction "Casino" que tu fais pointer sur la cellule initiale.
    Tu répètes la même chose sur d'autres cellules vides pour les autres fonctions.
    Enfin, tu étires les formules vers le bas.

    Edit : Désolé, je n'avais pas vu que chaque ligne correspondait à une cellule. Donc mon truc ne peut pas fonctionner.

  12. #12
    Membre averti
    Inscrit en
    Juin 2012
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juin 2012
    Messages : 16
    Par défaut
    Si j'ai reussis à mettre les 3 ou 4 infos dans une même cellule avec Calc de Libreoffice, et j'ai bien un xls comme il faut pour ta macro.

    Seulement même sur ton fichier adresse.xls je n'arrive pas à relancer ta macro.

    Je l'ai bien dans l'éditeur Visual Basic.
    Je clique donc sur la flèche verte et je l'enregistre sous le nom "casinos".

    Cependant quand je clique sur une cellule vide je ne vois pas le lien "insertion => fonction personnalisée"


    EDIT: J'ai trouvé.
    Fichiers attachés Fichiers attachés

  13. #13
    Membre Expert Avatar de ZebreLoup
    Homme Profil pro
    Ingénieur Financier
    Inscrit en
    Mars 2010
    Messages
    994
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Financier
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 994
    Par défaut
    As-tu modifié le nom des feuilles dans le code que je t'ai fourni ? J'avais mis n'importe quoi car je ne pouvais pas deviner comment était ton fichier.

    Voici le code modifié adapté à ton fichier casinos.xls. J'ai fait quelques modifs pour prendre en compte les cas où il y avait des lignes vides dans la colonne B. J'ai aussi rajouter manuellement les noms des colonnes sur la première ligne de Feuil2
    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
    Option Explicit
     
    Public Sub TransformeListeCasino()
     
        Dim ws1 As Worksheet, ws2 As Worksheet
     
        Dim commune As String
        Dim casino As String
        Dim adresse As String
        Dim codePostal As String
        Dim ville As String
        Dim complementAdresse As String
        Dim societe As String
     
        Dim i1 As Integer, i2 As Integer
        Dim j1 As Integer, j2 As Integer
        Dim maxRow As Integer
        Dim row2 As Integer
     
        Set ws1 = Worksheets("Feuil1")
        Set ws2 = Worksheets("Feuil2")
     
        maxRow = ws1.Range("B65000").End(xlUp).Row
        ws2.Range("A2:G65000").ClearContents
     
        i1 = 2
        row2 = 2
        commune = ws1.Cells(i1, 1).Value
     
        Do While commune <> ""
            'On cherche la ligne de la commune suivante
            i2 = i1 + 1
            Do While ws1.Cells(i2, 1).Value = "" And i2 <= maxRow
                i2 = i2 + 1
            Loop
     
            'On cherche la première ligne non vide en colonne B
            j1 = i1
            Do While ws1.Cells(j1, 2).Value = ""
                j1 = j1 + 1
            Loop
            'On cherche la dernière ligne non vide en colonne B
            j2 = i2 - 1
            Do While ws1.Cells(j2, 2).Value = ""
                j2 = j2 - 1
            Loop
     
            societe = ws1.Cells(i1, 3).Value
     
            casino = ws1.Cells(j1, 2).Value
            adresse = ws1.Cells(j2 - 1, 2).Value
            codePostal = ws1.Cells(j2, 2).Value
            If Len(codePostal) > 6 Then
                ville = Right(codePostal, Len(codePostal) - 6)
            Else
                ville = ""
            End If
            codePostal = Left(codePostal, 5)
            complementAdresse = IIf(j2 - j1 >= 3, ws1.Cells(j2 - 2, 2).Value, "")
     
            ws2.Cells(row2, 1).Value = commune
            ws2.Cells(row2, 2).Value = casino
            ws2.Cells(row2, 3).Value = adresse
            ws2.Cells(row2, 4).Value = codePostal
            ws2.Cells(row2, 5).Value = ville
            ws2.Cells(row2, 6).Value = complementAdresse
            ws2.Cells(row2, 7).Value = societe
            row2 = row2 + 1
     
            i1 = i2
            commune = ws1.Cells(i1, 1).Value
        Loop
     
    End Sub

  14. #14
    Membre averti
    Inscrit en
    Juin 2012
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juin 2012
    Messages : 16
    Par défaut
    Oui la première erreur était du à cela.

    Mais après il y 'en a d'autres:

    Incompatibilité de type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    codePostal = Left(ws1.Cells(i2 - 1, 2).Value, 5)
    Erreur définie par l'application ou par l'objet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    complementAdresse = IIf(i2 - i1 >= 4, ws1.Cells(i2 - 3, 2).Value, "")

    EDIT: ton dernier script marche bien.
    Il y a quelques erreurs pour le code postal mais je vais regler cela.
    Maintenant que ça fonctionne je peux me plonger dans la modification.

    Thanks.

  15. #15
    Membre Expert Avatar de ZebreLoup
    Homme Profil pro
    Ingénieur Financier
    Inscrit en
    Mars 2010
    Messages
    994
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Financier
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 994
    Par défaut
    Dans le dernier code j'ai modifié codePostal en String pour ne pas avoir l'erreur en cas de problème, mais de toute façon, ce n'était plus le cas car c'était à cause du décalage du aux cellules vides.

  16. #16
    Membre averti
    Inscrit en
    Juin 2012
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juin 2012
    Messages : 16
    Par défaut
    Oui merci, il y a juste quelques codes postaux qui sont en adresse mais je vais régler le soucis.

  17. #17
    Membre Expert Avatar de ZebreLoup
    Homme Profil pro
    Ingénieur Financier
    Inscrit en
    Mars 2010
    Messages
    994
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Financier
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 994
    Par défaut
    Oui, je n'avais pas vu que certaines cellules de la colonne A n'étaient pas fusionnées, peut-être en cherchant i1 et i2 via la colonne C du coup si il n'y a pas de souci du fusion sur cette colonne (et en modifiant un peu pour prendre les deuxièmes lignes de A quand il y en a).

    Mais bon, VBA n'est pas un être intelligent et ne peut pas deviner tout seul, donc s'il n'y a pas une certaine logique dans les données initiales, c'est impossible de prévoir tous les cas (disons que l'on passerait plus de temps à programmer tous les cas qu'à faire les choses manuellement)

    En modifiant la ligne 33
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Do While ws1.Cells(i2, 1).Value = "" And i2 <= maxRow
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Do While ws1.Cells(i2, 3).Value = "" And i2 <= maxRow
    Ça a l'air de marcher. Il reste à ajouter les régions entre parenthèses quand il y en a et il y a toujours les cas où l'ordre de l'adresse et du complément d'adresse sont inversés.

Discussions similaires

  1. Aide macro excel
    Par Orbichoox dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 22/05/2012, 10h29
  2. aide macro excel
    Par bensof1 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 04/03/2011, 20h39
  3. Aide macro excel débutant
    Par obie78 dans le forum Macros et VBA Excel
    Réponses: 20
    Dernier message: 24/08/2010, 21h25
  4. [XL-2007] Aide macro excel
    Par maxxxime dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 07/06/2010, 15h13
  5. Aide macro Excel
    Par lololasticot dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 10/11/2007, 12h53

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