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 :

Erreur de boucle [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Invité
    Invité(e)
    Par défaut Erreur de boucle
    Bonjour,

    J'ai un fichier excel qui recupere dans un split de la colonne 4 de la ligne en cours (prénoms séparés par une virgule ou un seul prénom si c'est le cas) puis la passe dans une boucle pour les insérer dans la feuille dans la lgine à la suite du premier prénom (s'il y a lieu)

    Je récupère en outre les données de la colonne 1 et 2 de la ligne du dessus et incrémente en colonne 3 un tableau qui numérote les prénoms comme suit :

    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
    Dim montab() As String
    Dim montab1(5) As String
    montab = Split((Sheets(onglet).Cells(LigneLue, 4).Value), ",")
    montab1(0) = "PU": montab1(1) = "UN": montab1(2) = "DX": montab1(3) = "TR": montab1(4) = "QU"
    y = LBound(montab1)
     
           For x = LBound(montab) To UBound(montab)
                If x = 0 Then
                    Sheets(onglet).Cells(LigneLue, 3) = montab1(y)
                    Sheets(onglet).Cells(LigneLue, 4) = montab(x)
                Else
                    Rows(LigneLue + 1).Insert Shift:=xlDown
                    Sheets(onglet).Cells(LigneLue + 1, 1) = Sheets(onglet).Cells(LigneLue, 1)
                    Sheets(onglet).Cells(LigneLue + 1, 2) = Sheets(onglet).Cells(LigneLue, 2)
                    Sheets(onglet).Cells(LigneLue + 1, 3) = montab1(y + 1)
                    Sheets(onglet).Cells(LigneLue + 1, 4) = LTrim(montab(x))
                End If
            Next x
    ca fonctionne bien pour les prénoms mais mon souci est que la colonne 3 ne s'incrémente pas correctement : lorsque j'ai par exemple 2 prénoms dans mon split, elle mets le 1 à PU puis le 2eme à UN et modifie ensuite le deuxième pour le passer à PU.

    Je suppose qu'il s'agit d'un problème de boucle simple mais je n'arrive pas à m'en dépatouiller.

    Quelqu'un pourrait-il me venir en aide ?

    Merci
    Dernière modification par SfJ5Rpw8 ; 19/02/2014 à 20h47.

  2. #2
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut

    Bonjour,




    Sinon pas besoin de boucle, exemple à tester dans un classeur vierge :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub Demo()
        SP = Split("Albert,Bernard,Charles,Denis,Edouard", ",")
        [C2].Resize(, UBound(SP) + 1).Value = SP
    End Sub

  3. #3
    Invité
    Invité(e)
    Par défaut
    Merci Marc-L !

    Formulation très intéressant lorsqu'on veux découper le string en colonnes mais lorsqu'on veut insérer le string sur plusieurs lignes qu'on crée, ça ne fonctionne pas ...

    De plus, mon véritable souci se situe sur le tableau de string montab1 qui contient la "place" à donner à chaque prénom comme ceci :

    Numéro 1 --> date --> PU --> Prénom (1)
    Numéro 1 --> date --> UN --> Prénom (2)
    Numéro 1 --> date --> DX --> Prénom (3)
    Numéro 2 --> date --> PU --> Prénom (1)
    Numéro 3 --> date --> PU --> Prénom (1)
    Numéro 3 --> date --> UN --> Prénom (1)
    Numéro 4 --> date --> PU --> Prénom (1)

    Mon code fonctionne pour l'insertion et la copie des numéros, date et Prénoms mais il met systématiquement PU ...

    Le voici :

    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
     
    Dim montab() As String
    Dim montab1() As String
    montab = Split((Sheets(onglet).Cells(LigneLue, 4).Value), ",")
    montab1 = Split("PU,UN,DX,TR,QU", ",")
    y = LBound(montab1)
     
    For x = LBound(montab) To UBound(montab)
         If x = 0 Then
              Sheets(onglet).Cells(LigneLue, 3) = montab1(y)
              Sheets(onglet).Cells(LigneLue, 4) = montab(x)
         Else
              Rows(LigneLue + 1).Insert Shift:=xlDown
              Sheets(onglet).Cells(LigneLue + 1, 1) = Sheets(onglet).Cells(LigneLue, 1)
              Sheets(onglet).Cells(LigneLue + 1, 2) = Sheets(onglet).Cells(LigneLue, 2)
              Sheets(onglet).Cells(LigneLue + 1, 3) = montab1(y + 1)
              Sheets(onglet).Cells(LigneLue + 1, 4) = LTrim(montab(x))
         End If
    Next x


    Merci d'avance pour votre aide

  4. #4
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut A tester :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub DemoV()
        SP = Split("Albert,Bernard,Charles,Denis,Edouard", ",")
        [C2].Resize(UBound(SP) + 1).Value = Application.Transpose(SP)
    End Sub
    Si cela ne suffit pas, comme je ne capte pas vraiment, un classeur en pièce jointe
    comportant une feuille Origine et une autre Résultat éclaircirait le besoin …

  5. #5
    Invité
    Invité(e)
    Par défaut
    Waouh ... très impressionnant comme ça ...

    Je ne sais pas encore si ça pourrait être utile à mon propos étant donné que je dois faire ressortir ce que tu trouveras dans l'onglet RESULTAT de la pièce jointe

    Merci en tout cas pour cette formule que je vais garder précieusement au cas où !

    Cordialement

  6. #6
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut

    En fait c'est la fonction de feuille de calculs TRANSPOSE, B-A-BA d'Excel …

    Je vais consulter la pièce jointe …

  7. #7
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    La première ligne de l'indice 40 de la colonne 1 dans la feuille RESULTAT est fausse …

    Sinon voici un exemple traitant l'intégralité de la feuille :

    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
    Sub Demo()
        ORIG = [A1].CurrentRegion.Value:  If UBound(ORIG, 2) < 4 Then Beep: Exit Sub
        COL3 = Split("PU UN DX TR QU"):   ReDim TR(1 To 4, 1 To UBound(ORIG) - 1)
     
        For R& = 2 To UBound(ORIG)
            SPLT = Split(ORIG(R, 4), ",")
     
            If UBound(SPLT) > -1 Then
                M& = Application.Min(UBound(COL3), UBound(SPLT))
                If UBound(TR, 2) < L& + M + 1 Then ReDim Preserve TR(1 To 4, 1 To L + M + 1)
     
                For C& = 0 To M
                     L = L + 1:  TR(1, L) = ORIG(R, 1):  TR(2, L) = ORIG(R, 2):  TR(3, L) = COL3(C)
                                 TR(4, L) = Application.Proper(Trim(SPLT(C)))
                Next
            End If
        Next
     
        [A2:D2].Resize(UBound(TR, 2)).Value = Application.Transpose(TR)
    End Sub
    _______________ ____________________________________ ______________________________

    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion …

  8. #8
    Invité
    Invité(e)
    Par défaut
    Bonsoir Marc-L,

    Oui, j'ai vu pour la ligne 40 ... J'aime bien ton humour "Ba-ba d'Excel" ... Je ne suis pas développeur, moi !

    En tout cas, je n'attendais pas un code aussi complet ... et complexe pour moi, debutant en VBA ! Puis -je abuser de ta gentillesse et te demander de m'affranchir sur la signification de chaque ligne ?

    Je vais digérer tout ça ...

    Puis -je abuser de ta gentillesse et te demander de m'affranchir sur la signification de chaque ligne ?

    merci et ... Respect !!!
    Dernière modification par Invité ; 21/02/2014 à 23h17.

  9. #9
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut

    Min, Proper & Transpose précédées de Application. sont des fonctions de feuille de calculs.

    Proper étant en VBA (natif en anglais) la fonction NOMPROPRE de la version française …

    ORIG est la variable tableau en lignes par colonnes de la saisie d'origine et TR celle du
    résultat inversée en colonnes par lignes, voir l'aide de ReDim pour en comprendre la raison !

    L'utilisation de variables tableau permet de simplifier le code et de le rendre plus véloce : lecture unique de
    la saisie (ligne n°2), traitement en mémoire (lignes 5 à 17) puis écriture globale du résultat (ligne n°19) …

    Sécurités en lignes n°2, 8, 9 & 10 …
    Ne pas oublier l'aide intégrée de VBA : curseur sur une instruction puis touche !

    Même ayant des notions antérieures de BASIC, j'ai appris le VBA à 90% en consultant son aide et
    en utilisant l'Enregistreur de macros, le reste c'est l'expérience et les astuces glanées de forum en forum …

    Si vraiment une ligne est difficile à décoder, indiquer alors son n° …

  10. #10
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut

    Code modifié pour une sécurité …

    En comparant les lignes n°15 & 16 du code d'origine avec les miennes n°13 & 14,
    tu dois facilement trouver et comprendre ton erreur …


    Citation Envoyé par itavodev Voir le message
    J'aime bien ton humour "Ba-ba d'Excel" ... Je ne suis pas développeur, moi !
    En fait par B-A-BA j'entends utilisation de base d'Excel car tout utilisateur peut saisir
    une formule dans une feuille de calculs, rien à voir donc avec du développement en VBA …

    Souvent les développeurs VBA oublient le fonctionnement de base d'Excel (moi le premier hélas !),
    ses puissantes formules de calculs pouvant leur éviter une usine à gaz en VBA …

  11. #11
    Membre chevronné
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    473
    Détails du profil
    Informations personnelles :
    Localisation : France, Vendée (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 473
    Par défaut
    Salut

    Comme la vitesse de la lumière est supérieure à celle du son, certains ont l'air brillant avant d'avoir l'air con !
    Bien obligé de te donner des points ! Car là je me sent "con" !

    Si tout le monde pouvait fonctionné comme ceci dans les blogues! Respect !

  12. #12
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut

    Citation Envoyé par jijie Voir le message
    Bien obligé de te donner des points !
    J'aurais aimé que le demandeur fasse de même ‼

    C'est le souci avec ce genre de maxime, elle peut être mal prise par le lecteur,
    soudainement se sentant visé et j'ai du reste déjà rencontré cette méprise ici même !

    Ce n'est que ma signature par défaut, reflétant peut-être un esprit franchouillard
    mais c'est vrai s'appliquant aisément dans de nombreuses situations quotidiennes, et pas que sur le net …

    De temps en temps, j'en glisse une autre, plus ou moins premier degré, triviale,
    il faut bien satisfaire le plus grand nombre !

    Un exemple (il ne te concerne pas !) toujours sur le même thème mais plus … voir moins … bref !

    __________________________________________________________________________________________
    Quand on est mort, on ne le sait pas, c'est pour les autres que c'est difficile … Quand on est con, c'est pareil !

  13. #13
    Membre chevronné
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    473
    Détails du profil
    Informations personnelles :
    Localisation : France, Vendée (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 473
    Par défaut
    re salut marc

    Bon je m'explique: j'ai utilisé ta citation pour moi même car n'étant pas développeur je m'auto-satisfait pour mais petite réalisation. (mais ma lumière à ses limites!)

    Mais en tant qu'autodidacte je puise mais connaissances sur le net, et en voyant les posts trés explicatifs que tu nous donnes alors oui ça mérite les points que je t'ais laissé!

    Bon voila c'est dit , et encore merci!

    PS ta dernière citation n'est pas mal nom plus!

  14. #14
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut

    Merci de ton retour sympathique !

    Je ne pense vraiment pas faire partie de ceux donnant le plus de détails, déjà par manque de temps,
    mais comme souvent l'information est à portée de clic (aides intégrées Excel et VBA, FAQ, tutoriels, …),
    je préfère guider le demandeur pour l'amener à trouver par lui-même, bien plus valorisant et formateur !

    Parfois j'en secoue un peu, cela peut piquer même ! Mais c'est le seul moyen parfois pour progresser …


    __________________________________________________________________________________________
    - A ton avis, quel est le plus grand mal de notre époque : l'ignorance ou l'indifférence ?
    - J' sais pas et j' m'en fous !


  15. #15
    Invité
    Invité(e)
    Par défaut
    Bonjour Marc-L

    Je ne sais pas comment te donner des points mais je vais regarder !

    Je ferme cette discussion et te dis encore "Merci" pour cette leçon d'excel 'basique" ...

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 05/11/2009, 12h47
  2. Erreur inconnue : boucle infinie?
    Par dubitoph dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 06/10/2009, 10h05
  3. Erreur sur boucle for
    Par philippef dans le forum Langage
    Réponses: 2
    Dernier message: 04/07/2008, 14h44
  4. [Tableaux] Erreur dans Boucle
    Par mickado dans le forum Langage
    Réponses: 11
    Dernier message: 25/01/2007, 12h52
  5. Erreur de boucle
    Par koala64 dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 28/05/2005, 17h35

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