Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

manière plus rapide que mon sommeprod ---> vba et dico si possible :)

5 réponses
Avatar
Patrick
Bonjour,

dans mon fichier ci annexé, je dois compter un nombre de dossiers pour
base de données et ensuite un nombre de club par activité sportive; par
formule, ça ne pose par de problème mais malgré un pc tout récent et
24Mg de ram, c'est très lent.
Mes colonnes N et O sont donc correctes mais la formule en colonne N
devrait être remplacée par un code vba que je ne sais pas faire.
La formule pour mon nombre de dossier est refaite en vba, OK (voir les
colonnes R et S) .
Je cherche à présent à faire la même chose pour ma colonne N que vous
verrez sur ma feuille.
Je tiens à faire ceci en VBA pour la raison de lenteur évoquée plus haut.

Y-a-t-il une personne ici qui pourrait me dire comment faire en VBA et
si possible avec dico pour ma culture générale des dico pour accélérer
le processus; on imagine cette formule avec 15.000 lignes :(

Merci !!!
Patrick


http://www.cjoint.com/c/FBbqWkSNx7H

5 réponses

Avatar
DanielCo
Bonjour,
Essaie :
Option Base 1
Sub test()
Dim Tabl1 As Variant, Discipline As Variant, Result() As Integer, Sports As
Variant
Dim Tabl2 As Variant, Tabl() As String
Tabl1 = Application.Transpose([BÉNÉFICIAIRE])
Tabl2 = Application.Transpose([Discipline__sportive])
Discipline = Application.Transpose(Range("M7", Cells(Rows.Count,
13).End(xlUp)))
ReDim Result(UBound(Discipline))
ReDim Tabl(UBound(Tabl1))
For i = 1 To UBound(Tabl1)
If Not IsNumeric(Application.Match(Tabl1(i) & "|" & Tabl2(i), Tabl, 0))
Then
Tabl(i) = Tabl1(i) & "|" & Tabl2(i)
j = Application.Match(Tabl2(i), Discipline, 0)
Result(j) = Result(j) + 1
End If
Next i
Application.Calculation = xlCalculationManual
[T7].Resize(UBound(Result)) = Application.Transpose(Result)
Erase Result
ReDim Result(UBound(Discipline))
For i = 1 To UBound(Tabl1)
For j = 1 To UBound(Discipline)
If Tabl2(i) = Discipline(j) Then
Result(j) = Result(j) + 1
Exit For
End If
Next j
Next i
[U7].Resize(UBound(Result)) = Application.Transpose(Result)
Application.Calculation = xlCalculationAutomatic
End Sub
Il y a peut-être plus rapide. Après la soupe ?
Cordialement.
Daniel

Bonjour,

dans mon fichier ci annexé, je dois compter un nombre de dossiers pour base
de données et ensuite un nombre de club par activité sportive; par formule,
ça ne pose par de problème mais malgré un pc tout récent et 24Mg de ram,
c'est très lent.
Mes colonnes N et O sont donc correctes mais la formule en colonne N devrait
être remplacée par un code vba que je ne sais pas faire.
La formule pour mon nombre de dossier est refaite en vba, OK (voir les
colonnes R et S) .
Je cherche à présent à faire la même chose pour ma colonne N que vous verrez
sur ma feuille.
Je tiens à faire ceci en VBA pour la raison de lenteur évoquée plus haut.

Y-a-t-il une personne ici qui pourrait me dire comment faire en VBA et si
possible avec dico pour ma culture générale des dico pour accélérer le
processus; on imagine cette formule avec 15.000 lignes :(

Merci !!!
Patrick


http://www.cjoint.com/c/FBbqWkSNx7H
Avatar
DanielCo
Non, pas mieux. Cependant, une fois la feuille entièrement calculée, il suffit
d'une macro événementielle pour recalculer les seuls résultats ayant évolué.
Daniel

Bonjour,
Essaie :
Option Base 1
Sub test()
Dim Tabl1 As Variant, Discipline As Variant, Result() As Integer, Sports
As Variant
Dim Tabl2 As Variant, Tabl() As String
Tabl1 = Application.Transpose([BÉNÉFICIAIRE])
Tabl2 = Application.Transpose([Discipline__sportive])
Discipline = Application.Transpose(Range("M7", Cells(Rows.Count,
13).End(xlUp)))
ReDim Result(UBound(Discipline))
ReDim Tabl(UBound(Tabl1))
For i = 1 To UBound(Tabl1)
If Not IsNumeric(Application.Match(Tabl1(i) & "|" & Tabl2(i), Tabl,
0)) Then
Tabl(i) = Tabl1(i) & "|" & Tabl2(i)
j = Application.Match(Tabl2(i), Discipline, 0)
Result(j) = Result(j) + 1
End If
Next i
Application.Calculation = xlCalculationManual
[T7].Resize(UBound(Result)) = Application.Transpose(Result)
Erase Result
ReDim Result(UBound(Discipline))
For i = 1 To UBound(Tabl1)
For j = 1 To UBound(Discipline)
If Tabl2(i) = Discipline(j) Then
Result(j) = Result(j) + 1
Exit For
End If
Next j
Next i
[U7].Resize(UBound(Result)) = Application.Transpose(Result)
Application.Calculation = xlCalculationAutomatic
End Sub
Il y a peut-être plus rapide. Après la soupe ?
Cordialement.
Daniel

Bonjour,

dans mon fichier ci annexé, je dois compter un nombre de dossiers pour base
de données et ensuite un nombre de club par activité sportive; par formule,
ça ne pose par de problème mais malgré un pc tout récent et 24Mg de ram,
c'est très lent.
Mes colonnes N et O sont donc correctes mais la formule en colonne N
devrait être remplacée par un code vba que je ne sais pas faire.
La formule pour mon nombre de dossier est refaite en vba, OK (voir les
colonnes R et S) .
Je cherche à présent à faire la même chose pour ma colonne N que vous
verrez sur ma feuille.
Je tiens à faire ceci en VBA pour la raison de lenteur évoquée plus haut.

Y-a-t-il une personne ici qui pourrait me dire comment faire en VBA et si
possible avec dico pour ma culture générale des dico pour accélérer le
processus; on imagine cette formule avec 15.000 lignes :(

Merci !!!
Patrick


http://www.cjoint.com/c/FBbqWkSNx7H
Avatar
Patrick
Merci Daniel, je regarde à ça :)

Patrick
Avatar
DanielCo
Bonjour,
Avec un dictionnaire,, c'est beaucoup plus rapide :
Sub test3()
Dim Tabl1 As Variant, Discipline As Variant, Result() As Integer, Sports As
Variant
Dim Tabl2 As Variant, Tabl() As String, Dico As Object
Set Dico = CreateObject("Scripting.Dictionary")
Tabl1 = Application.Transpose([BÉNÉFICIAIRE])
Tabl2 = Application.Transpose([Discipline__sportive])
Discipline = Application.Transpose(Range("M7", Cells(Rows.Count,
13).End(xlUp)))
ReDim Result(UBound(Discipline))
ReDim Tabl(UBound(Tabl1))
For i = 1 To UBound(Tabl1)
If Not Dico.exists(Tabl1(i) & "|" & Tabl2(i)) Then
Dico.Add Tabl1(i) & "|" & Tabl2(i), Tabl1(i) & "|" & Tabl2(i)
' j = Application.Match(Tabl2(i), Discipline, 0)
For x = 1 To UBound(Discipline)
If Tabl2(i) = Discipline(x) Then
Result(x) = Result(x) + 1
Exit For
End If
Next x
End If
Next i
Application.Calculation = xlCalculationManual
[T7].Resize(UBound(Result)) = Application.Transpose(Result)
Erase Result
ReDim Result(UBound(Discipline))
For i = 1 To UBound(Tabl1)
For j = 1 To UBound(Discipline)
If Tabl2(i) = Discipline(j) Then
Result(j) = Result(j) + 1
Exit For
End If
Next j
Next i
[U7].Resize(UBound(Result)) = Application.Transpose(Result)
Application.Calculation = xlCalculationAutomatic
End Sub
Cordialement.
Daniel

Bonjour,

dans mon fichier ci annexé, je dois compter un nombre de dossiers pour base
de données et ensuite un nombre de club par activité sportive; par formule,
ça ne pose par de problème mais malgré un pc tout récent et 24Mg de ram,
c'est très lent.
Mes colonnes N et O sont donc correctes mais la formule en colonne N devrait
être remplacée par un code vba que je ne sais pas faire.
La formule pour mon nombre de dossier est refaite en vba, OK (voir les
colonnes R et S) .
Je cherche à présent à faire la même chose pour ma colonne N que vous verrez
sur ma feuille.
Je tiens à faire ceci en VBA pour la raison de lenteur évoquée plus haut.

Y-a-t-il une personne ici qui pourrait me dire comment faire en VBA et si
possible avec dico pour ma culture générale des dico pour accélérer le
processus; on imagine cette formule avec 15.000 lignes :(

Merci !!!
Patrick


http://www.cjoint.com/c/FBbqWkSNx7H
Avatar
Patrick
C'était ma demande première, Daniel, Merci

En effet, c'est bien plus rapide qu'une fonction matricielle :)

Patrick

Le 02-02-16 12:23, DanielCo a écrit :
Bonjour,
Avec un dictionnaire,, c'est beaucoup plus rapide :