XL 2013 VBA sur filtres automatiques

tony1711

XLDnaute Nouveau
Bonjour à tous,

Je souhaiterais pouvoir, via VBA, saisir du texte dans des cellules en fonctions du resultat du filtres.

Par exemple dans le fichier ci-joint, je voudrais qu'il soit écrit dans un onglet du classeur "RENITA" et "Ethernet-Line" dans la cellule à coté si le résultat du filtre sur la colonne F "Customer" = RENITA est supérieur ou égal à 1.
De la même façon je souhaiterais qu'ils soit inscrit dans la ligne en dessous "Ptel Residential" et "IP-VPN, Ethernet-LAN" si le résultat du filtre sur la colonne F "Customer" = EPT 3Play" est supérieur ou égal à 1.


Si quelqu'un peut m'éclairer,

Merci d'avance
Cordialement
tony1711
 

Pièces jointes

  • services_inventory_22_Aug_2016_13-20-58.xlsx
    46.3 KB · Affichages: 53

chris

XLDnaute Barbatruc
Bonjour

Question peu claire

Un filtre n'est pas >=1.
Il affiche éventuellement une ou plusieurs lignes, ou bien il est actif ou non actif...
Il peut être actif seul ou bien combiné avec d'autre filtres sur cette même colonne ou sur d'autres colonnes...

Pour ma part je n'ai pas non plus compris le lien entre la valeur du filtre et ce qui doit être reporté dans l'autre onglet.
Une petite table de correspondance serait sans doute utile.

Plutôt que de poser la même question sur n forums en même temps, il serait bien d'être plus précis dans ta question.
 

tony1711

XLDnaute Nouveau
Bonjour Chris,

Je sais qu'un filtre n'est pas > 1 je voulais dire que le nombre de ligne afficher est supérieur à 1.
Quant à la valeur du filtre je souhaite reporter les valeurs "RENITA"en A1 et "Ethernet-Line" en B1 par exemple, si le nombre de ligne affiché en filtrant la colonne F par la valeur "RENITA" est supérieur ou egale à 1

De la même facon si la valeur du filtre "EPT 3Play" affiche une ou plusieurs lignes je souhaite reporter les valeurs "Ptel Residential" en A2 et "IP-VPN, Ethernet-LAN" en B2.

Cordialement
 

Paf

XLDnaute Barbatruc
Bonjour tony1711, chris,

un essai macro, à copier dans la feuille de code de la feuille services_inventory_22_Aug_2016_
VB:
Private Sub Worksheet_Calculate()
Dim W1 As Worksheet
Set W1 = Worksheets("services_inventory_22_Aug_2016_")
With W1.AutoFilter.Filters(6)
  If .On Then
  If Application.Subtotal(3, W1.Columns("F")) > 0 Then
  Select Case .Criteria1
  Case "=Renita"
  Ecrire "RENITA", "Ethernet-Line", 1
  Case "=EPT 3Play"
  Ecrire "Ptel Residential", "IP-VPN, Ethernet-LAN", 2
  End Select
  End If
  End If
End With
End Sub

Code:
Sub Ecrire(Nom1, Nom2, Ligne)
With Worksheets("Exemple")
.Cells(Ligne, 1) = Nom1
.Cells(Ligne, 2) = Nom2
End With
End Sub

et pour que la sub calculate se déclenche, en G1 de cette même feuille : =SOUS.TOTAL(3;F:F)

A+
 

tony1711

XLDnaute Nouveau
Bonjour Paf,

Merci pour ta réponse cela correspond presque à ce que je souhaite faire.
Serait-il possible que la macro test automatiquement les différentes valeurs que peut prendre le filtre sur le colonne F ("RENITA" et "EPT 3play") la macro sera ensuite lancé par un bouton ou un raccourci clavier.

Merci d'avance
 

Paf

XLDnaute Barbatruc
Re,

Par exemple dans le fichier ci-joint, je voudrais qu'il soit écrit dans un onglet du classeur "RENITA" et "Ethernet-Line" dans la cellule à coté si le résultat du filtre sur la colonne F "Customer" = RENITA est supérieur ou égal à 1.
De la même façon je souhaiterais qu'ils soit inscrit dans la ligne en dessous "Ptel Residential" et "IP-VPN, Ethernet-LAN" si le résultat du filtre sur la colonne F "Customer" = EPT 3Play" est supérieur ou égal à 1.

C'est pourtant bien ce que fait le code proposé.

cela correspond presque à ce que je souhaite faire.
Serait-il possible que la macro test automatiquement les différentes valeurs que peut prendre le filtre sur le colonne F ("RENITA" et "EPT 3play") la macro sera ensuite lancé par un bouton ou un raccourci clavier.

Soit il manque quelque chose, soit quel est l'intérêt de tester les différentes valeurs possibles pour ne rien en faire ?
S'il s'agit de pouvoir lancer la macro directement:
- copier les deux sub dans un module standard,
- renommer Private Sub Worksheet_Calculate() en Sub LaMacro(),
-puis vous lancez comme vous l'entendez.

A+
 

tony1711

XLDnaute Nouveau
Re Paf,

Alors l'intérêt de la macro est de pouvoir recupérer des noms de clients ( Comme RENITA et EPT 3play) et des technologies impactés (Comme IP-VPN et Ethernet-LAN), ce ne sont que deux exemple il y'a environ une vingtaine de filtre a faire manuellement. Je n'ai donné que deux exemples car je pense pouvoir terminer la macro après avoir compris la démarche.
C'est pourquoi je souhaite que la macro test les différents cas de figure et inscrit les résultats.

