Probleme de type
Bonjour à tous,
Bon je me prends un peu la tête avec le problème suivant, est ce qu'une ame charitable pourrait m'aider?
J'ai une liste de clients. ll y a 1 client par ligne. Pour chaque client correspont 1166 données sur chaque colonnes : 1x1166
Les 1166 sont les données de consommation du client sur chaque mois pendant plusieurs années. Je souhaite sommer et faire le max de chaque données identique sur chaque mois pendant plusieurs années.
Il y a 48 données par mois. donc sur 2 ans 48*12mois*2ans = 1152 + 14 =1166. J'ai rajouté 14 parce que les données qui m'interressent commencent à la colonne O.
Du coup j'ai essayé de m'en sortir avec un boucle For, Les méthodes WorksheetFunction.Max() et WorksheetFunction.Sum(), mais en vain
Jai testé les choses suivantes
Dim s, a As Variant
i = 48
j = 48 * 12
k = 11665
s1 = Sheets("Valeurs").Cells(2, k).Value
For n = 3 To 5
s = 0
For a = 0 To 11
s = s + Sheets("Valeurs").Cells(n, 1166 - 48 * a).Value
Next a
Next nPour faire la somme des même valeur pour mes n =1 à 3 clients, qui me donnerait la somme totale des même valeurs
ou encore
PA_Sh = WorksheetFunction.Max(Sheets("Valeurs").Cells(3, i).Value, Sheets("Valeurs").Cells(3, i - r).Value, Sheets("Valeurs").Cells(3, i - r * 2).Value, Sheets("Valeurs").Cells(3, i - r * 3).Value, Sheets("Valeurs").Cells(3, i - r * 4).Value, Sheets("Valeurs").Cells(3, i - r * 5).Value, Sheets("Valeurs").Cells(3, i - r * 6).Value, Sheets("Valeurs").Cells(3, i - r * 7).Value, Sheets("Valeurs").Cells(3, i - r * 8).Value, Sheets("Valeurs").Cells(3, i - r * 9).Value, Sheets("Valeurs").Cells(3, i - r * 10).Value, Sheets("Valeurs").Cells(3, i - r * 11).Value)merci à vous tous
Bonjour et bienvenue sur le forum
Un essai à tester. Te convient-il ?
Bye !
Merciiiii beaucoup,
je suis pas encore famillier avec la synthaxe que tu as utiulisé mais ca me va.
C'est super cool
Or, j'aurais besoin de faire le calcul pour chaque ligne. Du coup j'ai essayer de bidouller ton code mais je m'en sors pas trop
J'ai changé la date du début de la variable tabloD parce que finalement je n'ai besoin que des sommes sur la dernière année, ça me semble juste...
Par ailleurs J'aurais besoin de faire une somme que sur les données bleux et rouges et un max que sur les données en jaunes. J'essaie de m'en sortir mais je ne tombe pas sur les bonnes choses...
Merci encore pour votre aide et désole de ne pas avoir été assez claire directement
Option Explicit
'Autre version de la macro
'Déclaration explicite pour éviter les Bugs
Dim derCol, i, j, k, l, derLn, tabloD, tabloR, tabloRmax, vmax, depart
'Macro construite sur ex suivant
'Il y a 1 client par ligne. Pour chaque client on a une matrice 1 x 1166
'Les 1166 sont les donnés du client sur chaque mois pendant plusieurs année.
'On fait la somme/max de chaque données identiques sur chaque mois de la dernière année
'Ici il y a 48 données/mois, 48*12mois*2ans=1166 soit 1152 + 14, 14 prcq on démarre à la colonne O (15 ème colonne)
Sub Calculer()
Dim Wb As Workbook
Dim Ws As Worksheet
Dim Cell As Range
derCol = Cells(2, Columns.Count).End(xlToLeft).Column 'Détermine le nombre de colonnes
derLn = Range("A2").CurrentRegion.Rows.Count 'Détermine le nombre de lignes
depart = derCol - (48 * 12) 'les valeurs correspondant à la dernière année
tabloD = Range(Cells(3, depart + 1), Cells(derLn, derCol)) 'Construit une matrice des valaurs à prendre en compte
Range("A20:AV20").ClearContents 'Efface les anciennes données à chaque fois qu'on fait tourner la Macro
Range("A22:AV25").ClearContents ' idem avec les max (phase de test
tabloR = Range("A20:AV20") ' Créé la matrice de retour final pour les sommes
tabloRmax = tabloR 'Creé la matrice de retour final pour les max
For Each Wb In Application.Workbooks
'Boucle sur chaque feuille de chaque classeur
For Each Ws In Wb.Worksheets
'Boucle sur chaque cellule de la plage A1:A10
For Each Cell In Ws.Range("A1:A10")
'Si la cellule contient la valeur 3, on multiplie la valeur par 2
For k = 1 To 48
vmax = 0 'Initialisation pour la boucle for
For j = 1 To UBound(tabloD, 2)
If j Mod 48 = k Then 'Boucle sur les 48 données
For i = 1 To UBound(tabloD, 1) - 1 'Boucle sur l'année c a d 12 mois
If tabloD(i, j) = "" Then tabloD(i, j) = 0
tabloR(1, k) = tabloR(1, k) + tabloD(i, j)
tabloRmax(1, k) = Application.Max(tabloRmax(1, k), tabloD(i, j))
Next i
End If
Next j
Next k
Next Cell
Next Ws
Next Wb
'Trouver un moyen d'appliquer ce calcul sur chaque ligne
Range("A20").Value = tabloR
'Range("A25").Resize(1, 48) = tabloRmax
End Sub
Qu'on soit bien d'accord : la macro que j'ai faite s'intéresse aux colonnes des mêmes mois (2 car 2 ans) et de même titre pour les 13 lignes de données du document.
Et tu souhaites otenir la même chose mais pour chaque ligne.
Tu auras donc autant de lignes que de lignes de donnnées initiales par type de résultat.
C'est bien ça ?
A te relire
Bye !
Merci pour ton retour,
Oui exacte il y a au final il y a autant de lignes que de lignes de donnnées initiales par type de résultat.
Oui la macro s'interresse au calcul des colonnes. C'est à dire que le que les données qui ont le meme titre sont sommées/maximisées.
Pour la référence client 1,
Dans les 48 valeurs quie se décomposent en " groupes les EA les DD et les PA. Par ex "EA Pointe" qui est répétée chaque mois d'une année sur 2 ans. Je veux faire la somme de tous les EA Pointe sur la 2eme année, pour avoir un EA Pointe totale annuelle sur la deuxieme année. Je fais la même chose pour avoir la somme totale annuelle sur la deuxieme année pour EA PM, EA JA etc... (toutes les valeurs en rouges pour lesquels je veux une somme). Pour les valeurs en jaune je souhaite un max annuel sur les 12 derniers mois.
Je repète ensuite ce calcul pour la ref client 2 puis le client 3 etc...
Au final j'ai un tableau où pour chaque client j'ai la somme totale annuel de leur EA et DD, et j'ai le Max de leurs PA
Merci beaucoup ca marche super
Bonjour,
Tout aallait bien dans le meilleur des mondes. J'ai modifié un peu le code et ça fonctionnait bien.
Et pouf d'un coup l'erreur de type est revenue... Je sais pas si c'est un fantôme ou un méchant de film d'horreur mais je me reprends la tête dessus et je voulais savoir si vous pouviez m'aider ? Merci à vous encore une fois
Option Explicit
'Autre version de la macro
'Déclaration explicite pour éviter les Bugs
Dim derCol, i, j, k, l, t, derLn, tabloD, tabloR, tabloRmax, vmax, depart, departM
'Macro construite sur ex suivant
'Il y a 1 client par ligne. Pour chaque client on a une matrice 1 x 1166
'Les 1166 sont les donnés du client sur chaque mois pendant plusieurs année.
'On fait la somme/max de chaque données identiques sur chaque mois de la dernière année
'Ici il y a 48 données/mois, 48*12mois*2ans=1166 soit 1152 + 14, 14 prcq on démarre à la colonne O (15 ème colonne)
Sub Calculer()
Dim Wb As Workbook
Dim Ws As Worksheet
Dim Cell As Range
'Range("A20:AV20").ClearContents 'Efface les anciennes données à chaque fois qu'on fait tourner la Macro
Range("A18").CurrentRegion.Offset(2, 0).ClearContents
'Range("A22:AV25").ClearContents ' idem avec les max (phase de test
derCol = Cells(1, Columns.Count).End(xlToLeft).Column 'Détermine le nombre de colonnes
derLn = Range("A2").CurrentRegion.Rows.Count 'Détermine le nombre de lignes ; non, la dernière ligne du tableau principal
depart = derCol - (48 * 12) + 1 'les valeurs correspondant à la dernière année
departM = derCol - (48 * 12) + 1 + 35 'colonne de la première valeur à prendre le Max
tabloD = Range(Cells(3, depart), Cells(derLn, derCol)) 'Construit une matrice des valaurs à prendre en compte
'tabloR = Range("A20:AV20") ' Créé la matrice de retour final pour les sommes
tabloR = Range("O3:AW" & derLn)
'tabloRmax = tabloR 'Creé la matrice de retour final pour les max
tabloRmax = Range("AX3:BJ" & derLn)
'Je saute les lignes suivantes car je ne vois pas leur fonction (gmb)
'For Each Wb In Application.Workbooks
'Boucle sur chaque feuille de chaque classeur
'For Each Ws In Wb.Worksheets
'Boucle sur chaque cellule de la plage A1:A10
'For Each Cell In Ws.Range("A1:A10")
'Si la cellule contient la valeur 3, on multiplie la valeur par 2
For k = 1 To 48
vmax = 0 'Initialisation pour la boucle for
For j = 1 To UBound(tabloD, 2)
If j Mod 48 = k And k < 36 Then 'Boucle sur les 35 premières données de chaque mois de la dernière année
For i = 1 To UBound(tabloR, 1) 'On va boucler sur chaque ligne
If tabloD(i, j) = "" Then tabloD(i, j) = 0
tabloR(i, k) = tabloR(i, k) + tabloD(i, j)
Next i
ElseIf j Mod 48 = k And k > 35 Then 'on boucle sur les colonnes 36 à 48 de chaque mois de la dernière année
For i = 1 To UBound(tabloR, 1) 'On va boucler sur chaque ligne
If tabloD(i, j) = "" Then tabloD(i, j) = 0
tabloRmax(i, k - 35) = Application.Max(tabloRmax(i, k - 35), tabloD(i, j)) ' ICI J'AI LA FAMEUSE ERREUR INCOMPATIBILITE DE TYPE ERREUR D EXECUTION '13'
Next i
End If
Next j
Next k
'Next Cell
'Next Ws
'Next Wb
'Trouver un moyen d'appliquer ce calcul sur chaque ligne
'Range("A20").Value = tabloR --> Non il faut donner au range de A20 les dimensions de tabloR avec "Resize"
Sheets("Calculs").Range("O3").Resize(derLn - 2, 35) = tabloR '--> des deux cotés de l'égalité, les dimensions sont égales
Sheets("Calculs").Range("AX3").Resize(derLn - 2, 13) = tabloRmax
End SubBonjour
Barasha a écrit :J'ai modifié un peu le code...
Si tu disais ce que tu as modifié, et pourquoi, on gagnerait du temps....
Bye !
Ahh excusez moi! j'ai changé cette partie là
Sheets("Calculs").Range("O3").Resize(derLn - 2, 35) = tabloR '--> des deux cotés de l'égalité, les dimensions sont égales
Sheets("Calculs").Range("AX3").Resize(derLn - 2, 13) = tabloRmaxafin que mes données arrivent sur une autre feuille.
Et celle ci dans la &er boucle
tabloR(i, k) = tabloR(i, k) + tabloD(i, j)Afin que mon tableau tri en fonction des bonnes données. Mais c'est aussi la ligne qui ou VBA me signale une erreur. Au début ça semblait fonctionner mais plus maintenant.
Pour ce qui est de cette instruction,
tabloR(i, k) = tabloR(i, k) + tabloD(i, j)je ne vois pas où est le changement.
Nouvelle version où j'ai repris la macro de ma dernière version (v2) modifiée pour ecrire le résultat sur la feuille "Calculs" en O3
Bye !
merciiiiiii
merciiiiiii