Bonjour à tous,
Ma demande va sans doute vous paraitre saugrenue mais j'aurais besoin d'un peu d'aide pour optimiser et organiser un code que j'ai écrit il y a quelques temps déjà. J'aimerais le rendre plus lisible, éventuellement passer par des fonctions etc... J'aimerais juste quelques conseils de la part de personnes expérimentées. Avant de vous copier mon code, je vais d'abord vous exposer comment sont disposées les données puis ce qu'effectue mon code :
DISPOSITION DES DONNEES (La première donnée se trouve toujours en A1) :
Mon code va comparer tous les composant des LRU entre eux et faire ressortir le pourcentage de composants communs que chaque LRU possède avec un autre. Ici le code comparerait :
LRU1
Composant1 - LRU2/Composant1
Composant1 - LRU2/Composant2
Composant1 - LRU2/ComposantX
Composant1 - LRU3/ComposantX
etc..
Le résultat est ensuite affiché dans un onglet "Communs". Je vous mets mon code. Il est un peu bordélique mais j'ai tenté de le commenté pour qu'il soit compris facilement (j'espère). C'est un peu indigeste (d'où les courageux au grand coeur). J'espère que quelqu'un aura la patience de m'aider (à me faire progresser ).
Merci
Ma demande va sans doute vous paraitre saugrenue mais j'aurais besoin d'un peu d'aide pour optimiser et organiser un code que j'ai écrit il y a quelques temps déjà. J'aimerais le rendre plus lisible, éventuellement passer par des fonctions etc... J'aimerais juste quelques conseils de la part de personnes expérimentées. Avant de vous copier mon code, je vais d'abord vous exposer comment sont disposées les données puis ce qu'effectue mon code :
DISPOSITION DES DONNEES (La première donnée se trouve toujours en A1) :
LRU1 | LRU2 | ... | LRUX |
Composant1 | Composant1 | ... | Composant1 |
Composant2 | Composant2 | ... | Composant2 |
ComposantX | ComposantX | ... | ComposantX |
Mon code va comparer tous les composant des LRU entre eux et faire ressortir le pourcentage de composants communs que chaque LRU possède avec un autre. Ici le code comparerait :
LRU1
Composant1 - LRU2/Composant1
Composant1 - LRU2/Composant2
Composant1 - LRU2/ComposantX
Composant1 - LRU3/ComposantX
etc..
Le résultat est ensuite affiché dans un onglet "Communs". Je vous mets mon code. Il est un peu bordélique mais j'ai tenté de le commenté pour qu'il soit compris facilement (j'espère). C'est un peu indigeste (d'où les courageux au grand coeur). J'espère que quelqu'un aura la patience de m'aider (à me faire progresser
Merci
Code:
Option Explicit
Sub comparaison_LRU()
Application.ScreenUpdating = False
Dim debut As Date, temps As Date, fin As Date
debut = Time
Sheets(1).Name = "Tableau"
Sheets(2).Name = "Communs"
Dim boucleGenerale As Integer ' boucle sur toutes les colonnes
'=== Pour connaitre le nombre de colonnes à traiter ======
Dim nbColonnes As Integer
nbColonnes = Range("A1", [A1].End(xlToRight)).Columns.Count
'==========================================================
For boucleGenerale = 1 To nbColonnes
Dim DerLigLruTest As Integer, DerLigLruSelec As Integer
Dim ComposantEnCours As Integer, maxComposants As Integer, ComposantTest As Integer, TestEnCours As Integer, caseTab As Integer
Dim i As Integer, j As Integer
Dim composantsCommuns As Byte
Dim tabLruSelect(), tabLruTest(), tabLruCommuns(), tabPourcentage()
caseTab = 0
'====================================================================================================
' Selection des composants du LRU dont les composants vont être comparés avec tous les autres
' Composants insérés dans un tableau
With Sheets("Tableau")
'Pour obtenir le nombre de ligne du LRU test
DerLigLruSelec = .Range(.Cells(1, boucleGenerale), .Cells(1, boucleGenerale)).End(xlDown).Row
'Pour insérer d'un coup toutes les lignes dans un tableau
tabLruSelect = Range(.Cells(1, boucleGenerale), .Cells(DerLigLruSelec, boucleGenerale))
End With
'=====================================================================================================
TestEnCours = 1
maxComposants = (UBound(tabLruSelect) - 1) 'Pour faire la division du pourcentage
Do While TestEnCours < (nbColonnes + 1) 'boucle sur toutes les colonnes suivants afin de comparer les composants avec le LRU test
composantsCommuns = 0
If TestEnCours = boucleGenerale Then 'ne pas se comparer avec lui même
TestEnCours = TestEnCours + 1
End If
If TestEnCours > (nbColonnes) Then
Exit Do
End If
With Sheets("Tableau")
' même principe que pour DerLigLruSelec mais pour les LRU testés
DerLigLruTest = .Range(.Cells(1, TestEnCours), .Cells(1, TestEnCours)).End(xlDown).Row
tabLruTest = Range(.Cells(1, TestEnCours), .Cells(DerLigLruTest, TestEnCours))
End With
'Comparaison de tous les composants
For i = 2 To UBound(tabLruSelect) 'commence à 2 car 1 = numéro du LRU
For j = 2 To UBound(tabLruTest) ' Pareil
If (tabLruSelect(i, 1) = tabLruTest(j, 1)) Then '='
composantsCommuns = composantsCommuns + 1 '='
caseTab = caseTab + 1 '='Si communs, ajout du composant dans le tableau des communs
ReDim Preserve tabLruCommuns(caseTab) '='
'================================================================
'Permet d'éviter les répétitions de LRU select dans le tableau
If Not tabLruCommuns(caseTab - 1) = tabLruTest(1, 1) Then
tabLruCommuns(caseTab) = tabLruTest(1, 1)
Else
caseTab = caseTab - 1
ReDim Preserve tabLruCommuns(caseTab)
End If
'================================================================
End If
Next j
Next i
'Si des composants communs existent alors calcul du pourcentage et ajout dans le tableau pourcentag.
If composantsCommuns <> 0 Then
ReDim Preserve tabPourcentage(UBound(tabLruCommuns))
tabPourcentage(UBound(tabPourcentage)) = Round(((composantsCommuns / maxComposants) * 100), 0)
End If
TestEnCours = TestEnCours + 1
Loop
'Sur la première version du programme, lorsque les pourcentages étaient affichés, ils m'était impossible de les trier par ordre croissant
'J'ai donc décidé de passer par un tableau pourcentage que je trie en parallèle du tableauLruCommuns
' Tri
Dim tempPourcent As Double
Dim tempLru As String
Dim yapermute As Boolean
yapermute = True
While yapermute
yapermute = False
For i = 1 To UBound(tabPourcentage) - 1
If tabPourcentage(i) < tabPourcentage(i + 1) Then
tempPourcent = tabPourcentage(i)
tabPourcentage(i) = tabPourcentage(i + 1)
tabPourcentage(i + 1) = tempPourcent
tempLru = tabLruCommuns(i)
tabLruCommuns(i) = tabLruCommuns(i + 1)
tabLruCommuns(i + 1) = tempLru
yapermute = True
End If
Next i
Wend
' concatenation des composants communs avec leur pourcentage
For i = 1 To UBound(tabLruCommuns)
tabLruCommuns(i) = tabPourcentage(i) & "%" & " " & tabLruCommuns(i)
Next i
'Affiche du résultat sur la feuille "Communs"
With Sheets("Communs")
.Cells(boucleGenerale, 1).Value = tabLruSelect(1, 1)
.Cells(boucleGenerale, 2).Resize(1, UBound(tabLruCommuns) + 1).Value = tabLruCommuns
End With
Next boucleGenerale
fin = Time
temps = fin - debut
MsgBox ("C'est fini !" & Chr(10) & "temps de traitement " & temps)
End Sub