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 :

Problème avec boucle if


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Femme Profil pro
    Planner
    Inscrit en
    Décembre 2018
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Planner

    Informations forums :
    Inscription : Décembre 2018
    Messages : 1
    Par défaut Problème avec boucle if
    Bonjour,

    Je débute sur VBA et je souhaite simplifié le code d'un excel que j'ai créé. Malheureusement, je bloque sur une boucle if: mon objectif est si une cellule C(i) est vide, alors il faut remplacer sa valeur par C(i+1) , i.e. si C3 = "" => C3=C4.

    J'ai rédigé le code suivant et rien ne se passe (pas de message d'erreur, mais pas d'action non plus sur mon classeur...).

    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 FILLING_CELLS(Sheet As String, Column As String)
     
    Dim i As Integer
    Dim j As Integer
    Dim lastrow As Long
    Dim ligne As Long
    Dim linge1 As Long
     
     
    j = i + 1
    lastrow = Cells(Application.Rows.Count, 2).End(xlDown).Row
    ligne = i
    ligne1 = j
     
    For i = 4 To lastrow
        If Worksheets(Sheet).Range(Column & ligne).Value = "" Then
            Worksheets(Sheet).Range(Column & ligne).Value = Worksheets(Sheet).Range(Column & ligne1).Value
        End If
     
    Next i
     
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    Sub TEST()
     
    Call FILLING_CELLS("DATA P6 EXPLOITATION", "C")
     
    End Sub

    Merci pour votre aide

  2. #2
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Bonjour et bienvenu,

    Pourquoi VBA?

    Si tu tiens au code

    Evite de choisir des noms clés de VBA comme variable (Sheet, column)

    Il y a redondance
    De plus, ces égalités sont placées en tout début de code.
    A cela s'ajoutent le rattachement non effectué des objets Range, les blocs With inexistants....

    A comprendre puis adapter

    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
    Sub monTEST()
     
    Call FILLING_CELLS("DATA P6 EXPLOITATION", "C")
     
    End Sub
     
    Sub FILLING_CELLS(nomwks As String, lacolonne As String)
     
    Dim lastrow As Long
    Dim c As Range
     
     Application.ScreenUpdating = False
     
    With Worksheets(nomwks)
     
            lastrow = .Cells(.Rows.Count, 2).End(xlUp).Row
     
            For Each c In .Range(lacolonne & "2:" & lacolonne & lastrow).SpecialCells(xlCellTypeBlanks)
     
                    With c
     
                        .Value = .Offset(0, 1).Value
     
                    End With
     
            Next c
     
    End With
     
    End Sub
    Pour l'objet Range en général, et la méthode SpecialCells en particulier, tu peux consulter cet espace documentaire:

    L'objet Range

  3. #3
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    C'est une très mauvaise idée de donner à des variables le nom d'objets existants.

    Autre problème, tu donnes à la variable j la valeur de i+1 mais tu ne donnes pas de valeur à i...

    Mais ce que tu fais de travers, c'est surtout l'affectation des variable ligne.
    J'ai l'impression que tu crois qu'en écrivant "ligne = i", alors dans tout le code ligne sera toujours égal à la valeur de la variable i.
    Ce n'est pas le cas. Quand on écrit ça, on donne à la variable ligne la valeur de i à l'instant où l'exécution passe sur cette ligne.
    Si, par la suite, la valeur de i change, la valeur de ligne restera la même.
    Idem pour le j=i+1.

    Autre détail : pour le calcul de lastrow, tu n'indiques pas le nom de la Worksheet concernée.

    Dernière chose : pour ta procédure, il faut aller du bas vers le haut et non l'inverse.
    Réfléchis : si C1="", C2="" et C3="A", si tu vas du haut vers le bas, au premier tour la macro verra que C1 est vide et y mettra la valeur de C2, c'est-à-dire un vide.

    Encore un truc : dans ta recherche de la dernière ligne remplie, tu parts de la dernière ligne possible (Rows.Count) et du demande de rechercher vers le bas (xlDown). Il y a peu de chance que la macro y trouve des cellules remplies.

    Donc, si je n'ai rien oublié :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub FILLING_CELLS(Feuille As String, Colonne As String)
    Dim ligne As Long
     
    With Worksheets(Feuille)
        For Ligne = .Cells(Rows.Count, Colonne).End(xlUp).Row To 4 Step -1
            With .Range(Colonne & ligne)
                If .Value = "" Then .Value = .Offset(1, 0).Value
            End With
        Next Ligne
    End With
     
    End Sub
    Je n'ai pas testé, tu auras donc peut-être du débugage à faire.

  4. #4
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Oui Menhir.
    Nos réponses s'entrecroisent et se complètent.
    Pour ma part, utiliser SpecialCells, comme je l'ai fait, est, modestement, plus performant, non?

  5. #5
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par MarcelG Voir le message
    Pour ma part, utiliser SpecialCells, comme je l'ai fait, est, modestement, plus performant, non?
    Le problème, c'est s'il y a deux cellules vides successives : aller de haut en bas ne suffira pas à boucher le trou.
    C'est pour ça que j'ai exclu For Each qui ne sait pas aller à contre-sens. Et sans le For Each, difficile d'utiliser SpecialCells.

    Cela dit, si le cas de deux cellules vides successives n'a aucune chance de se produire, c'est effectivement une bonne idée.

  6. #6
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Je viens de tester mon code.
    Il est effectif. Ce même si 2 cellules successives sont vides.
    Ou quelque chose m'échappe?

  7. #7
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Si on a les ligne 4 et 5 (par exemple) qui sont vides, quelle valeur est mise à la ligne 4 ? Celle de la ligne 5 qui elle aussi est vide et n'a pas encore été touchée par le code ?
    Je ne vois pas comment il serait possible que la première des deux lignes soit renseignée.

    En regardant de plus près ton code, je vois que tu mets dans les cellules vide la valeur de la colonne de droite.
    A priori, ce n'est pas ce qui était demandé. Il faut remplir les cellules vides avec la valeur de la ligne en dessous.

Discussions similaires

  1. [batch] problème avec boucle for
    Par TanEk dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 22/04/2008, 14h41
  2. Problème avec boucle
    Par tahoser dans le forum MATLAB
    Réponses: 6
    Dernier message: 04/01/2008, 09h59
  3. Problème avec boucle for() et action POST
    Par Oli_Ifre dans le forum Langage
    Réponses: 4
    Dernier message: 26/04/2007, 09h52
  4. [ActionScript] Problème avec boucle 'FOR'
    Par BnA dans le forum Flash
    Réponses: 7
    Dernier message: 02/11/2006, 09h26
  5. [Tableaux] Problème avec boucle
    Par MYster dans le forum Langage
    Réponses: 6
    Dernier message: 11/11/2005, 18h39

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