XL 2016 modifier fichier suivis de stock

phddesi

XLDnaute Junior
bonsoir

j'appel à votre âme charitable car j'ai un fichier que je souhaite modifier en VBA.
j'ai mis des explications directement dans le fichier.
je vous remercie d'avance pour le temps que vous me consacrerez.
 

Pièces jointes

  • suivis stock.xlsm
    26.5 KB · Affichages: 31
Solution
C'est bien signalé par le message,
malheureusement Microsoft préfère se "planter" plutôt que de renvoyer un count = 0
Remplacer la sub :
VB:
Sub Filtre_Designation()
Dim I       As Integer
Dim Crit()  As String
Dim Elem
On Error Resume Next
    N = [Stock[Code Fabricant]].SpecialCells(xlCellTypeVisible).Count
    If Err = 0 Then
        ReDim Crit(1 To N)
        For Each Elem In [Stock[Code Fabricant]].SpecialCells(xlCellTypeVisible).Cells
            I = I + 1:  Crit(I) = CStr(Elem)
        Next
        [Designation].ListObject.Range.AutoFilter Field:=1, Criteria1:=Crit, Operator:=xlFilterValues
        [Designation].Parent.Activate
    End If
End Sub
Ceci dit, cliquer pour afficher ce qui n'existe pas, ça se discute ... ;)

phddesi

XLDnaute Junior
Bonjour,
Je suppose que vous voulez dire :
N' afficher que certaines valeurs dans une colonne .

Vous aviez déjà un exemple dans la sub Filtre_Designation du dernier classeur

Cinématique :
- on charge dans une variable tableau toutes les valeurs qu'on veut afficher
- on applique un filtre à la colonne du tableau concernée en lui indiquant le variable tableau :

Pour exemple, classeur joint
La sub est capable de trier des tableaux structurés ou des ranges.
Attention cependant, un seul filtre est autorisé par feuille pour des ranges .
je vous ai mis le tableau pour mieux expliquer.
mais merci pour votre test
 

Pièces jointes

  • phddesi-2.xlsm
    11.4 KB · Affichages: 4

fanch55

XLDnaute Barbatruc
je vous ai mis le tableau pour mieux expliquer.
mais merci pour votre test
Je pense que vous voulez parler de la colonne E et non D,
On ne peut pas le faire par formule .
On ne peut pas faire de sauf avec plus de 2 valeurs à exclure

Pourquoi ne pas se servir manuellement des filtres natifs d'excel :
phd.gif

ou
phd2.gif


Si toutefois vous voulez une solution par code :
phd3.gif



VB:
Sub Filtrer_E()
    Filtre_Colonne [Designation], "Consommation", "A+*"
End Sub
Sub UnFiltrer_E()
    Filtre_Colonne [Designation], "Consommation"
End Sub

Sub Filtre_Colonne(Target As Range, Colonne, ParamArray Criteres() As Variant)
Dim List_Criteres   As Variant
Dim ID              As Variant
 
    If Target.ListObject Is Nothing Then
        If Not Target.Parent.AutoFilter Is Nothing Then Target.AutoFilter
        Set ID = Target.Rows(1).Find(Colonne)
    Else
        If Target.ListObject.AutoFilter.FilterMode Then Target.ListObject.AutoFilter.ShowAllData
        Set ID = Target.Rows(0).Find(Colonne)
    End If
  
    If Not ID Is Nothing Then ID = ID.Column - Target.Column + 1 Else ID = False

    If ID And UBound(Criteres) >= 0 Then
        List_Criteres = Criteres
        Target.AutoFilter Field:=ID, Operator:=xlFilterValues, Criteria1:=List_Criteres
    End If
 
    Set ID = Nothing
End Sub
 

phddesi

XLDnaute Junior
Je pense que vous voulez parler de la colonne E et non D,
On ne peut pas le faire par formule .
On ne peut pas faire de sauf avec plus de 2 valeurs à exclure

Pourquoi ne pas se servir manuellement des filtres natifs d'excel :
Regarde la pièce jointe 1120675
ou
Regarde la pièce jointe 1120676

Si toutefois vous voulez une solution par code :
Regarde la pièce jointe 1120679


VB:
Sub Filtrer_E()
    Filtre_Colonne [Designation], "Consommation", "A+*"
End Sub
Sub UnFiltrer_E()
    Filtre_Colonne [Designation], "Consommation"
End Sub

Sub Filtre_Colonne(Target As Range, Colonne, ParamArray Criteres() As Variant)
Dim List_Criteres   As Variant
Dim ID              As Variant
 
    If Target.ListObject Is Nothing Then
        If Not Target.Parent.AutoFilter Is Nothing Then Target.AutoFilter
        Set ID = Target.Rows(1).Find(Colonne)
    Else
        If Target.ListObject.AutoFilter.FilterMode Then Target.ListObject.AutoFilter.ShowAllData
        Set ID = Target.Rows(0).Find(Colonne)
    End If
 
    If Not ID Is Nothing Then ID = ID.Column - Target.Column + 1 Else ID = False

    If ID And UBound(Criteres) >= 0 Then
        List_Criteres = Criteres
        Target.AutoFilter Field:=ID, Operator:=xlFilterValues, Criteria1:=List_Criteres
    End If
 
    Set ID = Nothing
End Sub
merci pour tout ces explications.
bon week-end à vous
 

fanch55

XLDnaute Barbatruc
C'est bien signalé par le message,
malheureusement Microsoft préfère se "planter" plutôt que de renvoyer un count = 0
Remplacer la sub :
VB:
Sub Filtre_Designation()
Dim I       As Integer
Dim Crit()  As String
Dim Elem
On Error Resume Next
    N = [Stock[Code Fabricant]].SpecialCells(xlCellTypeVisible).Count
    If Err = 0 Then
        ReDim Crit(1 To N)
        For Each Elem In [Stock[Code Fabricant]].SpecialCells(xlCellTypeVisible).Cells
            I = I + 1:  Crit(I) = CStr(Elem)
        Next
        [Designation].ListObject.Range.AutoFilter Field:=1, Criteria1:=Crit, Operator:=xlFilterValues
        [Designation].Parent.Activate
    End If
End Sub
Ceci dit, cliquer pour afficher ce qui n'existe pas, ça se discute ... ;)
 

phddesi

XLDnaute Junior
Bonjour

une dernière chose et je pense pouvoir faire le reste seul.

car vous m'avez déjà beaucoup aidé.

j'ai écris ce que je veux dans la feuille excel.

merci d'avance
 

Pièces jointes

  • test.xlsm
    15 KB · Affichages: 3
Dernière édition:

Discussions similaires

Réponses
2
Affichages
566
Réponses
26
Affichages
790