Recup valeurs

Résolu
jijudu Messages postés 211 Date d'inscription jeudi 15 mai 2008 Statut Membre Dernière intervention 3 septembre 2009 - 15 mai 2008 à 13:40
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 - 24 mai 2008 à 09:51
Bonjour tout le monde

A1 04:50:00 | B1 3
A2 04:40:00 | B2 3.6
A3 04:30:00 | B3 3.9
A4 04:20:00 | B4 4.2
A5 04:10:00 | B5 4.3
A6 04:00:00 | B6 4.3
A7 03:50:00 | B7 4.1
A8 03:40:00 | B8 3.9

Voila j'ai une macro qui me trouve une zone par exemple A1-A8
J'aimerai stocker les valeurs dans la colonne B appartenant à la même zone (c'est à dire la zone de la ligne 1 à 8) dans un tableau. Ensuite le but sa serai d'extraire ces valeurs dans le tableau pour en faire une moyenne.
MAis est ce que quelqu'un pourrai me donner le code VB pour stocker les valeurs de la colonne B svp, parce que je ne vois pas comment faire!
Le reste j'essayerai de le faire tout seul en allant à mon rythme.

MErci pour l'aide !

25 réponses

mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
20 mai 2008 à 17:12
normal que ça ne fonctionne pas, t'as fait une erreur toute bête (t'inquiète, ça arrive à tout le monde ) :

ReDim <strike>valeur</strike>((n_ligne_fin- n_ligne_debut) + 1)
ReDim TableValeur((n_ligne_fin- n_ligne_debut) + 1)
@++

le mystérieux chevalier,"Provençal, le gaulois"
Forum Office & VBA
3
pile_poil Messages postés 682 Date d'inscription vendredi 6 avril 2007 Statut Membre Dernière intervention 4 août 2012 6
15 mai 2008 à 17:06
une bonne façon de commencer c'est d'aller dans excel , menu  outils , macros , nouvelle macro ,
ensuite tu fais manuellement ta manipe et quand elle est finie tu click sur arreter l'enregistrement de la macro
ensuite tu vas dans l'éditeur de macro et tu regardes comment excel a écrit l'opération !
il ne te reste plus qu'à adapter à ton besoin  exact pour rendre ça plus universel !
c'est de cette façon que j'ai procédé qsuand j'ai commencé sans rien connaitre à la programmation

[reglement.aspx ]si c'est la solution, penser : REPONSE ACCEPTEE
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
15 mai 2008 à 20:59
salut,

déjà, il faut créer une variable de type tableau (pour stocker les valeurs)

dim MesValeurs() As Double

Ensuite, déterminer le nombre de valeurs :

Dim NbValeurs as integer
NbValeurs = range("b1").End(xlDown).Row

On redimensionne le tableau :
REdim MesValeurs(NbValeurs)

Puis on boucle pour récupérer les valeurs :
Dim i as integer

for i = 1 to NbValeurs
    MesValeurs(i - 1) = cdbl(cells(i, 2).Value)
next i

Puis, la moyenne :
Dim Moyenne as double

For i = 1 to NbValeurs
    Moyenne = Moyenne + MesValeurs(i - 1)
next i
Moyenne = Moyenne / NbValeurs

Tu peux éviter le stockage dans la variable Tableau si tu le souhaites

@++

le mystérieux chevalier,"Provençal, le gaulois"
Forum Office & VBA
0
jijudu Messages postés 211 Date d'inscription jeudi 15 mai 2008 Statut Membre Dernière intervention 3 septembre 2009
15 mai 2008 à 21:32
Merci à toi mortolio !!! ^^

Le probléme  en faite c'est que je ne prends pas toutes les valeurs de la colonne B.
J'ai une macro qui me délimite une plage. Je connais le début et la fin de cette plage par la variable "n_ligne_debut" et "n_ligne_fin" qui me disent à quelle ligne la plage commence et à quelle ligne la plage finit. Ici dans l'exemple cité ci dessus
la plage commence à A1 et finit a A2.
Je dois prendre les valeurs de la colonne B qui appartiennent à la plage définit.

J'éspere avoir été assez clair.
Je dis cela parce que en faite j'ai l'impression que ta macro prend toutes les valeurs de la colonne B. Si ce n'est pas le cas, m'accordera tu ton pardon?? : )

A toute !
..
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
15 mai 2008 à 21:39
effectivement, mon code lisait depuis la première ligne, voici une petite modif :

dim MesValeurs() As Double

REdim MesValeurs(n_ligne_fin - n_ligne_debut + 1)

Dim i as integer, j as integer

for i = n_ligne_debut to n_ligne_fin
    MesValeurs(j) = cdbl(cells(i, 2).Value)
    j = j + 1
next i

Dim Moyenne as double

For i = lbound(MesValeurs) to ubound(MesValeurs)
    Moyenne = Moyenne + MesValeurs(i - 1)
next i
Moyenne = Moyenne / ubound(MesValeurs) + 1
~
<small>[code.aspx?ID=39466 Mortalino] ~
Colorisation automatique</small>

