Optimisation possible ? VBA sur Excel

Résolu
Signaler
Messages postés
32
Date d'inscription
samedi 8 mai 2004
Statut
Membre
Dernière intervention
9 février 2010
-
Messages postés
608
Date d'inscription
samedi 3 août 2002
Statut
Membre
Dernière intervention
22 décembre 2016
-
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

Messages postés
608
Date d'inscription
samedi 3 août 2002
Statut
Membre
Dernière intervention
22 décembre 2016

He bien commence par remplacer tes integer par des long

A+

Afyn - Navedac
3
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 109 internautes nous ont dit merci ce mois-ci

Messages postés
402
Date d'inscription
jeudi 25 novembre 2004
Statut
Membre
Dernière intervention
7 juin 2009
5
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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 109 internautes nous ont dit merci ce mois-ci

Messages postés
402
Date d'inscription
jeudi 25 novembre 2004
Statut
Membre
Dernière intervention
7 juin 2009
5
Euh Afyn, c'est pas l'inverse que tu veux dire ? Remplacer les long par des Integer ?
Messages postés
32
Date d'inscription
samedi 8 mai 2004
Statut
Membre
Dernière intervention
9 février 2010

ATitus_

Bonjour .

Merci pour les conseils, je vais parfaire le Macro .

@ +

ATitus_
Messages postés
608
Date d'inscription
samedi 3 août 2002
Statut
Membre
Dernière intervention
22 décembre 2016

- > 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