En espérant avoir bien expliqué mon besoin, je vous souhaite une bonne soirée.
Cordialement
tony1711
 

Paf

XLDnaute Barbatruc
Re,
En espérant avoir bien expliqué mon besoin,

Ben ... non. d'autant que vous ne répondez pas à mes questions....


pouvoir recupérer des noms de clients ( Comme RENITA et EPT 3play) et des technologies impactés (Comme IP-VPN et Ethernet-LAN),

récupérer les noms de clients ( Comme RENITA...) = OK , mais et des technologies impactés (Comme IP-VPN....), je ne vois pas où trouver cette info

c'est surement très clair dans votre esprit .....

Faut-il passer par une table de correspondance comme le suggérait chris au post 2 ?


Un code qui vous permet de mettre dans un tableau tous les clients (?) qui ont au moins une ligne dans le tableau:

VB:
Sub Clients()
Dim T1, T2, i As Long, dico
Set dico = CreateObject("Scripting.Dictionary")
With Worksheets("services_inventory_22_Aug_2016_")
T1 = .Range("F2:F" & .Range("F" & Rows.Count).End(xlUp).Row)
End With
For i = LBound(T1) To UBound(T1)
    dico(T1(i, 1)) = dico(T1(i, 1)) + 1
Next
T2 = Application.Transpose(dico.keys) 'tableau des codes clients
End Sub

après, en fonction de ce que vous voulez , on peut balayer ce tableau et comparer à une table de correspondance ou autre traitement...

A+
 

tony1711

XLDnaute Nouveau
Bonjour,

Effectivement désolé à force d'être dessus pour moi ça me semble évident.

Pour les technologies impactés c'est aussi en fonction du client, Par exemple si il y'a des lignes qui contiennent le client "RENITA" les technologies impactés sont forcément "Ethernet-Line", de la meme manière si il y'a des lignes qui contiennent "EPT 3Play" les technologies sont forcément "IP-VPN, Ethernet-LAN".

Je vous joint une table de correspondance avec les différents filtres que je fais manuellement. Il y a aussi des cas ou deux filtres doivent être fait

Merci d'avance
 

Pièces jointes

  • Table de correspondance.xlsx
    10.6 KB · Affichages: 43

Paf

XLDnaute Barbatruc
re,

j'ai inclus la table de correspondance dans le classeur initial (feuille Table), défusionné les cellules fusionnées tantôt en colonne A, tantôt en colonne B .

Plutôt qu'écrire les résultats dans une autres feuilles, le nombre de lignes, concernées par les critères de filtres (colonne A et B) , est écrit en colonne E.

VB:
 Sub Macro()
Dim Plage As Range, Table, T2, i As Long
With Worksheets("Table")
Table = .Range("A2:D" & .Range("D" & Rows.Count).End(xlUp).Row)
End With
Application.ScreenUpdating = False
With Worksheets("services_inventory_22_Aug_2016_")
Set Plage = .Range("A2:F" & .Range("F" & Rows.Count).End(xlUp).Row)
ReDim T2(1 To UBound(Table, 1), 1 To 1)
For i = LBound(Table, 1) To UBound(Table, 1)
    Plage.AutoFilter Field:=1
    Plage.AutoFilter Field:=6
    If Table(i, 1) <> "" Then Plage.AutoFilter Field:=6, Criteria1:=Table(i, 1)
    If Table(i, 2) <> "" Then Plage.AutoFilter Field:=1, Criteria1:=Table(i, 2)
    T2(i, 1) = Application.Subtotal(3, .Columns("F")) - 1
Next
End With
Plage.AutoFilter Field:=1
Plage.AutoFilter Field:=6
Worksheets("table").Range("E2").Resize(UBound(Table, 1), 1) = T2
Application.ScreenUpdating = True
End Sub

A+
 

Pièces jointes

  • Compte ligne.xls
    166 KB · Affichages: 76

tony1711

XLDnaute Nouveau
Salut Paf,

Tout d'abord merci cela correspond tout à fait à ce dont j'ai besoin.
Comment puis-je faire pour que dans le cas ou il faut filtrer sur la colonne A " ICMS ID" le filtre compte les résultats qui commencent par ce qui est indiqué dans la table de correspondance ( 1438, 1281, 1283 etc...)

Encore merci
tony1711
 

Paf

XLDnaute Barbatruc
re,


Les données de la colonne A étant numérique, on ne peut pas simplement filtrer sur "commence par ...".
Il faut d'abord les transformer en données Texte :
VB:
Sub TTexte()
With Worksheets("services_inventory_22_Aug_2016_")
For i = 2 To .Range("A" & Rows.Count).End(xlUp).Row
    .Cells(i, 1) = CStr(.Cells(i, 1))
Next
.Columns("A:A").NumberFormat = "@"
End With
End Sub

Puis, au niveau de la macro:
modifier :
If Table(i, 2) <> "" Then Plage.AutoFilter Field:=1, Criteria1:=Table(i, 2)
en :
If Table(i, 2) <> "" Then Plage.AutoFilter Field:=1, Criteria1:=Table(i, 2) & "*"

A+

 

Discussions similaires

Statistiques des forums

Discussions
312 487
Messages
2 088 825
Membres
103 971
dernier inscrit
abdazee