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 :

vb variable dynamique [XL-2003]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 533
    Par défaut vb variable dynamique
    Bonjour à tous !

    Voici ma procédure :

    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
    Private Sub btn_dupliquer_Click()
    Dim i As Integer
    Dim dateAmortDero As String
    Dim DerniereLigne As Long
    
    DerniereLigne = Cells(Rows.Count, 1).End(xlUp).RowdateAmortDero = "31/12/2009"
    
     For i = 13 To DerniereLigne
        If Range("A" & i).Value <> "" Then
            If Range("A" & i).Value = Range("A" & i + 1).Value Then
                'Insertion de deux lignes cas où deux lignes existent déjà
                Call Insertion_Amort2Lignes(i)
                Range("B" & i + 2).Value = dateAmortDero
                '-Montant + VNC
                Range("J" & i + 2).Value = -Range("J" & i).Value + Range("N" & i)
                Range("C" & i + 2).Value = "Amortissement"
                Range("C" & i + 2).EntireRow.Copy
                Selection.Insert Shift:=xlDown
                Range("B" & i + 3).Value = dateAmortDero
                '-Dero
                Range("J" & i + 3).Value = -Range("R" & i).Value
                Range("C" & i + 3).Value = "Dérogatoire"
                'Incrémenter le i de façon à reprendre le parcours après les lignes insérées
                Rows(i + 2).Select
                Selection.Copy
                Rows(i + 4).Select
                Selection.Insert Shift:=xlDown
                Range("M" & i + 4).Value = "COMPTA"
                Rows(i + 3).Select
                Selection.Copy
                Rows(i + 5).Select
                Selection.Insert Shift:=xlDown
                Range("M" & i + 5).Value = "COMPTA"
                i = i + 5
                DerniereLigne = Cells(Rows.Count, 1).End(xlUp).Row        Else
                'Insertion d'une ligne cas avec une ligne
                Call Insertion_Amort1Ligne(i)
                Range("B" & i + 1).Value = dateAmortDero
                '- Montant + VNC
                Range("J" & i + 1).Value = -Range("J" & i).Value + Range("N" & i)
                Range("C" & i + 1).Value = "Amortissement"
                'Incrémenter le i de façon à reprendre le parcours après les lignes insérées
                i = i + 1
                DerniereLigne = Cells(Rows.Count, 1).End(xlUp).Row        End If
        End If
     Next i
    En gros cette procédure me permet d'ajouter des lignes dans un tableau et de procéder à une mise en forme.
    Je fais donc une boucle POUR pour parcourir mon tableau je parcours jusqu'à la fin de mon tableau (DerniereLigne)... cependant comme je fais des ajouts ma fin de tableau change ...j'ai donc recalculé la fin de tableau à chaque fin de traitement (dans ma variable DerniereLigne) cependant ma boucle pour ne le prend pas en compte...

    Comment faire??

    Merci d'avance

  2. #2
    Membre éclairé
    Homme Profil pro
    Chargé d'Etudes Statistiques
    Inscrit en
    Novembre 2010
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chargé d'Etudes Statistiques
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2010
    Messages : 79
    Par défaut
    Est que se passe t'il si tu mets cette instruction au début de ta boucle for ?

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 533
    Par défaut
    L'instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DerniereLigne = Cells(Rows.Count, 1).End(xlUp).Row
    ?
    Si je la supprime de mes deux boucles et que je la met juste sous le for ???

    Si c'est ça cela ne change rien ...

  4. #4
    Membre éclairé
    Homme Profil pro
    Chargé d'Etudes Statistiques
    Inscrit en
    Novembre 2010
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chargé d'Etudes Statistiques
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2010
    Messages : 79
    Par défaut
    désolé... alors essaye de déclarer explicitement cette variable et utilise la commande set pour la réinitialiser.
    Sinon je ne vois rien d'autre...
    Et est ce qu'il ne vaut mieux pas définir ta variable comme ça:

    DerniereLigne=Rows.Count

    Il me semble que cela revient au même.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 533
    Par défaut
    Non le rows.count me compte toutes les lignes de mon tableau je ne veux que celles qui sont remplies ...
    Tu veux dire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set DerniereLigne = Cells(Rows.Count, 1).End(xlUp).Row
    ??

    Si oui cela ne fonctionne pas mais me met une erreur : "Objet Requis"

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut.

    @ alias... : Rows.count renvoie le nombre de lignes de la feuille (65536 XL<2007, 1048576 XL >=2007)...

    juju

    Le prolème, c'est que tu ajoutes des lignes durant ta boucle, donc, tu as un problème avec DerniereLigne.

    Perso, j'imaginerais mieux une boucle du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    DerniereLigne = cells(rows.count,1).end(xlup).row
    i = 13
    do while i <= DerniereLigne ' ou <, à voir selon le contexte
        ...
        ...
        Insertion_Amort2Lignes(i) ' Call n'est pas nécessaire
        DerniereLigne = DerniereLigne + 2
        ...
    loop
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  7. #7
    Inactif  
    Profil pro
    Inscrit en
    Février 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 517
    Par défaut
    salut

    - il n'est jamais vraiment adroit de modifier la valeur du paramètre "compteur" ta variable i) au sein d'une boucle.
    Tu as des problèmes avec tes insertions de lignes ? Je créerais à la place un simple tableau dynamique. Dans sa première colonne : le N° de ligne et dans la seconde, le nombre de lignes à insérer). Une fois ma boucle terminée, j'insèrerais mes lignes, en partant du bas, et en exploitant les données de monb tableau
    Du coup, je traiterais par une boucle sur la plage (définie d'emblée), du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For each cellule in laplage
    et utiliserais Offset partout où tu utilises des formules genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Range("B" & i + 2).Value = dateAmortDero
    Voilà déjà, parmi d'autres remarques (moins importantes)

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 533
    Par défaut
    J'ai modifié ma procédure en utilisant à la place du For un Do While puisque effectivement si je me rappelle bien mes cours de BTS on utilise la boucle for quand on sait le nombre de fois qu'on veut l'utiliser donc bon voilà :

    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
    Private Sub btn_dupliquer_Click()
    Dim i As Integer
    Dim dateAmortDero As String
    Dim DerniereLigne As Long
     
    DerniereLigne = Cells(Rows.Count, 1).End(xlUp).Row
    dateAmortDero = "31/12/2009"
    MsgBox (DerniereLigne)
    i = 13
    Do While i <= DerniereLigne
     
            If Range("A" & i).Value = Range("A" & i + 1).Value Then
                'Insertion de deux lignes cas où deux lignes existent déjà
                Call Insertion_Amort2Lignes(i)
                Range("B" & i + 2).Value = dateAmortDero
                '-Montant + VNC
                Range("J" & i + 2).Value = -Range("J" & i).Value + Range("N" & i)
                Range("C" & i + 2).Value = "Amortissement"
                Range("C" & i + 2).EntireRow.Copy
                Selection.Insert Shift:=xlDown
                Range("B" & i + 3).Value = dateAmortDero
                '-Dero
                Range("J" & i + 3).Value = -Range("R" & i).Value
                Range("C" & i + 3).Value = "Dérogatoire"
                'Incrémenter le i de façon à reprendre le parcours après les lignes insérées
                Rows(i + 2).Select
                Selection.Copy
                Rows(i + 4).Select
                Selection.Insert Shift:=xlDown
                Range("M" & i + 4).Value = "COMPTA"
                Rows(i + 3).Select
                Selection.Copy
                Rows(i + 5).Select
                Selection.Insert Shift:=xlDown
                Range("M" & i + 5).Value = "COMPTA"
                i = i + 6
                DerniereLigne = Cells(Rows.Count, 1).End(xlUp).Row
            Else
                'Insertion d'une ligne cas avec une ligne
                Call Insertion_Amort1Ligne(i)
                Range("B" & i + 1).Value = dateAmortDero
                '- Montant + VNC
                Range("J" & i + 1).Value = -Range("J" & i).Value + Range("N" & i)
                Range("C" & i + 1).Value = "Amortissement"
                'Incrémenter le i de façon à reprendre le parcours après les lignes insérées
                i = i + 2
                DerniereLigne = Cells(Rows.Count, 1).End(xlUp).Row
            End If
    Loop
    End Sub
    En plus, je vois que c'est ce que la plupart d'entre vous me proposent ... donc c'est cool
    Si vous avez des remarques y'a pas de soucis ... ma procédure fonctionne sinon
    Merci pour vos réponses

  9. #9
    Expert confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    6 814
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6 814
    Par défaut
    Pas sur que le for permette une modification en dynamique de la limite finale. Déjà, les modifications en dynamique du compteur sont hautement déconseillées.

    un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    i = 13
    DerniereLigne = Cells(Rows.Count, 1).End(xlUp).Row
    dateAmortDero = "31/12/2009"
     
    do until i >= DerniereLigne 
        If Range("A" & i).Value <> "" Then
        (.../...)
        End If
        i = i + 1
    loop
    me parait plus adapté. le i=i+1 est à mettre EN PLUS des éventuels i=i+1 que tu as déjà. Le (.../...) correspond au contenu de ton grand if/endif.

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

Discussions similaires

  1. variable dynamique dans une fonction javascript
    Par Shivaneth dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 20/04/2005, 15h58
  2. Variables dynamiques
    Par CriPpLe dans le forum C++
    Réponses: 5
    Dernier message: 23/02/2005, 11h56
  3. [SQL SERVER 2000] Noms de variables dynamiques
    Par cassoulet dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 08/09/2004, 11h44
  4. Récupération de variables dynamiques complexes
    Par ludoboy dans le forum ASP
    Réponses: 7
    Dernier message: 24/05/2004, 17h51
  5. [LG]Problême Variable dynamique de types différents
    Par pierrOPSG dans le forum Langage
    Réponses: 2
    Dernier message: 29/04/2004, 16h01

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