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 :

Sélection de plusieurs ligne avec condition (Problème dans le code) [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Sélection de plusieurs ligne avec condition (Problème dans le code)
    Bonjour tout le monde,

    La lecture du forum m'a aidé plein de fois, mais malheureusement je n'ai pas pu trouver une solution à mon problème

    Mon code sert à sélectionner les lignes d'un tableau suivant une condition sur une cellule. (Le but est de supprimer l'ensemble des lignes sélectionnées en une seule fois)
    Tout fonctionne correctement sauf qu'il me sélectionne systématiquement la ligne 2 de mon tableau que la condition soit remplie ou non.
    Pouvez-vous jeter un coup d’œil sur mon code?

    Merci par avance


    Voici le code:
    Exemple.xlsm
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Function DCInventoryDel()
     Sheets("DCInventory").Activate
     Dim z As Range, cel As Range
     Set z = [DCInventoryTable].Columns(19).Find("*", LookIn:=xlValues)
     If z Is Nothing Then Exit Function
     For Each cel In [DCInventoryTable].Columns(19).Cells
      If cel.Value = 0 Then Set z = Union(cel, z)
      Next
     Intersect([DCInventoryTable[[Year]:[Handling Cost ($MXN/year)]]], z.EntireRow).Select
     Selection.Delete
    End Function
    Pièce jointe 168634

  2. #2
    Membre émérite
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Points : 2 657
    Points
    2 657
    Par défaut
    Bonjour yassine0077,

    Je pense que ceci vient du fait que tu n'as pas de valeur en S2.
    Donc, voici ce que je te propose :
    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
    Sub DCInventoryDel()
    Dim z As Range
    Dim Rng_suppr As Range
    Dim i As Integer
     
    With Worksheets("Feuil3")
        Set z = .Range("S1")
        Set Rng_suppr = Nothing
        For i = 2 To .Columns(19).Find("*", , , , , xlPrevious).Row - 2
            If z.Offset(i, 0) = 0 Then
                If Not Rng_suppr Is Nothing Then
                    Set Rng_suppr = Union(Rng_suppr, .Range(.Cells(i + 1, 1), .Cells(i + 1, 19)))
                Else
                    Set Rng_suppr = .Range(.Cells(i + 1, 1), .Cells(i + 1, 19))
                End If
            End If
        Next i
        Rng_suppr.Delete shift:=xlUp
    End With
     
    End Sub
    Ceci supprime les lignes (de A à S) où tu n'as pas de valeur (ou 0) en colonne S.
    C'est ce que j'ai compris de ta macro.
    N'hésite pas à revenir vers moi !

    Cordialement,
    Kimy
    La logique :
    • Plus ya de gruyère, moins ya de gruyère.
    • Plus tu pédales moins vite, moins tu avances plus vite.
    Plusoyer les réponses pertinentes et n'oublier pas de résolver en fin de post !

  3. #3
    Membre habitué
    Homme Profil pro
    Programmeur en temps libre
    Inscrit en
    Février 2015
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Programmeur en temps libre
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2015
    Messages : 68
    Points : 139
    Points
    139
    Par défaut
    Bonjour a tous,

    il y une autre solution avec la méthode autofilter:

    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
    Function DCInventoryDel()
     Sheets("DCInventory").Activate
     
    ActiveSheet.ListObjects("DCInventoryTable").Range.AutoFilter 'enlève les filtres existants
    ActiveSheet.ListObjects("DCInventoryTable").Range.AutoFilter 18, "0,00" ' filtre la colonne S qui contiennent la valeur 0,00
     
    'décale la plage pour ne pas prendre la ligne d'entêtes
    'reduit la plage d'une ligne pour compenser le décalage
    'efface les lignes restantes et qui sont visibles
    ActiveSheet.ListObjects("DCInventoryTable").Range.Offset(1). _
    Resize(ActiveSheet.ListObjects("DCInventoryTable").Range.Rows.Count - 1). _
    SpecialCells(xlCellTypeVisible).Delete
     
    'revient à un affichage normal
    ActiveSheet.ListObjects("DCInventoryTable").Range.AutoFilter
     
    End Function
    en espérant que cela puisse s'appliquer à ton code.

  4. #4
    Membre averti
    Homme Profil pro
    retraité enseignement
    Inscrit en
    Mars 2013
    Messages
    213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Saône (Franche Comté)

    Informations professionnelles :
    Activité : retraité enseignement
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2013
    Messages : 213
    Points : 442
    Points
    442
    Par défaut selection...
    ....qu'il me sélectionne systématiquement la ligne 2 de mon tableau que la condition soit remplie ou non....
    Bonjour,

    En regardant votre code je vois que vous "unionnez" des cellules en laissant la première de test dans z, voilà pourquoi vous avez une ligne en trop!

    Donc en 1er "vider" z puis prendre la 1ere en z et ensuite unir les autres voilà mon code et il fonctionne :

    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
    Sub DCInventoryDel()
     Sheets("DCInventory").Activate
     Dim z As Range, cel As Range
     Set z = [DCInventoryTable].Columns(18).Find("*", LookIn:=xlValues)
     If z Is Nothing Then Exit Sub
     Set z = Nothing       'Penser à initialiser la plage
     
     For Each cel In [DCInventoryTable].Columns(18).Cells
        If z Is Nothing Then
            If cel.Value = 0 Then Set z = cel              'Première cellule
                        Else
            If cel.Value = 0 Then Set z = Union(cel, z) 'Cellules suivantes....
        End If
     
    Next cel
     Intersect([DCInventoryTable[[Year]:[Average Sales (Ton/year)]]], z.EntireRow).Select
     ' Selection.Delete
     ' Cells(3, 2).Select
    End Sub
    On aurait pu utiliser d'autres algorithmes...

    PS : J'ai oublié de dire que c'est une procédure et non une fonction : une fonction rend une valeur et ne doit normalement pas être utilisée pour les "Effets de bords"!...
    a++
    Exemplecor.xlsm
    geogeo70

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Super merci les gars, j'ai essayé tous vos algorithmes et ils fonctionnent tous.
    Je garde une préférence pour le mien (Bien évidement corrigé) pour la simple raison que je trouve qu'il est beaucoup plus rapide, car j'ai des dizaine de milliers de lignes (m'enfin peut être que je me trompe, je suis un débutant en VBA.
    Je prends en compte toutes vos remarques et je vous remercie tous de votre aide. Vous déchirez

  6. #6
    Membre émérite
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Points : 2 657
    Points
    2 657
    Par défaut
    Bonjour yassine0077,

    Dans la signature.

    - - - - - - - - - - - -
    La logique :
    • Plus ya de gruyère, moins ya de gruyère.
    • Plus tu pédales moins vite, moins tu avances plus vite.
    Plusoyer les réponses pertinentes et n'oublier pas de résolver en fin de post !

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

Discussions similaires

  1. Problème avec condition WHERE dans commande SELECT
    Par Badouba76 dans le forum Objective-C
    Réponses: 3
    Dernier message: 08/11/2013, 18h19
  2. Masquer lignes avec conditions dans tableau
    Par logoden dans le forum Débuter
    Réponses: 2
    Dernier message: 28/02/2012, 12h18
  3. Sélectioner de plusieurs lignes avec Clic+MAJ
    Par helios399 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 03/02/2012, 15h10
  4. [AC-2007] sélection de ligne avec condition et les supprimer
    Par Sangoku62000 dans le forum Access
    Réponses: 2
    Dernier message: 30/01/2012, 12h46
  5. Affichage ligne avec condition dans /etc/passwd
    Par mzt.insat dans le forum Shell et commandes GNU
    Réponses: 7
    Dernier message: 17/04/2006, 21h25

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