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 :

MACRO de comparaison de valeurs et suppression ligne


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2011
    Messages : 6
    Par défaut MACRO de comparaison de valeurs et suppression ligne
    Bonjour,

    Je débute en programmation VBA et en programmation tout court d’ailleurs aussi.

    J'essais de créer un programme Excel permettant de me créer des listes de pièces à expédier correspondant à une nomenclature selon leur lieu de stockage.

    Je vous joint une extrait de mon fichier sur lequel je bloque.

    Voici mon problème :

    J'ai une première feuille nommée LISTE qui correspond à une liste de pièces à servir. J'ai crée sur cette feuille un bouton "Nettoyage" qui doit ne me laisser dans cette liste que les références de pièces présentent dans la feuille DATA, puis SUPPRIMER les références présentent dans la feuille DB SITE.

    Je crois avoir trouvé le problème de la macro associé au bouton "NETTOYAGE" :
    toutes les références sont supprimées car dans tous les cas, même si ma condition est remplie une fois dans la boucle, elle sera ensuite fausse plus tard donc la ligne sera supprimée.

    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
    Private Sub CommandButton_nettoyage_Click()
     
    Application.ScreenUpdating = False
     
    ' selection des pièces présentent sur site
     
    Dim X As Integer
    Dim Y As Integer
     
    'Je remonte de la derniere ligne jusqu'a la ligne 10
        For X = Sheets("LISTE").Range("A1000").End(xlUp).Row To 10 Step -1
            For Y = Sheets("DATA").Range("A1000").End(xlUp).Row To 1 Step -1
        'si les valeurs sont différentes
                If Sheets("LISTE").Range("A" & X) <> Sheets("DATA").Range("A" & Y) Then
                'Je supprime la ligne entière
                    Rows(X).EntireRow.Delete
                End If
            Next Y
        Next X
     
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ''Effacement des pièces en DB sur le site d'intervention''
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
     
    Dim I As Integer
    Dim J As Integer
     
     
     
    'Je remonte de la derniere ligne jusqu'a la ligne 1
    For I = Sheets("LISTE").Range("A1000").End(xlUp).Row To 10 Step -1
        For J = Sheets("DB SITE").Range("A1000").End(xlUp).Row To 1 Step -1
        'si dans la cellule A il y a la valeur que je cherche
            If Sheets("LISTE").Range("A" & I) = Sheets("DB SITE").Range("A" & J) Then
                'Je supprime la ligne entière
                Rows(I).EntireRow.Delete
            End If
        Next J
    Next I
     
     
     
    Application.ScreenUpdating = True
     
            MsgBox "Nettoyage  effectué !", _
            vbExclamation, "FELICITATION !"
     
    End Sub

    J'ai essayé d'utiliser une condition Booléenne dans une macro associée au bouton "NETTOYAGE 2", mais je ne sais pas du tout comment écrire cette macro...

    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
    Private Sub CommandButton_nettoyage2_Click()
     
    Dim condition As Boolean
     
        condition = True Or False
     
    Dim X, Y As Integer
     
        'Je remonte de la derniere ligne jusqu'a la ligne 10
        For X = Sheets("LISTE").Range("A1000").End(xlUp).Row To 10 Step -1
            For Y = Sheets("DATA").Range("A1000").End(xlUp).Row To 1 Step -1
        'si les valeurs sont différentes
                condition = Sheets("LISTE").Range("A" & X) = Sheets("DATA").Range("A" & Y)
                If condition = False Then: Rows(X).EntireRows.Delete
                End If
            Next Y
        Next X
     
    End Sub
    Peut être auriez vous une solution à mon problème ?

    Je vous remercie,

    Julien
    Pièces jointes en attente de validation Pièces jointes en attente de validation

  2. #2
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    Une question, j'ai pas compris qu'est censé faire la 2° boucle ? (à part tout supprimer ?)

    Un deuxième, pour plus de clarté est éviter les problèmes préfixes tes Rows... avec la feuille concernée Sheets("LISTE").EntireRow.Delete

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2011
    Messages : 6
    Par défaut
    Bonjour bbil,

    En effet, ma seconde macro supprimait tout.

    Je vous ré explique mon PB :

    j'ai une première feuille sur laquelle j'ai des données à trier.
    Une seconde feuille servant de première référence.
    Une troisième feuille servant de seconde référence.

    1 - Je compare les valeurs de la colonne A de ma première feuille avec celles de la colonne A de la seconde feuille et je GARDE (de la feuille 1) les valeurs présentent dans les deux feuilles.

    2 - Je compare les valeurs de la colonne A de la première feuille avec celles de la colonne A de la troisième feuille et je SUPPRIME (de la feuille 1) les valeurs présentent dans les deux feuilles.

    De plus selon la ville sélectionnée auparavant dans une ComboBox, la troisième feuille utilisée n'est pas la même : j'ai une troisième feuille par ville.

    Voici le code qui semble fonctionner :

    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
    Private Sub CommandButton_nettoyage_TAB_Click()
     
    Application.ScreenUpdating = False
     
    '''''''''''''''''''''''''''''''''''''''''
    ''selection des pièces en DB sur TAB''
    '''''''''''''''''''''''''''''''''''''''''
     
    Dim i As Integer, j As Integer, reponse As Boolean
     
    'Je parcours le tableau TAB a partir de la ligne 2
        For i = 2 To [tab].Rows.Count
        'la réponse est FAUX par défaut
        reponse = False
            'Je parcours le tableau DB TAB à partir de la 1ere ligne
            For j = 1 To [dbtab].Rows.Count
                'Je conserve les valeurs contenue dans des DEUX tableaux
                If [tab].Cells(i, 1) = [dbtab].Cells(j, 1) Then reponse = True
            Next j
                If reponse = False Then [tab].Cells(i, 1).Rows.EntireRows.Delete
     
        Next i
     
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ''Effacement des pièces en DB sur le site d'intervention''
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
     
    'Condition de selection = valeur contenue dans la combobox choixchantier
    If [NomBase] = "Belf" Then
     
        'Je parcours le tableau TAB de la ligne 2 à l'avant dernière (dernière est vide)
        For i = 2 To [tab].Rows.Count - 1
        'La réponse par défaut est FAUX
        reponse = False
            'Je parcours le tableau du site SAV en question de la 2ème ligne à la dernière
            For j = 1 To [dbbelf].Rows.Count
                'Je supprime les valeurs communes aux deux tableaux
                If [tab].Cells(i, 1) = [dbbelf].Cells(j, 1) Then reponse = True
            Next j
                If reponse = True Then [tab].Cells(i, 1).Rows.EntireRows.Delete
        Next i
     
    End If
     
     
    '''''''''''''''
    ''LaRoc''
    '''''''''''''''
     
    'Condition de selection = valeur contenue dans la combobox choixchantier
    If [NomBase] = "LaRoc" Then
     
        'Je parcours le tableau TAB de la ligne 2 à l'avant dernière (dernière est vide)
        For i = 2 To [tab].Rows.Count - 1
        'La réponse par défaut est FAUX
        reponse = False
            'Je parcours le tableau du site SAV en question de la 2ème ligne à la dernière
            For j = 1 To [dblaro].Rows.Count
                'Je supprime les valeurs communes aux deux tableaux
                If [tab].Cells(i, 1) = [dblaroc].Cells(j, 1) Then reponse = True
            Next j
                If reponse = True Then [tab].Cells(i, 1).Rows.EntireRows.Delete
        Next i
     
    End If

    J'utilise donc ce code. Y a-t-il un moyen de ne pas Utiliser la fonction IF pour chaque site d'intervention, mais plutôt d'appeler une fonction qui prennent en compte la valeur de la combobox et choisisse la troisième feuille en fonction de la valeur contenue ?

    En espérant avoir été assez précis...

    Merci,

    Julien

  4. #4
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    bonjour,

    pour le choix de la feuille 3 utilise une variable workSheet que tu renseigne en fonction de ton combo-box par exemple avec un select case :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Dim sh3 As Worksheet
     
    Select case NomBase 
       Case "Belf"
         set sh3 = ThisWorkbook.sheets("dbbelf") 'si dbbelf est le nom de ta feuille..
       Case "LaRoc"
         set sh3 = ThisWorkbook.sheets("dbRoc")
       Case else
         msgBox "Erreur choix incorrect"
         exit sub  
     end select
    (..)
     For j = 1 To sh3.Rows.Count
    (...)

Discussions similaires

  1. [XL-2010] Suppression colonne suivant valeur cellule 1ère ligne (en-tête)
    Par 2lester dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 18/08/2017, 21h11
  2. [XL-2007] macros suppression ligne
    Par ronin.01 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 01/03/2011, 19h35
  3. [XL-2003] Insertion de ligne vierges, recopie de valeur et suppression de ligne référente.
    Par zewho dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 11/12/2009, 08h31
  4. Comparaison de valeur de ligne avec deux feuilles différentes
    Par charlix dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 30/07/2008, 15h54
  5. Réponses: 10
    Dernier message: 07/12/2006, 20h52

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