compter les éléments selon 2critéres

3ali

XLDnaute Nouveau
bonjour
j'ai un classeur excel qui contient 3 colonnes et 60 000 lignes
comment compter le nombre de consultation pour chaque N° dossier
j'ai deja utiliser SOMMEPROD ca marche tres bien mais il me demande plusieur heure pour calculer ca(60 000 lignes avec 22 specialité!!!!!!!!!:22 x 60 000 formules)
ya t il une autre methode comme macro par exemple pour faciliter le calcule

voir fichier:je me laisse 1000 lignes seulement
merci
 

Pièces jointes

  • stat.zip
    357.9 KB · Affichages: 59
  • stat.zip
    357.9 KB · Affichages: 59
  • stat.zip
    357.9 KB · Affichages: 59

chris

XLDnaute Barbatruc
Re : compter les éléments selon 2critéres

Bonjour

Pour le plaisir de saluer tototiti :), je confirme :

  • mettre source sous forme de tableau : 2 clics + nommage du tableau
  • TCD : 2 minutes de manip et de calculs
sauf si ton PC est poussif, même avec 60 000 lignes cela ne dépassera pas 5 mn
 

MJ13

XLDnaute Barbatruc
Re : compter les éléments selon 2critéres

Bonjour à tous

C'est vrai qu'en TCD, c'est assez simple :).

Ah, aussi, Félicitations Chris pour tes 5000 :).
 

Pièces jointes

  • StatTCD.zip
    369 KB · Affichages: 53
Dernière édition:

chris

XLDnaute Barbatruc
Re : compter les éléments selon 2critéres

Bonjour

MJ13 : merci, je n'avais même pas vu :cool:!

Pour les TCD, il est vraiment conseillé, sinon indispensable, de mettre la source sous forme de tableau : cela évite les vides, n'interdit pas les regroupements (ce qui peut arriver avec une source colonnes) et assure l'évolutivité.
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : compter les éléments selon 2critéres

Bonjour le fil, bonjour le forum,

Une autre proposition VBA parce que j'y ai travaillé dessus mais qui me paraît bien désuète maintenant... :
Code:
Sub Macro1()
Dim x As Byte 'déclare la variable x
Dim dl As Integer 'déclare la variable dl (Dernière Ligne)
Dim pl As Range 'déclare la variable pl (PLage)
Dim dico As Object 'déclare la variable dico (DICtiOnnaire)
Dim cel As Range 'déclare la variable cel (CELlule)
Dim ps As Range 'déclare la variable ps (Plage des Spécialités)
Dim cv As Range 'déclare la variable cv (Cellules Visibles)

Application.ScreenUpdating = False 'masque les changements à l'écran
Range("G1").CurrentRegion.ClearContents 'efface les anciennes données
For x = 2 To 4 Step 2 'boucle sur les colonne 2 et 4
    Set dico = CreateObject("Scripting.Dictionary") 'déclare la variable dico
    dl = Cells(Application.Rows.Count, x).End(xlUp).Row 'définit la dernière ligne éditée dl de la colonne x
    Set pl = Range(Cells(2, x), Cells(dl, x)) 'définit la plage pl
    For Each cel In pl 'boucle sur toutes les cellules cel de la plage pl
        If cel.Value <> "" Then dico(cel.Value) = "" 'alimente le dictionnaire dico
    Next cel 'prochaine cellule de la boucle
    If x = 2 Then 'condition 1 : si colonne 2
        Range("G1").Value = "Nº Dossier" 'écrit "Nº Dossier" en G1
        Range("G2").Resize(dico.Count).Value = Application.Transpose(dico.keys) 'récupère en G2 la liste des numéros de dossiers sans doublon verticalement
    ElseIf x = 4 Then 'condition 2 : si colonne 4
        Range("H1").Resize(, dico.Count).Value = dico.keys 'récupère en H1 la liste des spécialités sans doublon horizontalement
    End If 'fin de la condition
Next x 'prochaine colonne de la boucle
Set ps = Range("D2:D" & dl) 'définit la plage des spécialitées ps
dl = Cells(Application.Rows.Count, 7).End(xlUp).Row 'redéfinit la dernière ligne éditée de la colonne 7 (=G)
Set pl = Range("G2:G" & dl) 'redéfinit la plage pl
For Each cel In pl 'boucle sur toutes les cellules cel de la plage pl
    ActiveSheet.Range("B1").AutoFilter 'lance le filtre automatique
    Range("B1").AutoFilter field:=1, Criteria1:=cel.Value 'filtre la colonne B avec le numéro de dossier comme critère
    For Each cv In ps.SpecialCells(xlCellTypeVisible) 'boucle sur toutes les spécialités visibles
        'incrémente de 1 la cellule dans la même ligne que cv dans la colonne issue de la recherche en ligne 1 de la spécialité
        Cells(cel.Row, Rows(1).Find(cv.Value, , xlValues, xlWhole).Column) = Cells(cel.Row, Rows(1).Find(cv.Value, , xlValues, xlWhole).Column) + 1
    Next cv 'prochaine spécialité visible de la boucle
    ActiveSheet.Range("B1").AutoFilter 'annule le filtre automatque
Next cel
Application.ScreenUpdating = True 'affiche les changements à l'écran
End Sub
 

3ali

XLDnaute Nouveau
Re : compter les éléments selon 2critéres

salut robert c bien ton code ca marche tres bien
mais moi j'ai 98 000 lignes:si je clique sur le bouton du macro il ya 1 message d'erreur "depacement de capacité"
débogage sur ligne 6 du code VBE : dl = Cells(Application.Rows.Count, x).End(xlUp).Row
ya t' il une solution et merci
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : compter les éléments selon 2critéres

Bonjour le fil, bonjour le forum,

Oui, dans ton cas il faut déclarer la variable dl comme une variable de type Long. Remplace :
Code:
Dim dl As Integer
par :
Code:
Dim dl As Long
 

Statistiques des forums

Discussions
311 711
Messages
2 081 789
Membres
101 817
dernier inscrit
carvajal