Assembler 2 macros
Bonjour à tous et à toute,
N'étant pas un expert sur le logiciel excel, j'aimerais savoir s'il est possible de mettre 2 macros ensemble pour m'éviter 2 manipulations. A ce jour, j'ai une macro qui me permet de trier du matériel en fonction des doublons pour me les comptabilisé, et une autre macro qui me permet, à chaque changement de référence, de me les trier par couleurs.
Je vous met en pièce jointe les 2 fichiers qui ont les macros.
Le fichier Fichier pour nomenclature à ne pas supprimer11 - Copie sera mon fichier de base pour faire mes nomenclatures de schémas
Si quelqu'un peut m'aider, cela serait super cool de sa part.
Merci d'avance
Bonjour,
Voici le code à mettre dans le fichier Techni-Métal-Systèmes :
Option Explicit
Const LigDeb As Long = 2
Const NbCol As Long = 8
Sub classement()
Dim TotalLigne As Long, Ref As String, Quantite As Double, i As Long, j As Long
TotalLigne = ThisWorkbook.Sheets("Liste des composant").Range("A65536").End(xlUp).Row
For i = LigDeb To TotalLigne
Ref = ThisWorkbook.Sheets("Liste des composant").Cells(i, 2)
Quantite = ThisWorkbook.Sheets("Liste des composant").Cells(i, 4)
For j = i + 1 To TotalLigne
If ThisWorkbook.Sheets("Liste des composant").Cells(j, 2) = Ref Then
Quantite = Quantite + ThisWorkbook.Sheets("Liste des composant").Cells(j, 4)
ThisWorkbook.Sheets("Liste des composant").Rows(j).Select
Selection.Delete Shift:=xlUp
TotalLigne = TotalLigne - 1
j = j - 1
End If
Next j
ThisWorkbook.Sheets("Liste des composant").Cells(i, 4) = Quantite
Next i
Call Alterner
End Sub
Sub Alterner()
Dim Couleur
Dim DerLig As Long
Dim i As Long, n As Long
Couleur = Array(48, 24)
DerLig = Range("E" & Rows.Count).End(xlUp).Row
For i = LigDeb To DerLig
If Application.CountIf(Range("E" & LigDeb).Resize(i - LigDeb + 1), Range("E" & i).Value) = 1 Then n = (n + 1) Mod 2
Range("A" & i).Resize(, NbCol).Interior.ColorIndex = Couleur(n)
Next i
End SubTu peux copier le code aussi dans l'autre fichier, mais il faut changer les deux variables :
Const LigDeb As Long = 10
Const NbCol As Long = 7En remplaçant le 10 par un 2 car la première ligne est la seconde et le 7 par un 8, car il y a une colonne de plus "Monté par".
Nickel Benoit, au top.
Celle petit bémol, rien de grave, c'est juste que ça me rajoute des zéros sur les lignes qui ont été supprimé.
Merci encore
Bonsoir,
C'est parce que tu as une boucle qui va de LigDeb jusqu'à TotalLigne. Le fait que tu décrémentes "TotalLigne = TotalLigne - 1" n'y change rien, la boucle se fait sur la valeur initiale de TotalLigne. Je m'explique, si au démarrage de la boucle, Le total de lignes est de 100, même si tu supprimes des lignes et réduit la valeur de TotalLigne, la boucle ira jusqu'à 100. Il faut donc mettre
If i > TotalLigne Then Exit Forjuste après le démarrage de la boucle.
Cela donne ceci :
Option Explicit
Const LigDeb As Long = 2
Const NbCol As Long = 8
Sub classement()
Dim TotalLigne As Long, Ref As String, Quantite As Double, i As Long, j As Long
TotalLigne = ThisWorkbook.Sheets("Liste des composant").Range("A65536").End(xlUp).Row
For i = LigDeb To TotalLigne
If i > TotalLigne Then Exit For
Ref = ThisWorkbook.Sheets("Liste des composant").Cells(i, 2)
Quantite = ThisWorkbook.Sheets("Liste des composant").Cells(i, 4)
For j = i + 1 To TotalLigne
If ThisWorkbook.Sheets("Liste des composant").Cells(j, 2) = Ref Then
Quantite = Quantite + ThisWorkbook.Sheets("Liste des composant").Cells(j, 4)
ThisWorkbook.Sheets("Liste des composant").Rows(j).Select
Selection.Delete Shift:=xlUp
TotalLigne = TotalLigne - 1
j = j - 1
End If
Next j
ThisWorkbook.Sheets("Liste des composant").Cells(i, 4) = Quantite
Next i
Call Alterner
End Sub
Sub Alterner()
Dim Couleur
Dim DerLig As Long
Dim i As Long, n As Long
Couleur = Array(48, 24)
DerLig = Range("E" & Rows.Count).End(xlUp).Row
For i = LigDeb To DerLig
If Application.CountIf(Range("E" & LigDeb).Resize(i - 1), Range("E" & i).Value) = 1 Then n = (n + 1) Mod 2
Range("A" & i).Resize(, NbCol).Interior.ColorIndex = Couleur(n)
Next i
End SubTu peux aussi remplacer la boucle For/Next par une boucle Do Until / Loop (ou Do While / Loop). Cela donne cela :
Option Explicit
Const LigDeb As Long = 2
Const NbCol As Long = 8
Sub classement()
Dim TotalLigne As Long, Ref As String, Quantite As Double, i As Long, j As Long
TotalLigne = ThisWorkbook.Sheets("Liste des composant").Range("A65536").End(xlUp).Row
i = LigDeb
Do Until i > TotalLigne
Ref = ThisWorkbook.Sheets("Liste des composant").Cells(i, 2)
Quantite = ThisWorkbook.Sheets("Liste des composant").Cells(i, 4)
For j = i + 1 To TotalLigne
If ThisWorkbook.Sheets("Liste des composant").Cells(j, 2) = Ref Then
Quantite = Quantite + ThisWorkbook.Sheets("Liste des composant").Cells(j, 4)
ThisWorkbook.Sheets("Liste des composant").Rows(j).Select
Selection.Delete Shift:=xlUp
TotalLigne = TotalLigne - 1
j = j - 1
End If
Next j
ThisWorkbook.Sheets("Liste des composant").Cells(i, 4) = Quantite
i = i + 1
Loop
Call Alterner
End Sub
Sub Alterner()
Dim Couleur
Dim DerLig As Long
Dim i As Long, n As Long
Couleur = Array(48, 24)
DerLig = Range("E" & Rows.Count).End(xlUp).Row
For i = LigDeb To DerLig
If Application.CountIf(Range("E" & LigDeb).Resize(i - 1), Range("E" & i).Value) = 1 Then n = (n + 1) Mod 2
Range("A" & i).Resize(, NbCol).Interior.ColorIndex = Couleur(n)
Next i
End SubMerci Benoit,
Cela fonctionne mais petit hic, maintenant le changement de couleur en fonction des fabricants ne fonctionnent plus, ou du moins, il m'oublie de faire des changements de couleurs, me met plusieurs fabricant ensemble etc ...
Désolé mais je suis pas encore un pro d'Excel, vas falloir que je me forme
Effectivement, je suis reparti d'une ancienne version de test. Voici la version corrigée :
Option Explicit
Const LigDeb As Long = 10
Const NbCol As Long = 7
Sub classement()
Dim TotalLigne As Long, Ref As String, Quantite As Double, i As Long, j As Long
TotalLigne = ThisWorkbook.Sheets("Liste des composant").Range("A65536").End(xlUp).Row
For i = LigDeb To TotalLigne
If i > TotalLigne Then Exit For
Ref = ThisWorkbook.Sheets("Liste des composant").Cells(i, 2)
Quantite = ThisWorkbook.Sheets("Liste des composant").Cells(i, 4)
For j = i + 1 To TotalLigne
If ThisWorkbook.Sheets("Liste des composant").Cells(j, 2) = Ref Then
Quantite = Quantite + ThisWorkbook.Sheets("Liste des composant").Cells(j, 4)
ThisWorkbook.Sheets("Liste des composant").Rows(j).Select
Selection.Delete Shift:=xlUp
TotalLigne = TotalLigne - 1
j = j - 1
End If
Next j
ThisWorkbook.Sheets("Liste des composant").Cells(i, 4) = Quantite
Next i
Call Alterner2
End Sub
Sub Alterner()
Dim Couleur
Dim DerLig As Long
Dim i As Long, n As Long
Couleur = Array(48, 24)
DerLig = Range("E" & Rows.Count).End(xlUp).Row
For i = LigDeb To DerLig
If Application.CountIf(Range("E" & LigDeb).Resize(i - LigDeb + 1), Range("E" & i).Value) = 1 Then n = (n + 1) Mod 2
Range("A" & i).Resize(, NbCol).Interior.ColorIndex = Couleur(n)
Next i
End SubNickel benoit cela fonctionne nickel, j'ai juste supprimer le 2 au niveau de call alterner2 et cela fonctionne parfaitement.
Je vais être encore chiant mais est-il possible qu'une fois le tri effectué et le changement de couleur en fonction des fabricants, faire toute les bordures des cellules une fois le tri et le changement de couleur effectués.
Merci encore pour tout.
C'est top d'avoir des gens comme vous