cs_ATitus
Messages postés32Date d'inscriptionsamedi 8 mai 2004StatutMembreDernière intervention 9 février 2010
-
2 févr. 2005 à 19:32
Afyn
Messages postés608Date d'inscriptionsamedi 3 août 2002StatutMembreDernière intervention22 décembre 2016
-
3 févr. 2005 à 18:16
ATitus_
Bonjour .
En regardant ici et la sur le net , j'ai pu bricoler ce petit bout de code .
(En fait j'avais demandé un petit coup de main plus bas sur le Forum ).
Ce truc sert à chercher sur une Plage de données et ligne par ligne le nombre de fois ou sont sorties 3 Valeurs Ensembles , ces valeurs etant au choix de l'utilisateur.
En fin de Calcul on affiche le nombre de sorties trouvées à 0 / 1 / 2 / 3
Ici je passe par un tableau mis en memoire, ce qui largement plus rapide que la lecture ecriture sur Cellules de la Feuille.
Toutefois est'il possible d'optimiser encore ce code, soit pour le rendre plus rapide , soit pour avoir un "Code plus Propre" ?
Merci pour toute infos .
'------------
Dim Tabl
Dim I As Long, J As Long
Dim x1 As Integer, x2 As Integer, x3 As Integer
Dim Qté0 As Integer, Qté1 As Integer, Qté2 As Integer, Qté3 As Integer
'------------
VAL1 = Range("l1").Value
VAL2 = Range("M1").Value
VAL3 = Range("N1").Value
Tabl = Range("A1:J20000").Value
'----------------------------------------------------
For I = 1 To 20000 '<=-1------LIGNES TT
For J = 1 To 10 '<=-2------Colonnes TT
'---------------------------------------------------
If Tabl(I, J) = VAL1 Then '<----Valeur 1 L1
x1 = 1
'
ElseIf Tabl(I, J) = VAL2 Then '<----Valeur 2 M1
x2 = 1
'
ElseIf Tabl(I, J) = VAL3 Then '<----Valeur 3 N1
x3 = 1
'
End If
'
Next J '<=-2----------------Boucle COLONNES
'
If x1 + x2 + x3 = 1 Then
Qté1 = Qté1 + 1
ElseIf x1 + x2 + x3 = 2 Then
Qté2 = Qté2 + 1
ElseIf x1 + x2 + x3 = 3 Then
Qté3 = Qté3 + 1
Else: Qté0 = Qté0 + 1
End If
x1 0: x2 0: x3 = 0
'
Next I '<=-1-----------------Boucle Lignes
'
'------------SORTIE BOUCLE & AFFICHAGE RESULTAT
'
[O1] = Qté0: [P1] = Qté1: [Q1] = Qté2: [R1] = Qté3
'
'
End Sub
mrdep1978
Messages postés402Date d'inscriptionjeudi 25 novembre 2004StatutMembreDernière intervention 7 juin 20097 2 févr. 2005 à 21:26
Pour la propreté, il faudrait :
- déclarer les variables val1, val2, val3
- Modifier la déclaration de Tabl pr qu'on sache ce qu c'est : Dim Tabl() As Variant
- Je préfère des Select ... Case ... End Select à des If .... Elsif ....End If, mais c'est une question de choix
Select Case Tabl(I, J)
Case Val1 '<----Valeur 1 L1
x1 = 1
Case Val2 '<----Valeur 2 M1
x2 = 1
Case val3 '<----Valeur 3 N1
x3 = 1
Case Else
End Select
Pour l'optim, si tu n'as pas besoin des 20000 lignes, je te conseille ceci pour définir ton tableau :
'Tabl = Range("A1:J20000").Value
'Travaille avec la dernière ligne utilisée de la feuille Excel
Tabl = Range("A1:J" & UsedRange.Rows.Count).Value
'----------------------------------------------------
For I = 1 To UBound(Tabl, 1) '20000 '<=-1------LIGNES TT
For J = 1 To UBound(Tabl, 2) '10 '<=-2------Colonnes TT
'---------------------------------------------------
Aspect d'optim, mais qui apporte un gain proche de 0 :
Ca évite de faire 4 fois le calcul x1 + x2 + x3 (il le faisait à chaque test)
A la place de
If x1 + x2 + x3 = 1 Then
Qté1 = Qté1 + 1
ElseIf x1 + x2 + x3 = 2 Then
Qté2 = Qté2 + 1
ElseIf x1 + x2 + x3 = 3 Then
Qté3 = Qté3 + 1
Else: Qté0 = Qté0 + 1
End If
Faire :
li_Tot = x1 + x2 + x3
Select Case li_Tot
Case 1
Qté1 = Qté1 + 1
Case 2
Qté2 = Qté2 + 1
Case 3
Qté3 = Qté3 + 1
Case Else
Qté0 = Qté0 + 1
End Select