Bonjour,
Je travail sous Excel 2003 et je cherche à créer une procédure en VBA qui me permettre le faire la moyenne des colonnes B,D,F... (une sur deux jusque AV) et sur les lignes 2 à 16500 de ma feuille..
Help please!!
Merci d'avance :)
Version imprimable
Bonjour,
Je travail sous Excel 2003 et je cherche à créer une procédure en VBA qui me permettre le faire la moyenne des colonnes B,D,F... (une sur deux jusque AV) et sur les lignes 2 à 16500 de ma feuille..
Help please!!
Merci d'avance :)
Bonjour Chloe2,
Petites questions pour plus de précisions:
Tu veux la moyenne de toutes les données reprisent dans la plage concernée ou une moyenne par ligne ou encore une moyenne par colonne ?
Où veux tu le résultat, dans une celulle (si oui laquelle?), dans une MessageBox, ... ?
Es tu obligée de passer par VBA ?
En fonction de ça on peut voir ce qu'on peut faire pour toi.
A+
Bonjour,
Pour tes colonnes 2 à 48 (je crois que AV correspond à ça mais vérifie quand même) et avec un pas de 2, tu mets à la fin de chaque colonne (donc ligne 16501) la moyenne des cellules de la même colonne des ligne 2 à 16500.Code:
1
2
3 For i = 2 To 48 Step 2 Cells(16501, i).Value = WorksheetFunction.Average(Cells(2, i), Cells(16500, i)) Next
J'ai testé, c'est fonctionnel, bonne chance pour la suite :ccool:
Re,
C'est adapté à ton cas et c'est fonctionnel, je viens de tester.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 Sub Test() For i = 2 To 48 Step 2 Cells(16501, i).Value = WorksheetFunction.Average(Cells(2, i), Cells(16500, i)) For j = 2 To 16500 Cells(j, 49).Value = Cells(j, 49).Value + Cells(j, i).Value Next Next For k = 2 To 16500 Cells(k, 49).Value = Cells(k, 49).Value / 24 'C'est bien 24 valeurs par ligne ? A toi de bien vérifier ça. Next End Sub
EDIT : quelques petites explications. Tout d'abord, pour chacune de tes colonnes, tu as la la moyenne en dessous de chaque colonne (moyenne en colonne donc en 16501). Puis, pour chacune de tes lignes, tu as la moyenne en AW : cette moyenne ne prend en compte qu'une colonne sur 2 comme demandé.
Bon, c'est fait à la bourrin, c'est pas beau mais ça marche très bien :ccool: Vérifie ce que j'ai mis en commentaire dans le code et c'est bon.
Re,
Dans ce cas l'idée de Dead78 est une bonne base mais à adapter, en tout cas voici ma manière:
Bonne continuationCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 Sub TestMoyenne() Dim MaSomme As Long Dim MonNb As Long Dim i As Integer Dim j As Integer For j = 2 To 16500 'Boucle sur les lignes For i = 2 To 48 Step 2 ' boucle sur les colonnes de 2 à 48 car de colonne B à AV step 2 car une sur 2 MaSomme = Cells(j, i).Value + MaSomme 'Récupère la valeur de chaque celulle et l'additionne au précédent résultat MonNb = MonNb + 1 'Sert de compteur pour la moyenne, pas vraiment utile dans ce cas mais c'est pour l'exemple. Next i 'Passe à la colonne 2ème colonne suivante Cells(j, 49) = MaSomme / MonNb 'Le résultat de la somme divisée par le compteur est place dans AW (49) de la ligne MaSomme = 0 MonNb = 0 Next j 'Passe à la ligne suivante. End Sub
Edit: Désolé Dead78, j'avais pas vu ton adaptation...:roll:
ReEdit: Et en plus j'avais oublié de remettre à zéro MaSomme et Mon Nb :oops:
Salut Fvandermeulen :mouarf:
Ah, il y a eu un croisement mais c'est à peu près la même chose :ccool:
Sinon,correspond à la ligne 16501 de chaque colonne (1 sur 2 bien entendu) pour donner la moyenne en colonne et lesCode:Cells(16501, i).Value
correspondent à chaque ligne k de 2 à 16500 et à la colonne 49 (AW) pour donner le résultat en ligne. C'est donc là qu'on précise où stocker le résultat pour répondre à ta dernière question.Code:Cells(k, 49).Value
Bonne chance pour la suite.
Bonjour,
Vous trouverez ci joint ma réponse sur le sujet
:ccool: Bonne continuation .......
Merci effectivement vos solutions fonctionnent :)
Cependant j'ai un autre soucis..
Voila je voudrais créer une matrice que j'ai appelé 'mat' de 20 lignes et 4 colonnes que je veux placer dans une plage que j'ai appelé matrice que une feuille appelée feuil1.
Dans la première colonne je voudrais les variation entre B4 et B3 ((B4-B3)/B3) puis entre B5 et B4... sauf que toutes les 3 variations je veux sauter une ligne. Cad à la 4è ligne de ma matrice je veux la variation entre B8 et B7 et non B7 et B6.
Puis dans la colonne 2 je veux la meme chose mais en prenant les données de la colonne D, dans la 3è colonne celle de la colonne F etc..
Voila ce que j'ai écrit:
Ca tourne pas pour une raison "d'objet" et pour dépassement de capacité...Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 Sub test2() Dim mat(20, 4) As Double Dim k As Integer Dim l As Integer l = 2 / car je par de la colonne B k = 1 For j = 1 To 4 For i = 1 To 20 matrice_Variations(i, j) = (Cells(k + 3, l) - Cells(k + 2, l)) / Cells(k + 2, l) k = k + 1 If k Mod 4 = 0 Then k = k + 1 / pr sauter une ligne Next l = l + 2 Next matrice.Value = mat End Sub
de plus ce que je fais me parait un peu lourd et bricolage...
Des idées?
Merci!!
Salut,
Ca devrait marcher même si j'ai pas testé.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 Sub test() Dim i As Integer i = 1 For j = 4 To 100 Step 4 Range("A" & i).Value = (Range("B" & j).Value - Range("B" & (j - 1)).Value) / Range("B" & (j - 1)).Value Range("A" & (i + 1)).Value = (Range("B" & (j + 1)).Value - Range("B" & j).Value) / Range("B" & j).Value Range("A" & (i + 2)).Value = (Range("B" & (j + 2)).Value - Range("B" & (j + 1)).Value) / Range("B" & (j + 1)).Value i = i + 3 Next End Sub
Bon, je ne l'ai fait que pour B. A toi de le faire pour les autres colonnes.
En A1 tu as (B4-B3)/B3, en A2 tu as (B5-B4)/B4, en A3 tu as (B6-B5)/B5, en A4 tu as (B8-B7)/B7 etc...
Par contre, pour la colonne D, il faudra mettre les résultats dans la colonne C vu que la B est déjà utilisée etc.
J'ai fait ce que j'ai pu vu que ton explication n'était pas super claire mais on verra bien :zoubi:
Quant-à ton code, c'est normal que ça ne fonctionne pas. Je te conseille d'aller lire les tutos, FAQ... histoire de commencer avec les bases :lol:
Tu as écritIci tu déclares en tant que Double quelque chose qui a la syntaxe d'un tableau... Bof, pas super:mouarf:Code:Dim mat(20, 4) As Double
En plus, tu as plein de variables qui viennent d'on ne sait où et des affectations plus qu'approximatives. Tu n'avais aucune chance que cela fonctionne.
Enfin, la notion de "matrice" n'existe pas en VBA. A savoir. Si tu veux l'émuler, il faut passer par des tableaux à double dimension. Mais bon, c'est parfaitement inutile pour ce que tu veux faire. Ta matrice, dans ton cas, correspond à ta feuille Excel avec ses lignes/colonnes. Un coup de VBA par dessus et le tour est joué.
Il faut pas se compliquer la vie hein ? :roll: Bonne chance !
J'ai l'impression que la question est posé deux fois (ici)
voici ma réponse
Quand tu change de colonne il faudrait peut être remettre k a 1 non?
Par contre tu déclareCode:
1
2
3
4
5 Dim l = 2 'car je par de la colonne B For j = 1 To 4 k = 1 For i = 1 To 20
et tu utilisesCode:Dim mat(20, 4) As Double
Ca pourrais être bon de leur donner le même nom surtout qu'a la fin tu réutilise mat (d'où si ce n'est pas volontaire l'avantage d'être en option explicite)Code:matrice_Variations(i, j)
Je en sais pas si tu as vraiment mis des / pour tes commentaire (j'en doute mais on ne sais jamais) mais si c'est le cas met des '
Pour le problème d'objet je ne voi pas mais je n'ai pas testé
Enfin si il me fait un problème d'objet car je n'ai aps de plage nommé matriceCode:matrice.Value = mat
Je compète, suite au remarque de Dead avec un lien vers la déclaraiton des variable qui ne semble pas être ton truc ;)
Si tu te met en option explicite tu aura pas mal de boulot pour faire tes déclaration mais ca pourras aider pour la suite
Merci DeaD78 ! Effectivement ce sont des débuts pas très glorieux sur VBA :D
Mon problème avec ton code c'est que tu va directement me mettre les différentes valeurs que je souhaite alors que dans mon exercice je suis tenue de déclarer une matrice de type double à 20 lignes et 4 colonnes puis une fois cette matrice renseignée (comme défini dans mon premier post) je dois déverser son contenu dans une nouvelle feuille de mon classeur.
Pb: je cherche depuis hier et je ne trouve pas comment résoudre ce probleme de déclaration de matrice...
Merci pour ton aide!!
On va se limiter a cette discution qui visiblement traite du même problème
Enlève (juste pour voir)
(le programme n'affichera rien mais ce n'est pas grave)Code:matrice.value=mat
Est ce que cela fonctionne? (ce qui expliquerai l'erreur d'objet)
Si non peux tu nous redonner le code avec les motifs que je t'ai donnée.
Le dépassement de capacité peux subvenir si
devient trop grand typiquement si Cells(k + 2, l) est quasiment voir totalement nul (un cellule vide par exempleCode:(Cells(k + 3, l) - Cells(k + 2, l)) / Cells(k + 2, l)
Essaye d'avance en mode pas a pas ou plus simplement mettre une pause a la fin de la deuxième boucle pour voir sur quel colonne cela intervient
Re,
Bon, il ne te reste plus qu'à passer par un tableau. Tu as de très bon tutos sur le sujet sur le forum. N'hésite pas à y jeter un oeil.
Ta déclarationest donc bonne.Code:Dim mat(20, 4) As Double
Ensuite, il te faut donc remplir ton tableau :
Bon, je t'ai tout mis. C'est exactement ce que tu veux. Tu as toute la logique de faite. En revanche, je l'ai fait à main levée donc il risque d'y avoir quelques petites erreurs d'étourderie :mouarf:Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56 Sub test() Dim TabTemp(20, 4) As Double Dim Compteur1 As Integer Dim Compteur2 As Integer Dim Temp1 As Double, Temp2 As Double, Temp3 As Double For Compteur1 = 1 To 4 Compteur2 = 1 For j = 4 To 80 Step 4 If Compteur1 = 1 Then Temp1 = (Range("B" & j).Value - Range("B" & (j - 1)).Value) / Range("B" & (j - 1)).Value Temp2 = (Range("B" & (j + 1)).Value - Range("B" & j).Value) / Range("B" & j).Value Temp3 = (Range("B" & (j + 2)).Value - Range("B" & (j + 1)).Value) / Range("B" & (j + 1)).Value TabTemp(Compteur2, Compteur1) = Temp1 TabTemp(Compteur2 + 1, Compteur1) = Temp2 TabTemp(Compteur2 + 2, Compteur1) = Temp3 Compteur2 = Compteur2 + 3 End If If Compteur1 = 2 Then Temp1 = (Range("D" & j).Value - Range("D" & (j - 1)).Value) / Range("D" & (j - 1)).Value Temp2 = (Range("D" & (j + 1)).Value - Range("D" & j).Value) / Range("D" & j).Value Temp3 = (Range("D" & (j + 2)).Value - Range("D" & (j + 1)).Value) / Range("D" & (j + 1)).Value TabTemp(Compteur2, Compteur1) = Temp1 TabTemp(Compteur2 + 1, Compteur1) = Temp2 TabTemp(Compteur2 + 2, Compteur1) = Temp3 Compteur2 = Compteur2 + 3 End If If Compteur1 = 3 Then Temp1 = (Range("F" & j).Value - Range("F" & (j - 1)).Value) / Range("F" & (j - 1)).Value Temp2 = (Range("F" & (j + 1)).Value - Range("F" & j).Value) / Range("F" & j).Value Temp3 = (Range("F" & (j + 2)).Value - Range("F" & (j + 1)).Value) / Range("F" & (j + 1)).Value TabTemp(Compteur2, Compteur1) = Temp1 TabTemp(Compteur2 + 1, Compteur1) = Temp2 TabTemp(Compteur2 + 2, Compteur1) = Temp3 Compteur2 = Compteur2 + 3 End If If Compteur1 = 4 Then Temp1 = (Range("H" & j).Value - Range("H" & (j - 1)).Value) / Range("H" & (j - 1)).Value Temp2 = (Range("H" & (j + 1)).Value - Range("H" & j).Value) / Range("H" & j).Value Temp3 = (Range("H" & (j + 2)).Value - Range("H" & (j + 1)).Value) / Range("H" & (j + 1)).Value TabTemp(Compteur2, Compteur1) = Temp1 TabTemp(Compteur2 + 1, Compteur1) = Temp2 TabTemp(Compteur2 + 2, Compteur1) = Temp3 Compteur2 = Compteur2 + 3 End If Next Next
Je te conseille fortement d'y jeter un oeil attentif histoire de comprendre le tout. En tout cas, ta matrice se remplit exactement comme tu le souhaites.
Enfin, pour récupérer le contenu de ton tableau, tu as par exemple :
Ici, tu récupères en A1 la valeur (1,1) stockée dans ton tableau.Code:Range("A1").Value = TabTemp(1,1)
Et voilà ! Mais bosse vraiment dessus, sinon tu vas "galérer" plus tard :mouarf:
Pour info, cela peut être optimiser mais j'ai vraiment la flegme, je passe le flambeau :zoubi:
Dernière chose, si jamais des erreurs ou je ne sais quoi surviennent, poste ton fichier complet avec les données histoire que l'on puisse tester vu que cela devient assez conséquent et explique précisément les problèmes en joignant du code.
A plus tard :P
MErci DeaD78 :)
Je suis maintenant en train de chercher à créer une boucle pour alléger un peu puisque je doit ensuite continuer ca sur non pas 4 mais 62 colonnes...
Juste une petite précision stp: à quoi correspond et sert la tabtemp?
je la déclare en tableau?
merci!
Re,
TabTemp est simplement le nom de mon tableau.
Pour ce qui est de la boucle, il va falloir transformer les Range("B1") en Cells(1,2) .
La première valeur est le numéro de ligne et la seconde celui de colonne.
Tu as déjà un compteur (j) qui correspond à la première valeur d'un Cells( , ).
Il ne te reste donc plus qu'à rajouter une boucle pour les colones et le tour est joué !
Bonne chance pour la finalisation !
EDIT : un message aurait-il disparu ? :mouarf:
Effectivement un message à disparu le jour où j'ai appris à lire :D
Je ne peux pas éxécuter ma procédure: "erreur d'éxécution 6": "dépassement de capacité"! Help!!
Pourtant tout est en double sauf pour les compteurs qui de toute facon ne prennent pas des valeurs monstrueuses!
En dessous de tes ligne rajoute 3ou 4 ligne de 1
Quand j'ai testé ton code j'ai eu le problème de dépassement de capacité parce que je n'avais pas rempli la dernière ligne
Re,
Teste ce que dit Krovax et dis-nous ce que ça donne.
A mon avis, c'est une histoire de capacité de tableau : tu dois essayer de caser trop de trucs dedans pour la taille qu'il a ou pas assez.
Il va sûrement falloir que tu joues sur les compteurs donc.
Pour ton information, je n'ai pas testé le code que je t'ai proposé et je t'ai dit qu'il allait sûrement falloir arranger des trucs vu que je l'ai fait à main levée :oops:
Bref, vois avec la proposition de Krovax et on essaiera d'arranger ça plus tard.
Bonne chance !
EDIT : si ton fichier n'est pas classé TOP SECRET, tu peux le mettre sur le forum. Ca sera plus facile en cas de problème :zoubi:
A tout hasard, ne serait-ce pas un exercice de Dauphine à rendre pour le 4 Juin à 16H ? Plus précisément un exercice de 4ème année de l'UV111 (Modélisation financière et applications) à faire en groupe de 3 ?
Bon, bon, tu en es à l'étape 4 donc, c'est pas mal :mouarf:
C'est ce qu'on appelle se faire "cramer" :scarymov::twisted:
Pour information, tu as de la chance, une de tes amies a payé 300€ pour se le voir faire faire :zoubi:
Bonjour!
J'ai enfin fini d'écrire ma procédure qui rempli mon tableau. Celle-ci tourne sans erreur à présent!
Seulement il me faut maintenant copier les éléments de ce tableau sur une nouvelle feuille afin de les avoir à l'écran et de m'assurer qu'elle est remplie comme je le souhaitais!
Ma macro je l'ai écrite dans VBE dans ma feuil1, je veux à présent retranscrire mon tableau sur ma feuil2 dans une plage que j'ai nommée 'Matrice', pour cela j'ai écrit:
Mais ca passe pas au compilateur, à parement à cause de "matrice"...Code:
1
2
3
4 Workbooks(" monclasseur ").Worksheet(Feuil2).Activate For Each cell In matrice cell(i, j) = TabTemp(i, j) Next cell