Formule VBA pour faire un copier sur plusieurs lignes

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 !

Re : Formule VBA pour faire un copier sur plusieurs lignes

Bonsoir juliensav,

Comme beaucoup d'entre nous, je me suis penché sur ton problème et essayer de comprendre.

Mais il faut avouer que ce n'est pas vraiment clair.

Veux-tu créer une nomenclature ?

Si oui, fais une recherche avec ce mot et apportes nous plus de précisions.

Amicalement Klin89
 
Re : Formule VBA pour faire un copier sur plusieurs lignes

Bonjour tous le monde,

Si j'ai bien compris voici un exemple :

Code:
Sub Tri()
Dim Tablo, TabCol(), Col, Ck, Ci
Dim x As Long, k As Long, y As Long, m As Long, q As Long, j As Long, n As Long
Set Col = CreateObject("Scripting.Dictionary")
Application.ScreenUpdating = False
With Sheets("famille-produit")
  Tablo = .Range("A2:C" & .Range("A65536").End(xlUp).Row)
 
  For x = 1 To UBound(Tablo)
    If Not Col.Exists(Tablo(x, 3)) Then
       Col.Add Tablo(x, 3), 1
    Else
       temp = Col.Item(Tablo(x, 3))
       Col.Remove Tablo(x, 3)
       Col.Add Tablo(x, 3), temp + 1
    End If
  Next x
  Ck = Col.keys
  Ci = Col.items
  For k = LBound(Ci) To UBound(Ci)
    ReDim Preserve TabCol(1, 1 To k + 1)
    TabCol(0, k + 1) = Ck(k)
    TabCol(1, k + 1) = Ci(k)
  Next
  y = 2
  j = 2
  For m = 1 To UBound(TabCol, 2)
     For q = 1 To UBound(Tablo)
       If TabCol(0, m) = Tablo(q, 3) Then
         .Range("G" & y) = Tablo(q, 1)
         .Range("H" & y) = Tablo(q, 2)
            For n = 1 To UBound(Tablo)
               If Tablo(n, 3) = Tablo(q, 3) Then
                  If Tablo(n, 2) <> Tablo(q, 2) Then
                    .Range("I" & j) = Tablo(n, 2)
                    j = j + 1
                  End If
               End If
            Next
         y = y + (TabCol(1, m) - 1)
       End If
     Next
  Next
 
End With
Application.ScreenUpdating = True
End Sub

Je suis resté sur la 1ère feuille (Colonnes G,H,I) c'est plus facile pour vérifier les résultats. Le traitement se fait en 8-9 secondes (~ 65400 lignes)

Tablo correspond à ta plage de A2 à Cxxx (tableau à 3 colonnes)
Col reprend les élements de la colonne C sans doublon (Keys) et le nombre de doublon pour chaque éléments (Items).
Ck est un tableau avec les élements de Col (Keys).
Ci est un tableau avec les élements de Col (Items), nombre de doublon.
TabCol est un tableau regroupant les Ck et Ci.

Mais attention si tu n'es pas sous Excel 2007 tu seras obligé de couper ta base en deux.
Dans l'exemple que tu as mis, il faut supprimer et mettre ailleurs sur la feuille toutes les lignes après celle-ci
ligne 1558 (13581 - 570-2C-ES - Vanity)
Sinon tu dépasses la limite de la feuille => 65536 lignes.

A+
 
Dernière édition:
Re : Formule VBA pour faire un copier sur plusieurs lignes

Merci beaucoup. Tout fonctionne à merveille!!!!! 😀

Bonjour tous le monde,

Si j'ai bien compris voici un exemple :

Code:
Sub Tri()
Dim Tablo, TabCol(), Col, Ck, Ci
Dim x As Long, k As Long, y As Long, m As Long, q As Long, j As Long, n As Long
Set Col = CreateObject("Scripting.Dictionary")
Application.ScreenUpdating = False
With Sheets("famille-produit")
  Tablo = .Range("A2:C" & .Range("A65536").End(xlUp).Row)
 
  For x = 1 To UBound(Tablo)
    If Not Col.Exists(Tablo(x, 3)) Then
       Col.Add Tablo(x, 3), 1
    Else
       temp = Col.Item(Tablo(x, 3))
       Col.Remove Tablo(x, 3)
       Col.Add Tablo(x, 3), temp + 1
    End If
  Next x
  Ck = Col.keys
  Ci = Col.items
  For k = LBound(Ci) To UBound(Ci)
    ReDim Preserve TabCol(1, 1 To k + 1)
    TabCol(0, k + 1) = Ck(k)
    TabCol(1, k + 1) = Ci(k)
  Next
  y = 2
  j = 2
  For m = 1 To UBound(TabCol, 2)
     For q = 1 To UBound(Tablo)
       If TabCol(0, m) = Tablo(q, 3) Then
         .Range("G" & y) = Tablo(q, 1)
         .Range("H" & y) = Tablo(q, 2)
            For n = 1 To UBound(Tablo)
               If Tablo(n, 3) = Tablo(q, 3) Then
                  If Tablo(n, 2) <> Tablo(q, 2) Then
                    .Range("I" & j) = Tablo(n, 2)
                    j = j + 1
                  End If
               End If
            Next
         y = y + (TabCol(1, m) - 1)
       End If
     Next
  Next
 
End With
Application.ScreenUpdating = True
End Sub

Je suis resté sur la 1ère feuille (Colonnes G,H,I) c'est plus facile pour vérifier les résultats. Le traitement se fait en 8-9 secondes (~ 65400 lignes)

Tablo correspond à ta plage de A2 à Cxxx (tableau à 3 colonnes)
Col reprend les élements de la colonne C sans doublon (Keys) et le nombre de doublon pour chaque éléments (Items).
Ck est un tableau avec les élements de Col (Keys).
Ci est un tableau avec les élements de Col (Items), nombre de doublon.
TabCol est un tableau regroupant les Ck et Ci.

Mais attention si tu n'es pas sous Excel 2007 tu seras obligé de couper ta base en deux.
Dans l'exemple que tu as mis, il faut supprimer et mettre ailleurs sur la feuille toutes les lignes après celle-ci
ligne 1558 (13581 - 570-2C-ES - Vanity)
Sinon tu dépasses la limite de la feuille => 65536 lignes.

A+
 
- 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
13
Affichages
348
R
  • Question Question
Réponses
3
Affichages
115
regis6460
R
Réponses
3
Affichages
275
Réponses
5
Affichages
347
Réponses
2
Affichages
93
Retour