@++

le mystérieux chevalier,"Provençal, le gaulois"
Forum Office & VBA
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
15 mai 2008 à 21:41
Oups :

Dim Moyenne as double

For i = lbound(MesValeurs) to ubound(MesValeurs)
    Moyenne = Moyenne + MesValeurs(i) 'enleve le -1
next i

@++

le mystérieux chevalier,"Provençal, le gaulois"
Forum Office & VBA
0
jijudu Messages postés 211 Date d'inscription jeudi 15 mai 2008 Statut Membre Dernière intervention 3 septembre 2009
15 mai 2008 à 21:42
D'ac au d'ac je testerai Ta macro Demain

Bonne nuit !!
+
A tt!
0
jijudu Messages postés 211 Date d'inscription jeudi 15 mai 2008 Statut Membre Dernière intervention 3 septembre 2009
17 mai 2008 à 17:50
Slt !!
re c moi ^^,
J'ai essayé ta marco, elle fonctionne mise à part la partie pour le calcul de la moyenne ; )

Alors voilà, je me disai qu'il faudrai initialiser la variable "moyenne" au début de la boucle for
et mettre => moyenne = 0  qu'est ce t'en pense ?

Dim Moyenne as double

For i = lbound(MesValeurs) to ubound(MesValeurs)
    Moyenne = Moyenne + MesValeurs(i)
next i

De plus, "Ubound" donne la valeur de l'indice supérieur du tableau, alors pourquoi la somme des valeurs contenue dans le tableau serai donné par =>
ubound(MesValeurs) + 1   ??

ubound
(MesValeurs) + 
1

Merci les gars !!
++
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
17 mai 2008 à 17:59
salut,

pas besoin d'initialiser la variable, effectivement, elle vaut 0, mais dans
Moyenne =  Moyenne + MesValeurs(i)
il faut traduire Moyenne = 0 + Ce que vaut MesValeurs(i)

Pour le Ubound(tata) + 1, c'est simple, sache que les tableaux de variables, par défaut, est en base 0, donc si ton Indice supérieur vaut 10, tu as 11 valeurs (car l'indice 0 en contient une aussi, donc 0 à 10 = 11)

Pour ton problème, là je ne vois pas, dans
Dim Moyenne as double

For i = lbound(MesValeurs) to ubound(MesValeurs)
    Moyenne = Moyenne + MesValeurs(i)  'enleve le -1
next i
Sous Moyenne = ..., met un MsgBox Moyenne & vbcrlf & MesValeurs(i)

et dit nous ce que la boite de message te retourne

@++

le mystérieux chevalier,"Provençal, le gaulois"
Forum Office & VBA
0
jijudu Messages postés 211 Date d'inscription jeudi 15 mai 2008 Statut Membre Dernière intervention 3 septembre 2009
17 mai 2008 à 18:26
Merci pour ta rapidité surprenante : ).

J'ai noté ton mesage. Je continuerai cela lundi car je n'ai pas en ce moment les moyens nécessaire pour réaliser la mainip. ^^

A suivre ......
A lundi
toute!
0
jijudu Messages postés 211 Date d'inscription jeudi 15 mai 2008 Statut Membre Dernière intervention 3 septembre 2009
20 mai 2008 à 14:58
Slt !

Je ne peux pas compiler la macro à cause du code :
for i = n_ligne_debut to n_ligne_fin
    MesValeurs(j) = cdbl(cells(i, 2).Value)
    j = j + 1
next i

Excel ne veut pas pas compiler à cause de la ligne MesValeurs(j) = cdbl(cells(i, 2).Value)
Erreur 1004 : " l'indice n'appartient pas la sélection"
Je pense qu'il veut faire référence à l'indice "j". Je ne comprends pas pourquoi cette erreur survient alors que "j" est déclaré. Bref normalement tout est conforme pour que sa fonctionne .. Mais non :p

Merci
+
0
jijudu Messages postés 211 Date d'inscription jeudi 15 mai 2008 Statut Membre Dernière intervention 3 septembre 2009
20 mai 2008 à 15:05
Slt !

Je ne peux pas compiler la macro à cause du code :
for i = n_ligne_debut to n_ligne_fin
    MesValeurs(j) = cdbl(cells(i, 2).Value)
    j = j + 1
next i

Excel ne veut pas pas compiler à cause de la ligne MesValeurs(j) = cdbl(cells(i, 2).Value)
Erreur 1004 : " l'indice n'appartient pas la sélection"
Je pense qu'il veut faire référence à l'indice "j". Je ne comprends pas pourquoi cette erreur survient alors que "j" est déclaré. Bref normalement tout est conforme pour que sa fonctionne .. Mais non :p

Merci
+
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
20 mai 2008 à 16:27
salut,

ok, alors avant cette boucle, place :

MsgBox LBound(MesValeurs)

et dis moi ce que le message te retourne

@++

le mystérieux chevalier,"Provençal, le gaulois"
Forum Office & VBA
0
jijudu Messages postés 211 Date d'inscription jeudi 15 mai 2008 Statut Membre Dernière intervention 3 septembre 2009
20 mai 2008 à 16:35
Yep !!!

