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

Excel Discussion :

Demande d'aide sur la fonction autofilter [XL-2002]


Sujet :

Excel

  1. #1
    Candidat au Club
    Homme Profil pro
    Paris
    Inscrit en
    Septembre 2014
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Paris
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2014
    Messages : 41
    Points : 4
    Points
    4
    Par défaut Demande d'aide sur la fonction autofilter
    Bonjour,

    Je suis novice en développement de macro approximativement 3 jours d’expérience.

    A l’heure actuelle, j’ai réussi à initialiser mon interface graphique avec ma base de données mais maintenant je rencontre plusieurs difficultés pour coder les fonctions de celle-ci.

    Dans un premier temps je vais vous expliquer en détail mon projet pour éviter tout malentendu voir pièce jointe document word (projet).

    Le problème que je rencontre et au niveau des listbox. Je souhaite créer un filtre multicritères à partir des informations de ma listbox si je choisi l'opérateur xland le code s'exécute mais je ne filtre que 1 seul critère de ma listbox. J’ai donc changé mon opérateur xland par xlfiltervalues mais quand j'exécute j'ai le message d'erreur exécution 1004 : "La méthode Autofilter de la classe range a échoué"

    Je ne comprends pas pourquoi quelqu'un peut-il m'aider? (j'utilise excel 2002)

    Je joins également ma base de données avec le code utilisé.
    Fichiers attachés Fichiers attachés

  2. #2
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 203
    Points : 14 354
    Points
    14 354
    Par défaut
    Bonjour,

    Je ne pense pas que "xlFilterValues" soit un opérateur valable pour Excel 2002 (il n'existe pas dans Excel 2003). Utilise plutôt un filtre avancé.
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  3. #3
    Candidat au Club
    Homme Profil pro
    Paris
    Inscrit en
    Septembre 2014
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Paris
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2014
    Messages : 41
    Points : 4
    Points
    4
    Par défaut
    Merci Daniel de m'avoir répondu

    J'ai essayé de faire comme tu m'as dit malheureusement l'aide fourni sur excel n'est pas très utile. j'ai essayé d'adapter mon code avec le peu d'information et ça ressemble à ceci :

    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
    Dim Tablo() As Variant
    Dim i As Integer, Indice As Integer
    
    With Me.ListBox1
        For i = 0 To .ListCount - 1
          If .selected(i) = True Then
           ReDim Preserve Tablo(Indice)
            Tablo(Indice) = .List(i)
           Indice = Indice + 1
         End If
        Next i
      End With
      If Indice = 0 Then
        Range("$B$5:$O$30").AdvancedFilter  Else
        Range("$B$5:$O$30").AdvancedFilter , Action:=xlFilterInPlace, CriteriaRange:=Range("Tablo")  
    End If
    J'utilise le tutoriel formation Excel - VBA débutant que j'ai trouvé sur le site il évoque bien la fonction AdvancedFilter mais ne dit pas comment l'utiliser.

    Connais tu un tuto qui puisse m'aider dans mes démarches?

  4. #4
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 203
    Points : 14 354
    Points
    14 354
    Par défaut
    Le "CriteriaRange" doit être une plage de cellules. Regarde le classeur joint :

    Disabled30 Advanced filter.xls
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  5. #5
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 203
    Points : 14 354
    Points
    14 354
    Par défaut
    ... et un tutoriel sur le sujet :

    http://philippetulliez.developpez.co...dvancedfilter/
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  6. #6
    Candidat au Club
    Homme Profil pro
    Paris
    Inscrit en
    Septembre 2014
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Paris
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2014
    Messages : 41
    Points : 4
    Points
    4
    Par défaut
    Si j'ai bien compris, je ne peux pas me servir de ma ListBox pour sélectionner mes critéres?

  7. #7
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 203
    Points : 14 354
    Points
    14 354
    Par défaut
    Si, mais au lieu de remplir une variable tableau, il faut recopier les sélections des listboxes dans des plages de cellules.
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  8. #8
    Candidat au Club
    Homme Profil pro
    Paris
    Inscrit en
    Septembre 2014
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Paris
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2014
    Messages : 41
    Points : 4
    Points
    4
    Par défaut
    Trés bien je te remercie je vais essayer

  9. #9
    Candidat au Club
    Homme Profil pro
    Paris
    Inscrit en
    Septembre 2014
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Paris
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2014
    Messages : 41
    Points : 4
    Points
    4
    Par défaut
    Bonjour Daniel

    J'ai essayé d'utiliser la fonction "advancedfilter" mais l'essai n'est pas concluant . Voici ce que j'ai codé :

    Public Sub CommandButton1_Click()

    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
    Worksheets("Feuil1").Range("C1:C65000").ClearContents 'éfface le contenue des céllules
     
    Dim I As Integer, y As Integer  'déclaration des variables
    With Me.ListBox1                'selection de la listbox
    For I = 0 To .ListCount - 1     'définition de la plage de l'index
    If .selected(I) = True Then     'selection des valeurs dans la listbox
    y = y + 1                       'incrémentation de la valeur de y
    Sheets("feuil1").Range("c" & y).Value = .List(I)    'copie les valeurs sélectionnées de la listbox dans la feuil1 colonne c
    End If
    Next I
    End With
     
     
    Worksheets("Feuil2").Range("A2:F65000").AdvancedFilter _
        Action:=xlFilterInPlace, _
        CriteriaRange:=Worksheets("Feuil1").Range("C1:C20"), _
        Unique:=False
    Ce que je voulais faire :
    - Supprimer les valeurs de la colonne C non sélectionné dans la listbox (ça c'est bon)
    - Copier mes valeurs sélectionnés de ma listbox1 dans la colonne C de ma feuil1 (ça c'est bon)
    - Récupérer les valeurs de la colonne C comme critéres pour le filtre avancé (le programme s'exécute mais ça ne fait rien...)

    C'est tu ce qu'il se passe ou ne se passe pas?

  10. #10
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 203
    Points : 14 354
    Points
    14 354
    Par défaut
    La première valeur de chaque colonne de la zone "Critères" doit être le nom du champ filtré. Regarde ton classeur modifié. Les critères de filtre sont en colonne X:Y. La zone de critères s'appelle "Crit". Je remplis la colonne X avec les éléments sélectionnés de ListBox1 et la colonne Y avec ListBox2. Ensuite je définis la zone "Crit" et j'applique le filtre.

    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
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    Public Sub CommandButton1_Click()
    '*****************************************************************
    Dim Critère1 As Range, Critère2 As Range, Ctr As Integer, Crit As Range
    Dim i As Integer, Ligne As Long
     
    With Sheets("Feuil2")
        .[X:Y].ClearContents 'effacement de la zone de critères
        Set Critère1 = .[X1] '"Critère1" est la cellule X1 deFeuil2
        Critère1 = "equipements" 'nom de l'entête (doit être strictement le même que A1)
    End With
    Ctr = 0 'compteur servant au décalage par rapport à X1
    With Me.ListBox1
        For i = 0 To .ListCount - 1
          If .selected(i) = True Then
            Ctr = Ctr + 1
            Critère1.Offset(Ctr) = .List(i) 'remplissage de la zone critères
         End If
        Next i
      End With
    '  If Indice = 0 Then
    '    Range("$B$4:$O$30").AutoFilter Field:=1
    '  Else
    '    Range("$B$4:$O$30").AutoFilter Field:=1, Criteria1:=Tablo, Operator:=xlFilterValues
    '  End If
     '****************************************************************
      Dim j As Integer
     
    With Sheets("Feuil2")
        Set Critère2 = .[Y1]
        Critère2 = "REF VOIE"
    End With
    Ctr = 0
      With Me.ListBox2
        For j = 0 To .ListCount - 1
          If .selected(j) = True Then
            Ctr = Ctr + 1
            Critère2.Offset(Ctr) = .List(j)
          End If
        Next j
      End With
    With Sheets("Feuil2")
      Ligne = .[X:Y].Find("*", , , , xlByRows, xlPrevious).Row 'recherche de la dernière ligne de la zone de critères
      Set Crit = .[X1:Y1].Resize(Ligne) 'définition de la zone de critères
      'application du filtre :
      .Range("A1", .Cells(.Rows.Count, 6).End(xlUp)).AdvancedFilter xlFilterInPlace, CriteriaRange:=Crit
    End With
    '  If Indice1 = 0 Then
    '    Range("$B$4:$O$30").AutoFilter Field:=5
    '  Else
    '    Range("$B$4:$O$30").AutoFilter Field:=5, Criteria1:=Tablo1, Operator:=xlAnd
    '  End If
    '
    '  Range("$B$4:$O$30").AutoFilter Field:=4, Criteria1:="V", Operator:=xlAnd
      '****************************************************************
     ' Dim Tablo2()
      'Dim K As Integer, Indice2 As Integer
      '
      'With Me.ComboBox2
       ' For K = 0 To .Listindex - 1
        'If .selected(K) = True Then
         '   ReDim Preserve Tablo2(Indice2)
    '      '  Tablo2(Indice2) = .List(K)
     '   End If
      '  Next K
       ' End With
    ' Range("$B$4:$O$30").AutoFilter Field:=4, Criteria1:=Tablo2, Operator:=xlAnd
     
        'End If
     
       ' If .selected(P) = True Then
       ' ActiveSheet.Range("$B$4:$O$30").AutoFilter Field:=4, Criteria1:="Tablo2", Operator:=xlAnd
     
        'End If
    'End With
    End Sub
    Classeur joint : Disabled30 Base de données ligne Poitiers_Limoge essai 3 technique.xls
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  11. #11
    Candidat au Club
    Homme Profil pro
    Paris
    Inscrit en
    Septembre 2014
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Paris
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2014
    Messages : 41
    Points : 4
    Points
    4
    Par défaut
    Ok je te remercie, je n'y serai pas arrivé tout seul. Je n'ai pas suffisament de connaissance en VBA.
    Par contre je n'ai pas compris cette partie du code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Ligne = .[X:Y].Find("*", , , , xlByRows, xlPrevious).Row 'recherche de la dernière ligne de la zone de critères
      Set Crit = .[X1:Y1].Resize(Ligne) 'définition de la zone de critères
      'application du filtre :
      .Range("A1", .Cells(.Rows.Count, 6).End(xlUp)).AdvancedFilter xlFilterInPlace, CriteriaRange:=Crit
    Peux tu m'expliquer ce que tu as fait plus en détail?
    J'ai testé la macro que tu as réalisé et je ne comprends pas certaine chose.

    Quand tu choisis un équipement et 1 voie ça fonctionne mais si tu recherches tous les équipements de la voie 3 par exemple il ne se passe rien.

  12. #12
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 203
    Points : 14 354
    Points
    14 354
    Par défaut
    J'explique le code d'abord, je chercherai l'anomalie après. je remplis la colonne X avec les valeurs sélectionnées dans la listbox ListBox1 et la colonne Y avec les valeurs sélectionnées dans la listbox ListBox2. Je dois ensuite déterminer la plage X:Y remplie. Mettons qu'il y ait 4 lignes en colonne X et 2 en colonne Y. J'utilise la méthode "Find" pour trouver la dernière ligne remplie, soit 4 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Ligne = .[X:Y].Find("*", , , , xlByRows, xlPrevious).Row
    que tu peux traduire par : "je cherche la ligne contenant quelque chose (* = quelque chose) en examinant la plage X:Y ligne par ligne et en commençant par le bas".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set Crit = .[X1:Y1].Resize(Ligne)
    définit la plage de critères comme un rectangle ayant X1:Y1 comme largeur et une hauteur de ligne cellules (ici : 4 cellules).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Range("A1", .Cells(.Rows.Count, 6).End(xlUp))
    définit une plage commençant en A1 et se terminant avec la dernière cellule remplie de la colonne F. C'est cette plage qui va être filtrée. Cette syntaxe te permet d'ajuster la plage au nombre de lignes si celui-ci varie.

    N'hésite pas à dire s'il y a quelque chose que tu ne comprends pas.
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  13. #13
    Candidat au Club
    Homme Profil pro
    Paris
    Inscrit en
    Septembre 2014
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Paris
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2014
    Messages : 41
    Points : 4
    Points
    4
    Par défaut
    Merci pour le détail je comprends mieux maintenant. En plus de tes explications je m'aide du tuto que j'ai trouvé. Dans le tuto il l'explique de la maniére suivante :

    "L'argument SearchDirection précise le sens de la recherche, vers l'avant (xlNext) c'est-à-dire vers le bas ou vers la droite selon la direction choisie, vers l'arriére (xlPrevious) c'est-à-dire vers le haut ou vers la gauche."

    Si j'ai bien compris ça fonctionne comme ça :

    - si on choisi xlbyrows et xlPrevious la direction sera vers le haut
    - si on choisi xlbyrows et xlnext la direction sera vers le bas
    - si on choisi xlbycolumns et xlPrevious la direction sera vers la droite
    - si on choisi xlbycolumns et xlNext la direction sera vers la gauche

  14. #14
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 203
    Points : 14 354
    Points
    14 354
    Par défaut
    En fait, j'ai fait une grosse erreur : si tu chooisis deux équipements et deux voies, il faut mettre dans les critères :

    equipements REF VOIE
    Aiguille Voie 1
    Aiguille Voie 3
    Balise KVB Voie 1
    Balise KVB Voie 3

    alors que je mettais :

    equipements REF VOIE
    Aiguille Voie 1
    Balise KVB Voie 3
    Voici la macro attaché au bouton :

    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
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    Public Sub CommandButton1_Click()
    '*****************************************************************
    Dim Critère1 As Range, Critère2 As Range, Ctr1 As Integer, Ctr2 As Integer, Crit As Range
    Dim i As Integer, Ligne As Long
    Dim j As Integer, Tabl1() As Variant, Tabl2() As Variant
    With Sheets("Feuil2")
        .[X:Y].ClearContents 'effacement de la zone de critères
        Set Critère1 = .[X1] '"Critère1" est la cellule X1 deFeuil2
        Critère1 = "equipements" 'nom de l'entête (doit être strictement le même que A1)
    End With
    Ctr1 = -1
    With Me.ListBox1
        For i = 0 To .ListCount - 1
          If .Selected(i) = True Then
            Ctr1 = Ctr1 + 1
            ReDim Preserve Tabl1(Ctr1)
            Tabl1(Ctr1) = .List(i) 'remplissage de la zone critères
         End If
        Next i
      End With
    With Sheets("Feuil2")
        Set Critère2 = .[Y1]
        Critère2 = "REF VOIE"
    End With
    Ctr2 = -1
      With Me.ListBox2
        For j = 0 To .ListCount - 1
          If .Selected(j) = True Then
            Ctr2 = Ctr2 + 1
            ReDim Preserve Tabl2(Ctr2)
            Tabl2(Ctr2) = .List(j)
          End If
        Next j
      End With
    With Sheets("Feuil2")
      For i = 0 To UBound(Tabl1)
        For j = 0 To UBound(Tabl2)
            .Cells(.Rows.Count, "X").End(xlUp).Offset(1).Value = Tabl1(i)
            .Cells(.Rows.Count, "X").End(xlUp).Offset(, 1).Value = Tabl2(j)
        Next j
      Next i
    '  Ligne = .[X:Y].Find("*", , , , xlByRows, xlPrevious).Row 'recherche de la dernière ligne de la zone de critères
      Set Crit = .[X1:Y1].Resize(i * j + 1) 'définition de la zone de critères
      'application du filtre :
      .Range("A1", .Cells(.Rows.Count, 6).End(xlUp)).AdvancedFilter xlFilterInPlace, CriteriaRange:=Crit
    End With
    '  If Indice1 = 0 Then
    '    Range("$B$4:$O$30").AutoFilter Field:=5
    '  Else
    '    Range("$B$4:$O$30").AutoFilter Field:=5, Criteria1:=Tablo1, Operator:=xlAnd
    '  End If
    '
    '  Range("$B$4:$O$30").AutoFilter Field:=4, Criteria1:="V", Operator:=xlAnd
      '****************************************************************
     ' Dim Tablo2()
      'Dim K As Integer, Indice2 As Integer
      '
      'With Me.ComboBox2
       ' For K = 0 To .Listindex - 1
        'If .selected(K) = True Then
         '   ReDim Preserve Tablo2(Indice2)
    '      '  Tablo2(Indice2) = .List(K)
     '   End If
      '  Next K
       ' End With
    ' Range("$B$4:$O$30").AutoFilter Field:=4, Criteria1:=Tablo2, Operator:=xlAnd
     
        'End If
     
       ' If .selected(P) = True Then
       ' ActiveSheet.Range("$B$4:$O$30").AutoFilter Field:=4, Criteria1:="Tablo2", Operator:=xlAnd
     
        'End If
    'End With
    End Sub
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  15. #15
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 203
    Points : 14 354
    Points
    14 354
    Par défaut
    - si on choisi xlbyrows et xlPrevious la direction sera vers le haut
    - si on choisi xlbyrows et xlnext la direction sera vers le bas
    OK.

    - si on choisi xlbycolumns et xlPrevious la direction sera vers la droite
    - si on choisi xlbycolumns et xlNext la direction sera vers la gauche
    Là, c'est le contraire comme mnémo, pense à l'écriture : de haut en bas et de gauche à droite, c'est "Next" (suivant) dans l'autre sens, c'est "précédent" (previous).
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  16. #16
    Candidat au Club
    Homme Profil pro
    Paris
    Inscrit en
    Septembre 2014
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Paris
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2014
    Messages : 41
    Points : 4
    Points
    4
    Par défaut
    Il y a une erreur à l'exécution du code (erreur 9).

    L'indice n'appatient pas à la sélection. Je ne comprends pas ce qu'il veut dire par là. J'ai surligné en rouge l'endroit ou le curseur c'est arreté.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    With Sheets("Feuil2")
      For i = 0 To UBound(Tabl1)
        For j = 0 To UBound(Tabl2)
            .Cells(.Rows.Count, "X").End(xlUp).Offset(1).Value = Tabl1(i)
            .Cells(.Rows.Count, "X").End(xlUp).Offset(, 1).Value = Tabl2(j)
        Next j
      Next i
     ' Ligne = .[X:Y].Find("*", , , , xlByRows, xlPrevious).Row 'recherche de la dernière ligne de la zone de critères
      Set Crit = .[X1:Y1].Resize(i * j + 1) 'définition de la zone de critères
      'application du filtre :
      .Range("A1", .Cells(.Rows.Count, 6).End(xlUp)).AdvancedFilter xlFilterInPlace, CriteriaRange:=Crit
    End With

  17. #17
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 203
    Points : 14 354
    Points
    14 354
    Par défaut
    Te rappelles-tu ce que tu as sélectionné dans le formulaire ? A mon avis tu n'as rien sélectionné dans ListBox2.
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  18. #18
    Candidat au Club
    Homme Profil pro
    Paris
    Inscrit en
    Septembre 2014
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Paris
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2014
    Messages : 41
    Points : 4
    Points
    4
    Par défaut
    Bonjour Daniel,

    Exactement, quand je ne sélectionne aucun items dans la ListBox2, dés la 1ère action sur le bouton de commande la macro se met en défaut et le message d'erreur suivant apparait :

    "Erreur d'exécution '9'
    l'indice n'appartient pas à la sélection".

    Le code quand à lui s'arrête à la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     For j = 0 To UBound(Tabl2)
    Maintenant j'exécute plusieurs actions à la suite sur le bouton de commande exmple :

    On sélectionne commutateur et voie 3 ensuite on éffectue 2 actions sur la commande. Cette fois si j'ai le message d'erreur suivant :

    "Erreur d'exécution '1004'
    Cette commande requiért au moins deux lignes de données sources. Vous ne pouvez pas l'utiliser sur une seule ligne de données. Essayez la méthode suivante :

    - Si vous utilisez un filtre élaboré sélectionnez une plage de cellules qui contient aux moins deux ligne de données puis cliquez à nouveau sur la commande filtre élaboré.

    Le code quand à lui s'arrête sur la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Range("A1", .Cells(.Rows.Count, 6).End(xlUp)).AdvancedFilter xlFilterInPlace, CriteriaRange:=Crit
    Cette erreur apparait aprés plusieurs action sur la commande et je ne sais pas pourquoi.

    Le filtre fonctionne par contre de la maniére souhaité si une ou plusieurs sélections est faite dans les 2 listbox pour une seule action de la commande.

  19. #19
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 203
    Points : 14 354
    Points
    14 354
    Par défaut
    Bonjour,

    Exactement, quand je ne sélectionne aucun items dans la ListBox2, dés la 1ère action sur le bouton de commande la macro se met en défaut et le message d'erreur suivant apparait :
    Est-ce qu'il est normal que tu ne sélectionne rien dans ListBox2 ? Est-ce que je dois mettre un message d'avertissement ou est-ce que je dois uniquement filtrer sur les éléments de ListBox1 ? Et réciproquement est-ce que tu peux ne rien sélectionner dans ListBox1 ? et ne rien sélectionner dans les deux listboxes ?

    Le problème de la pression multiple sur le bouton est réglé avec le code suivant :

    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
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    Public Sub CommandButton1_Click()
    '*****************************************************************
    Dim Critère1 As Range, Critère2 As Range, Ctr1 As Integer, Ctr2 As Integer, Crit As Range
    Dim i As Integer, Ligne As Long
    Dim j As Integer, Tabl1() As Variant, Tabl2() As Variant
    With Sheets("Feuil2")
        On Error Resume Next
        .ShowAllData
        If Err.Number <> 0 Then Err.Clear
        On Error GoTo 0
        .[X:Y].ClearContents 'effacement de la zone de critères
        Set Critère1 = .[X1] '"Critère1" est la cellule X1 deFeuil2
        Critère1 = "equipements" 'nom de l'entête (doit être strictement le même que A1)
    End With
    Ctr1 = -1
    With Me.ListBox1
        For i = 0 To .ListCount - 1
          If .Selected(i) = True Then
            Ctr1 = Ctr1 + 1
            ReDim Preserve Tabl1(Ctr1)
            Tabl1(Ctr1) = .List(i) 'remplissage de la zone critères
         End If
        Next i
      End With
    With Sheets("Feuil2")
        Set Critère2 = .[Y1]
        Critère2 = "REF VOIE"
    End With
    Ctr2 = -1
      With Me.ListBox2
        For j = 0 To .ListCount - 1
          If .Selected(j) = True Then
            Ctr2 = Ctr2 + 1
            ReDim Preserve Tabl2(Ctr2)
            Tabl2(Ctr2) = .List(j)
          End If
        Next j
      End With
    With Sheets("Feuil2")
      For i = 0 To UBound(Tabl1)
        For j = 0 To UBound(Tabl2)
            .Cells(.Rows.Count, "X").End(xlUp).Offset(1).Value = Tabl1(i)
            .Cells(.Rows.Count, "X").End(xlUp).Offset(, 1).Value = Tabl2(j)
        Next j
      Next i
    '  Ligne = .[X:Y].Find("*", , , , xlByRows, xlPrevious).Row 'recherche de la dernière ligne de la zone de critères
      Set Crit = .[X1:Y1].Resize(i * j + 1) 'définition de la zone de critères
      'application du filtre :
      .Range("A1", .Cells(.Rows.Count, 6).End(xlUp)).AdvancedFilter xlFilterInPlace, CriteriaRange:=Crit
    End With
    '  If Indice1 = 0 Then
    '    Range("$B$4:$O$30").AutoFilter Field:=5
    '  Else
    '    Range("$B$4:$O$30").AutoFilter Field:=5, Criteria1:=Tablo1, Operator:=xlAnd
    '  End If
    '
    '  Range("$B$4:$O$30").AutoFilter Field:=4, Criteria1:="V", Operator:=xlAnd
      '****************************************************************
     ' Dim Tablo2()
      'Dim K As Integer, Indice2 As Integer
      '
      'With Me.ComboBox2
       ' For K = 0 To .Listindex - 1
        'If .selected(K) = True Then
         '   ReDim Preserve Tablo2(Indice2)
    '      '  Tablo2(Indice2) = .List(K)
     '   End If
      '  Next K
       ' End With
    ' Range("$B$4:$O$30").AutoFilter Field:=4, Criteria1:=Tablo2, Operator:=xlAnd
     
        'End If
     
       ' If .selected(P) = True Then
       ' ActiveSheet.Range("$B$4:$O$30").AutoFilter Field:=4, Criteria1:="Tablo2", Operator:=xlAnd
     
        'End If
    'End With
    End Sub
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  20. #20
    Candidat au Club
    Homme Profil pro
    Paris
    Inscrit en
    Septembre 2014
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Paris
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2014
    Messages : 41
    Points : 4
    Points
    4
    Par défaut
    Tu peux ne rien sélectionner dans les 2 listbox et uniquement filtrer sur les critères lignes ou environnement. 1er exemple je veux voir afficher tous les équipements de la ligne 604000. 2ème exemple je veux voir tous les équipements situé dans la voie (V).

    Ce matin j'ai commencé à regarder pour coder les combobox du dessus pour justement pouvoir filtrer les données comme indiqué ci-dessus. Pour réaliser cette fonction j'ai inséré le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ActiveSheet.Range("$A$1:$F$65000").AutoFilter Field:=6, Criteria1:=ComboBox1.Value, Operator:=xlAnd
    ActiveSheet.Range("$A$1:$F$65000").AutoFilter Field:=4, Criteria1:=ComboBox2.Value, Operator:=xlAnd
    A l'exécution de la macro j'ai sélectionné tous les items des 2 listbox pour m'assurer d'avoir toutes les données contenue dans la base. N'ayant renseigné les données que pour la ligne 604000 je n'ai pu filtrer que par rapport à la combobox2.

    Le code que j'ai inséré fonctionne correctement malheureusement il ne fonctionne pas avec le tiens . Je filtre bien selon le critère voie ou piste mais derrière il n'y a plus de filtrage en fonction des différents équipements ou des différentes voies

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 4 1234 DernièreDernière

Discussions similaires

  1. [MySQL] demande d'aide sur une fonction
    Par kairi084 dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 13/05/2012, 13h51
  2. Besoin d'aide sur une fonction
    Par PrinceMaster77 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 30/08/2005, 17h40
  3. Besoin d'aide sur les fonction d'interbase
    Par BOUBOU81 dans le forum InterBase
    Réponses: 2
    Dernier message: 05/11/2004, 10h00
  4. demande d'aide sur samba
    Par marcoss dans le forum Développement
    Réponses: 5
    Dernier message: 04/12/2003, 19h38

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