Ne garder qu'une suite de valeurs... Dur à expliquer en quelques mots ^^

  • Initiateur de la discussion Initiateur de la discussion flint6593
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

flint6593

XLDnaute Occasionnel
Bonjour,

Je viens vous voir, car vous m'avez sortis de la panade plus d'une fois! 😀😀

Voilà en faite j'aimerais ne garder que les doublons. Mais pas seulement.
Je vous explique: 😕

- En fait dans la colonnes A, j'ai des références de produits.
(j'ai une macro pour trouver les doublons)

- Dans la colonne B, j'ai les lieux de stockage: I ou D

=> J'aimerais ne garder que les doublons qui ont dans leurs colonne B, I et D.

Pour connaître les produits qui sont en double dans les stocks des lieux I et D.😕😕😕

Savoir si ils sont en double dans I ou en double dans D ne m’intéresse pas...

J'espère avoir été assez explicite... J'ai un peu de mal à m'expliquer 🙂

Si jamais vous pouviez m'aider ce serait sympa... J'ai plus de 25000 références à traiter...

Merci!
 
Re : Ne garder qu'une suite de valeurs... Dur à expliquer en quelques mots ^^

Re,

Pas certain d'avoir bien saisi l'idée de doublons sur 2 lieux.

Voyez le fichier joint avec cette macro :

Code:
Sub Doublons2Lieux()
Dim Produit, n&, Lieu, tablo$(), d As Object, i&, lig1, lig2
Produit = Application.Transpose(Range("A2", [A65536].End(xlUp)))
n = UBound(Produit)
Lieu = Application.Transpose([B2].Resize(n))
ReDim tablo(1 To n)
Set d = CreateObject("Scripting.Dictionary")
For i = 1 To n
  lig1 = Application.Match(Produit(i) & "µI", tablo, 0)
  lig2 = Application.Match(Produit(i) & "µD", tablo, 0)
  If IsNumeric(lig1) And IsNumeric(lig2) Then _
    d(Produit(i)) = Produit(i)
  tablo(i) = Produit(i) & "µ" & Lieu(i)
Next
'---restitution---
[D2:D65536].ClearContents
If d.Count Then [D2].Resize(d.Count) = Application.Transpose(d.items)
End Sub
Dites-nous si c'est ce que vous voulez.

A+
 

Pièces jointes

Re : Ne garder qu'une suite de valeurs... Dur à expliquer en quelques mots ^^

En fait à mon boulot, on est en train de faire les inventaires, car on viens de regrouper sur un réseaux nos deux entrepôts.
Et il faut que j'identifie les pièces que l'on a en double dans les deux stocks.

Je n'ai pas besoin d'identifier les doubles dans le même lieux, car je les connais déjà.

Je vous met un fichier en exemple.

Le violet, c'est ce que je dois garder (supprimer tous le reste), le jaune, c'est les doublons mais dans le même lieu de stockage...

Merci!!!!!!
 

Pièces jointes

Re : Ne garder qu'une suite de valeurs... Dur à expliquer en quelques mots ^^

Bonjour flint6593, le forum,

Non, j'avais compliqué inutilement.

Vous recherchez simplement les produits qui sont dans l'un et l'autre lieu.

En fait il ne s'agit pas de doublons.

La macro est plus simple :

Code:
Sub Doublons2Lieux()
Dim Produit, n&, Lieu, tablo$(), d As Object, i&, lig
Produit = Application.Transpose(Range("A1", [A65536].End(xlUp)))
n = UBound(Produit)
Lieu = Application.Transpose([B1].Resize(n))
ReDim tablo(1 To n)
Set d = CreateObject("Scripting.Dictionary")
For i = 1 To n
  lig = Application.Match(Produit(i) & IIf(Lieu(i) = "I", "D", "I"), tablo, 0)
  If IsNumeric(lig) Then d(Produit(i)) = Produit(i)
  tablo(i) = Produit(i) & Lieu(i)
Next
'---restitution---
[D2:D65536].ClearContents
If d.Count Then [D2].Resize(d.Count) = Application.Transpose(d.items)
End Sub
J'ai aussi supprimé le séparateur "µ" qui normalement ne sert à rien.

A+
 

Pièces jointes

Re : Ne garder qu'une suite de valeurs... Dur à expliquer en quelques mots ^^

Vraiment merci de votre aide!!!!
C'est super sympa! Car je me voyais mal faire les 25000 référence à la main ^^

MERCI!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
Re : Ne garder qu'une suite de valeurs... Dur à expliquer en quelques mots ^^

Alors la macro pour 35000 lignes environ, avec le masquage de l’exécution de la macro (true, false) et un ordi portable assez vieux:

XP SP2, Intel CPU T2400, 1,83Ghz, 1gb de ram

Utilisation d'une version de office 2007 en portable.

1148, 625 secondes!!!!

Tcho et merci!!!!!
 
Re : Ne garder qu'une suite de valeurs... Dur à expliquer en quelques mots ^^

Re,

J'ai aussi fabriqué par copier/coller du tableau un fichier de 25000 lignes.

Sur mon ordi fixe (2 Ghz) la version (2) s'exécute en 7 mn 38 s.

C'est très long et c'est dû à Application.Match (fonction EQUIV).

Alors j'ai modifié la macro en faisant un tri préalable sur les 2 colonnes A et B :

Code:
Sub Doublons2Lieux()
Dim t#, Produit, n&, Lieu, d As Object, i&, txt$
t = Timer
[A:B].Sort [A1], xlAscending, [B1], , xlAscending, Header:=xlGuess 'double tri
Produit = Application.Transpose(Range("A1", [A65536].End(xlUp)))
n = UBound(Produit)
Lieu = Application.Transpose([B1].Resize(n))
Set d = CreateObject("Scripting.Dictionary")
For i = 1 To n
  If Lieu(i) = "D" Then
    txt = Produit(i)
1   If i < n Then
      If Produit(i + 1) = txt Then
        i = i + 1
        If Lieu(i) = "I" Then d(Produit(i)) = Produit(i): GoTo 2
        GoTo 1
      End If
    End If
  End If
2 Next
'---restitution---
[D2:D65536].ClearContents
If d.Count Then [D2].Resize(d.Count) = Application.Transpose(d.items)
MsgBox "Durée : " & Format(Timer - t, "0.00") & " seconde(s)"
End Sub
Version (3).

Chez moi le traitement se fait maintenant en 0,11 seconde 🙂

Dites-nous ce que ça donne sur votre fichier réel.

A+
 

Pièces jointes

Re : Ne garder qu'une suite de valeurs... Dur à expliquer en quelques mots ^^

C'est parfait!!!!!! Vraiment sympa!!!! Je commence à avoir pas mal de macro sous la main 🙂

Pendant que j'y suis, mais vu que tu as l'air super fort en macro, j'ai un autre petit soucis (si possible ne pas rouvrir un post, je veux pas polluer)😛

- J'ai des références de produits dans la colonne A
- dans la colonne B j'ai les différentes informations suivant le vécu de la pièce
- chaque information est sur une ligne, donc le référence en A est écrit plusieurs fois

J'aimerais garder seulement la dernière infos de chaque référence de pièce... (en violet)

Les infos que j'ai mis sont bidon, il peut y en avoir qu'une comme il peut y en avoir 25

Si jamais tu peux m'aider, tu me sauvera encore une journée de boulot!!!!!😉😉😉😉😉😉😉
 

Pièces jointes

Re : Ne garder qu'une suite de valeurs... Dur à expliquer en quelques mots ^^

Re,

Le problème est différent mais le principe est très semblable :

Code:
Sub DerniereInfo()
Dim Ref, n&, Info, d As Object, dd As Object, i&
[A:B].Sort [A1], xlAscending, Header:=xlGuess   'tri sur colonne A
Ref = Application.Transpose(Range("A1:A" & [A65536].End(xlUp).Row + 1)) 'inclut cellule vide
n = UBound(Ref)
Info = Application.Transpose([B1].Resize(n))
Set d = CreateObject("Scripting.Dictionary")
Set dd = CreateObject("Scripting.Dictionary")
For i = 1 To n
  If i < n Then
    If Ref(i + 1) <> Ref(i) Then
      d(Ref(i)) = Ref(i)
      dd(Info(i)) = Info(i)
    End If
  End If
Next
'---restitution---
[D2:E65536].ClearContents
If d.Count Then
  [D2].Resize(d.Count) = Application.Transpose(d.items)
  [E2].Resize(d.Count) = Application.Transpose(dd.items)
End If
End Sub
Fichier joint.

A+
 

Pièces jointes

Re : Ne garder qu'une suite de valeurs... Dur à expliquer en quelques mots ^^

Re,

Ah mais non !

La 2ème collection Scripting.Dictionary (dd) doit être remplacée par un tableau (tablo).

En effet Scripting.Dictionary supprime les doublons, or il y a des doublons dans les informations :

Code:
Sub DerniereInfo()
Dim Ref, n&, Info, d As Object, i&, tablo$(), j&
[A:B].Sort [A1], xlAscending, Header:=xlGuess   'tri sur colonne A
Ref = Application.Transpose(Range("A1:A" & [A65536].End(xlUp).Row + 1)) 'inclut cellule vide
n = UBound(Ref)
Info = Application.Transpose([B1].Resize(n))
Set d = CreateObject("Scripting.Dictionary")
For i = 1 To n
  If i < n Then
    If Ref(i + 1) <> Ref(i) Then
      d(Ref(i)) = Ref(i)
      ReDim Preserve tablo(j)
      tablo(j) = Info(i)
      j = j + 1
    End If
  End If
Next
'---restitution---
[D2:E65536].ClearContents
If d.Count Then
  [D2].Resize(d.Count) = Application.Transpose(d.items)
  [E2].Resize(d.Count) = Application.Transpose(tablo)
End If
End Sub
Fichier (2).

A+
 

Pièces jointes

Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
33
Affichages
3 K
E
Réponses
3
Affichages
794
ExcelBeginner
E
Réponses
11
Affichages
1 K
Retour