Optimisation possible ? VBA sur Excel

Résolu
cs_ATitus Messages postés 32 Date d'inscription samedi 8 mai 2004 Statut Membre Dernière intervention 9 février 2010 - 2 févr. 2005 à 19:32
Afyn Messages postés 608 Date d'inscription samedi 3 août 2002 Statut Membre Dernière intervention 22 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

ATitus_

5 réponses

Afyn Messages postés 608 Date d'inscription samedi 3 août 2002 Statut Membre Dernière intervention 22 décembre 2016
2 févr. 2005 à 21:13
He bien commence par remplacer tes integer par des long

A+

Afyn - Navedac
3
mrdep1978 Messages postés 402 Date d'inscription jeudi 25 novembre 2004 Statut Membre Dernière intervention 7 juin 2009 6
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
3
mrdep1978 Messages postés 402 Date d'inscription jeudi 25 novembre 2004 Statut Membre Dernière intervention 7 juin 2009 6
2 févr. 2005 à 21:30
Euh Afyn, c'est pas l'inverse que tu veux dire ? Remplacer les long par des Integer ?
0
cs_ATitus Messages postés 32 Date d'inscription samedi 8 mai 2004 Statut Membre Dernière intervention 9 février 2010
3 févr. 2005 à 07:57
ATitus_

Bonjour .

Merci pour les conseils, je vais parfaire le Macro .

@ +

ATitus_
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Afyn Messages postés 608 Date d'inscription samedi 3 août 2002 Statut Membre Dernière intervention 22 décembre 2016
3 févr. 2005 à 18:16
- > mrdep

Non je pense que c'est plus rapide avec des long (32bits)

-> Atitus

Poste un fichier excel d'exemple, on verra ce qu'il est possible de faire

A+

Afyn
0