Alors j ai mit la msgbox avt la boucle
MsgBox LBound(MesValeurs)

La programme ne se compile pas et J 'ai tjrs le mm rapport d'erreur
Erreur 1004 : " l'indice n'appartient pas la sélection" Sauf que la ligne qui  bugg est la nouvelle ligne ajouté c a d
MsgBox LBound(MesValeurs)

:(
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
20 mai 2008 à 16:41
c'est que MesValeurs ne contient rien.
Le mieux serait de tester en mode pas à pas (F8) afin de vérifier toutes les valeurs de chaaque variables (en pointant le curseur de la souris dessus, une fois l'instruction exécutée

@++

le mystérieux chevalier,"Provençal, le gaulois"
Forum Office & VBA
0
jijudu Messages postés 211 Date d'inscription jeudi 15 mai 2008 Statut Membre Dernière intervention 3 septembre 2009
20 mai 2008 à 17:05
Sub deuxieme()
Dim n_ligne_fin As Integer
Dim n_ligne_debut As Integer
Dim contenu As Date


n_ligne_debut = 6
n_ligne_fin= 149


Dim TableValeur() As Double
ReDim valeur((n_ligne_fin- n_ligne_debut) + 1)
Dim i As Integer, j As Integer

For i = n_ligne_debut To n_ligne_fin Step 1
                TableValeur(j) = Cells(i, 2).Value
    j = j + 1
Next i


MsgBox TableValeur(2)


End Sub

Ci dessus ma macro. J'ai effectuer le mode pas à pas, Mais chaque fois que je passe par la ligne "TableValeur(j) = Cells(i, 2).Value" la macro bugg alors que cette cellule n'est pas vide !
0
jijudu Messages postés 211 Date d'inscription jeudi 15 mai 2008 Statut Membre Dernière intervention 3 septembre 2009
20 mai 2008 à 17:30
TSsssssssssssssssssssssssssssss mais quel boulet

Bon désolé de t'avoir mobilisé pour ce type d'erreur.
En espérant que ca n'y arrivera plus ^^

Merci encore MoRtalInO
^^

allez ++
0
jeanjeandada Messages postés 152 Date d'inscription lundi 21 avril 2008 Statut Membre Dernière intervention 20 novembre 2011
21 mai 2008 à 18:02
SALUTT les copains ^^ xD
Explication :
lorsque j 'ai

n_ligne_debut = 6
n_ligne_fin = 9
'Il y a donc 4 valeurs
DimTableValeur()
ReDim TableValeur(n_ligne_fin - n_ligne_debut+1) '+1 pour avoir les 4 valeurs!!

    For boucle = LBound(tableau) To UBound(tableau)
   

Comme on est en base 0, on a +1 valeur. Donc Comme j'ai 4 valeurs vaut mieux écrire
ReDim TableValeur(n_ligne_fin - n_ligne_debut) 'pas besoin de mettre +1 à cause de la base 0

Ai-je bien comprit la lecon
et ai-je bien été explicite ?? ^^

PS: j'ai essayé sans le +1 et sa marche parfaitement alors qu'avec le +1 lors d'une boucle FOR on passe une fois de trop.
allez++
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
21 mai 2008 à 18:32
c'est ça.

dans ReDim TableValeur(n_ligne_fin - n_ligne_debut)

il faut traduireReDim TableValeur(9 - 6)
donc ReDim TableValeur(3)

Bref, vu que c'est en base 0, c'est aussi à traduitr par
ReDim TableValeur(0 To 3)

0 = 1ere valeur
1 = 2nde valeur
2 = 3eme valeur
3 = 4eme valeur
@++

le mystérieux chevalier,"Provençal, le gaulois"
Forum Office & VBA
0
jeanjeandada Messages postés 152 Date d'inscription lundi 21 avril 2008 Statut Membre Dernière intervention 20 novembre 2011
22 mai 2008 à 16:08
Yep , Donc j'ai mi des msgbox pour visualiser le probléme que j'avais le 17/05/2008 17:50:27
qui était que la moyenne ne marche pas

For j = LBound(TableVentMoyen) To UBound(TableVentMoyen)
    Moyenne = Moyenne + TableVentMoyen(j)
                           MsgBox Moyenne & vbCrLf & TableVentMoyen(j)   'on remarque que tout est correct ici
Next j


moyennefin = Moyenne / UBound(TableVentMoyen) + 1
MsgBox moyennefin & vbCrLf & Moyenne
Range("O11").Value = moyennefin

J'ai remarqué avec le mode pas à pas que lorsque arrivé à la ligne :
moyennefin = Moyenne / UBound(TableVentMoyen) + 1

moyenne fin ne prend pas la bon résultat Parce que Moyenne=31,7 et UBound(TableVentMoyen)=4+1= 5
et 31,5/5=6,34
et MOyenneFin=8,9
elle est pas mal celle là hein ...

Si qq1 saurait pq..:)

MErci bien
0
Rejoignez-nous