Macro qui fait un listing

sircroco

XLDnaute Nouveau
Bonjour à vous,

J'espère que vous allez bien, je fais ce topic car j'ai besoins d'une petite macro sur le fichier Alpha qui permet de lister (sur la feuille Sheet2) tous les couples Magasin-Article qui ont aucune commande à l'année 2018 .

Par exemple dans le cas qu'on a ici, on aurait dans Sheet2:
150 BMW M3
150 RS3 AUDI
200 CLIO3

Je souhaite donc une macro qui permet de faire ça.
On pourrait faire ça avec un TCD mais ça serait long à faire si la liste est longue.

Il y a déjà la macro "Pas de commande en 2018" mais ça ne produit pas le résultat attendu... . (En PJ)
 

Pièces jointes

  • Alpha v1sm.xlsm
    23.8 KB · Affichages: 23

sircroco

XLDnaute Nouveau
Oui mais malheureusement sa macro finale ne correspond pas vraiment à ce que j'attendais.

On y arrive... votre macro n'a pas pris en compte deux choses importantes :

- Dans Sheet2 je souhaite uniquement les colonnes Magasins et articles
- Dans Sheet2 toujours, je ne veux pas qu'on fait apparaître plus de deux fois le même couple Magasin-Article car c'est inutile, c'est-à-dire, voilà ce qu'on doit avoir en résultat sur Sheet2:

Magasin Article
150 BMW M3
150 RS3 AUDI
200 CLIO3

Car il n'y a aucune ligne avec l'année 2018 sur ces couples Magasin-Article.


Je vous remercie énormément de votre compréhension.
 

gosselien

XLDnaute Barbatruc
re,
j'ai mis l'année pour justement savoir quelles sont les années gardées, et on le vérifie ainsi..

ceci dit le TCD fait ce que tu demandes et sans macro !

Une macro est utile s'il y des milliers ou dizaines de milliers (voire plus) de lignes :)

P.
 

klin89

XLDnaute Accro
Bonsoir à tous, :)

à tester :
VB:
Option Explicit
Sub test()
Dim a, i As Long, txt As String, dico As Object
    Set dico = CreateObject("Scripting.Dictionary")
    dico.CompareMode = 1
    a = Sheets(1).Range("a1").CurrentRegion.Value
    For i = 2 To UBound(a, 1)
        If a(i, 3) <> 2018 Then
            txt = Join$(Array(a(i, 1), a(i, 2)), Chr(2))
            dico(txt) = VBA.Array(a(i, 1), a(i, 2))
        End If
    Next
    For i = 2 To UBound(a, 1)
        If a(i, 3) = 2018 Then
            txt = Join$(Array(a(i, 1), a(i, 2)), Chr(2))
            If dico.exists(txt) Then
                dico.Remove txt
            End If
        End If
    Next
    With Sheets(2).Range("a1").Resize(, 2)
        .CurrentRegion.Clear
        If dico.Count > 0 Then
            .Value = Array("Magasin", "Article")
            With .Offset(1).Resize(dico.Count)
                .Value = Application.Transpose(Application.Transpose(dico.items))
            End With
        End If
    End With
    Set dico = Nothing
End Sub
klin89
 
Dernière édition:

sircroco

XLDnaute Nouveau
Bonjour,

Merci à toi Klin89 ça fonctionne niquel, mais il reste un tout petit soucis, lorsque j'ai une référence "0083" par exemple, quand j'exécute la macro, ça se transforme en format nombre, donc on obtient "83", possible de conserver "0083" ? je souhaite absolument conserver le format tel qu'il a été.

Fichier :
 

Pièces jointes

  • fonctionne.xlsm
    35.3 KB · Affichages: 25

Statistiques des forums

Discussions
312 508
Messages
2 089 137
Membres
104 046
dernier inscrit
ouiza