VBA - Calcul

Bonjour,

J'ai un petit souci je pense avec les formules, bien que j'arrive à les retranscrire, le resulatat reste nul....

Je m'explique: Dans un tableau j'ai des ID qui peuvent être des doublons, et dans une autre colonne un chiffre.

Je voudrais pouvoir réussir à créer un tableau qui me liste les ID sans doublon avec leur nombre d'apparution, calcul la colonne de chiffre qui se rapporte à l'ID et en dernière colonne mettre une moyenne.

Je pense que l'exemple sera plus compréhenssible.

Merci d'avance

Bruno

26calcul.zip (25.83 Ko)

Bonjour Nunos, bonjour le forum,

Le code à copier dans un module standard (pas dans ThisWorkbook):

Sub Macro1()
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim D As Object 'déclare la variable D (Dictionnaire)
Dim TMP As Variant 'déclare la variable TMP (tableau TeMPoraire)

Set O = Worksheets("Cal") 'définit l'onglet O
TV = O.Range("A1").CurrentRegion 'définit le tableau des valeurs TV
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
For I = 2 To UBound(TV, 1) 'boucle sur toutes les lignes I du tableau des Valeurs TV (en partant de la seconde)
    'alimente le dictionnaire D avec TV(I, 1) dans la clé et fait la somme  des TV(I, 3) dans les items
    D(TV(I, 1)) = CInt(D(TV(I, 1))) + CInt(TV(I, 3))
Next I 'prochaine ligne de la boucle
TMP = D.Keys 'récupère dans le tableau temporaire TMP la liste du dictionnaire D sans doublon
O.Range("E1").CurrentRegion.Offset(1, 0).ClearContents 'efface d'éventuelle anciennes données
O.Range("E2").Resize(D.Count, 1).Value = Application.Transpose(D.Keys) 'renvoie dans E2 redimensionnée les clé (= la liste dans doublon)
O.Range("G2").Resize(D.Count, 1).Value = Application.Transpose(D.items) 'renvoie dans G2 redimensionnée les items (la somme de valeurs)
For I = 0 To UBound(TMP) 'boucle sur tous les élément du tableau temporaire TMP
    'renvoie dans la cellule ligne I + 2 colonne 6 de l'onglet O le nombre de fois que  l'élément I de TMP apparaît dans la colonne 1
    O.Cells(I + 2, 6).Value = Application.WorksheetFunction.CountIf(O.Columns(1), TMP(I))
    'renvoie dans la cellule ligne I + 2 colonne 8 de l'onglet O le calcul de la moyenne
    O.Cells(I + 2, 8) = CInt(O.Cells(I + 2, 7).Value) / CInt(O.Cells(I + 2, 6).Value)
Next I 'prochaijn élémetn de la boucle
End Sub

Affecte ce code au bouton...

bonjour

salut Thau-Thème

sans VBA, sans aucun calcul non plus, le TCD fait tout automatiquement

(penser à saisir les nombres sous forme de nombres, ou bien les *1 )

Bonsoir,

Version formules ! Malgré tes types de données à handicap !!

Cordialement.

Salut ThauThème !

17nunos31-calcul.zip (24.77 Ko)

Merci beaucoup pour votre aide,

Mais je préfère la version VBA de ThauThème, qui est plus simple pour une gestion de mise à jour automatique.

Encore un grand merci bon dimanche

Bruno

Juste petite question, il est possible d'ajouter la fonction "IF" pour en cas d'aucune valeur à chercher la macro bug ?

MErci d'avance

Re,

Essaie avec ce nouveau code :

Sub Macro1()
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim D As Object 'déclare la variable D (Dictionnaire)
Dim TMP As Variant 'déclare la variable TMP (tableau TeMPoraire)

Set O = Worksheets("Cal") 'définit l'onglet O
O.Range("E1").CurrentRegion.Offset(1, 0).ClearContents 'efface d'éventuelle anciennes données
If O.Range("A2").Value = "" Then Exit Sub 'si A2 est vide, sort de la procédure
TV = O.Range("A1").CurrentRegion 'définit le tableau des valeurs TV
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
For I = 2 To UBound(TV, 1) 'boucle sur toutes les lignes I du tableau des Valeurs TV (en partant de la seconde)
    'alimente le dictionnaire D avec TV(I, 1) dans la clé et fait la somme  des TV(I, 3) dans les items
    D(TV(I, 1)) = CInt(D(TV(I, 1))) + CInt(TV(I, 3))
Next I 'prochaine ligne de la boucle
TMP = D.Keys 'récupère dans le tableau temporaire TMP la liste du dictionnaire D sans doublon
O.Range("E2").Resize(D.Count, 1).Value = Application.Transpose(D.Keys) 'renvoie dans E2 redimensionnée les clé (= la liste dans doublon)
O.Range("G2").Resize(D.Count, 1).Value = Application.Transpose(D.items) 'renvoie dans G2 redimensionnée les items (la somme de valeurs)
For I = 0 To UBound(TMP) 'boucle sur tous les élément du tableau temporaire TMP
    'renvoie dans la cellule ligne I + 2 colonne 6 de l'onglet O le nombre de fois que  l'élément I de TMP apparaît dans la colonne 1
    O.Cells(I + 2, 6).Value = Application.WorksheetFunction.CountIf(O.Columns(1), TMP(I))
    'renvoie dans la cellule ligne I + 2 colonne 8 de l'onglet O le calcul de la moyenne
    O.Cells(I + 2, 8) = CInt(O.Cells(I + 2, 7).Value) / CInt(O.Cells(I + 2, 6).Value)
Next I 'prochain élément de la boucle
End Sub

Merci ThauThème c'est nickel

Rechercher des sujets similaires à "vba calcul"