Récupération de la valeur d'une cellule

Résolu/Fermé
Panzerz Messages postés 6 Date d'inscription lundi 17 juin 2013 Statut Membre Dernière intervention 19 juin 2013 - 17 juin 2013 à 15:33
Stellou la rebelle Messages postés 20 Date d'inscription vendredi 14 juin 2013 Statut Membre Dernière intervention 23 juillet 2013 - 20 juin 2013 à 08:26
Bonjour à toutes et à tous,

Débutant en VBA, j'essaie de faire une macro permettant d'insérer dans une première feuille des résultats issus d'une seconde. Pour l'instant, une étape fonctionne, la voici :

Sub tri()
Dim Ligne As Single
Dim i As Integer
Dim Ligne_debut As Single
Ligne = 9
Ligne_debut = 9
i = 10
While i < 49
Sheets("Efforts_Portique").Activate
While Cells(Ligne, 4).Value <> ""
Ligne = Ligne + 1
Wend
Sheets("Max_par_elts").Activate
Cells(i, 5).FormulaR1C1Local = "=MIN(Efforts_Portique!D" & Ligne_debut & ":Efforts_Portique!D" & Ligne - 1 & ")"
Cells(i + 1, 5).FormulaR1C1Local = "=MAX(Efforts_Portique!D" & Ligne_debut & ":Efforts_Portique!P" & Ligne - 1 & ")"
i = i + 2
Ligne = Ligne + 12
Ligne_debut = Ligne
Wend
End Sub
(ne prêtez pas attention à la valeur assignée à "Ligne" et "Ligne_debut")

En gros, la macro cherche dans la feuille "Efforts_Portique" le maximum et le minimum dans une plage de valeurs, et les insère où il faut dans la feuille "Max_par_elts". Ce qu'il me manque, c'est le nombre qui est dans la cellule sur la même ligne que le maximum (ou le minimum) et une colonne avant (les max et min sont recherchés colonne D, le nombre que je cherche est colonne C, sur la même ligne).

Seulement voilà, je n'arrive pas à extraire le numéro de ligne du maximum (ou minimum) trouvé par la macro afin d'atteindre l'autre cellule qui m'intéresse, et l'insérer dans la première feuille.

Si quelqu'un a compris ce que je raconte et se sent l'âme solidaire, je suis preneur de toute aide.

Merci d'avance

7 réponses

Stellou la rebelle Messages postés 20 Date d'inscription vendredi 14 juin 2013 Statut Membre Dernière intervention 23 juillet 2013
17 juin 2013 à 15:51
Bonjour,

Excuses moi, je n'ai pas bien compris comment ta fonction chercher ton maximum ?

Déja pour simplifier ton code tu pourrais au lieu de

Sheets("Efforts_Portique").Activate


écrire devant tes cells:

Sheets("Effort_Portique").Cells(Ligne, 4).Value...etc
ou encore
Sheets("Max_par_elts").Cells(i, 5).FormulaR1C1Local = "=MIN(Efforts_Portique!D" & Ligne_debut & ":Efforts_Portique!D" & Ligne - 1 & ")"

Tu vois ? Boh, c'est juste pour avoir moins de ligne. :)
0
Panzerz Messages postés 6 Date d'inscription lundi 17 juin 2013 Statut Membre Dernière intervention 19 juin 2013
17 juin 2013 à 16:25
Bonjour Stellou et merci de ton intérêt.

La feuille "Efforts_Portique" contient plusieurs "salves" de valeurs, toutes dans la colonne D, parmi lesquelles la macro cherche le min et le max pour les mettre dans les cellules (i, 5) et (i +1, 5), et ce pour chaque salve. C'est d'ailleurs pour cette raison que "Ligne" et "Ligne_debut" s'incrémentent, pour passer à la salve suivante.

Ce qui me manque ici est un moyen de faire le même "transfert" d'une feuille à l'autre pour le nombre dans la cellule à gauche de celle trouvée par la recherche. Mais comme le nombre en question n'est pas un extremum, j'imagine qu'il faut l'extraire par l'intermédiaire de la cellule contenant l'extremum correspondant. Ce qui n'est pas chose aisée pour moi, vous l'aurez compris au vu de ma façon de m'exprimer :)
0
Stellou la rebelle Messages postés 20 Date d'inscription vendredi 14 juin 2013 Statut Membre Dernière intervention 23 juillet 2013
19 juin 2013 à 09:48
Ce n'est pas évident pour moi de bien visualiser tes feuilles et de comprendre où se trouve quoi. Pareil, j'ai du mal à comprendre comment ton programme trouve ton min et ton max. Car pour moi avec ce qu'on m'a appris, il faut pour cela comparer des nombres. Or je vois ça nulle part dans ton programme... :s Tu sais je débute dans la programmation aussi, mais j'aimerai t'aider.
Qu'est ce que formula R1C1Local

Sub tri()

Dim Ligne As Single
Dim i As Integer
Dim Ligne_debut As Single

Ligne = 9
Ligne_debut = 9
i = 10

' Ici tu parcours les lignes de tes cellules
While i < 49

Sheets("Efforts_Portique").Activate

' dans cette boucle tu calcule le nombre de cellule remplie de ta colonne ?
While Cells(Ligne, 4).Value <> ""
Ligne = Ligne + 1
Wend

Sheets("Max_par_elts").Activate

'ci dessous sont les 2 lignes qui permettent de stocker ton min et ton max ?
Cells(i, 5).FormulaR1C1Local = "=MIN(Efforts_Portique!D" & Ligne_debut & ":Efforts_Portique!D" & Ligne - 1 & ")"
Cells(i + 1, 5).FormulaR1C1Local = "=MAX(Efforts_Portique!D" & Ligne_debut & ":Efforts_Portique!P" & Ligne - 1 & ")"

i = i + 2
Ligne = Ligne + 12
Ligne_debut = Ligne

Wend

End Sub

Je te montre ce que j'aurais fait. Après à toi, de l'adapter à ton cas si je n'ai pas réussi à le faire :

Sub tri()

Dim Ligne As Integer
Dim Ligne_debut As Integer
Dim Max, Min, temp As Integer
Dim indice_min, indice_max As Integer
Ligne_debut = 9

'Calcul du nombre de cellule remplie dans ta colonne D, et oui, il existe une fonction plus besoin de t'embeter
Ligne = Sheets("Efforts_Portique").WorksheetFunction.CountA(Range("D:D"))

' Valeurs initialisées au hasard
Max = 0
Min = 10

' Ici tu parcours les lignes de tes cellules pour trouver le min et le max et avec leurs indices

For i = 10 to Ligne

If cells(i,4) < min then

min = cells(i,4)
indice_min = i

End If

If cells(i,4) > max

max = cells(i,4)
indice_max = i

End IF

Next

' Ici tu n'as plus qu'à stocker ton min et ton max que la boucle du dessus à trouver et en plus tu as la ligne sur laquelle il se trouvait

End Sub

Ici le seul problème est à plusieurs fois le max dans ta colonne ... Est ce que c'est le cas? Bon j'espère que ça va t'aider...
0
Panzerz Messages postés 6 Date d'inscription lundi 17 juin 2013 Statut Membre Dernière intervention 19 juin 2013
19 juin 2013 à 10:31
Alors, plusieurs choses :

- la boucle :
While Cells(Ligne, 4).Value <> ""
Ligne = Ligne + 1
Wend

permet d'incrémenter Ligne tant que la cellule (Ligne, 4) n'est pas vide, elle ne sert pas à compter le nombre de lignes, cela ne m'est d'aucune utilité.

- la ligne :
Cells(i, 5).FormulaR1C1Local = "=MIN(Efforts_Portique!D" & Ligne_debut & ":Efforts_Portique!D" & Ligne - 1 & ")"

entre dans la cellule (i, 5) de la feuille "Max_par_elts" la valeur minimale trouvée dans la plage de cellules "DLigne_debut":"DLigne-1" de la feuille "Efforts_Portique". FormulaR1C1Local sert à insérer une formule dans une cellule.

Et je suis au regret de t'annoncer que ta solution ne m'aide pas, puisque ma recherche de MIN et de MAX ainsi que leur stockage fonctionnent très bien ^^ mon problème c'est l'autre valeur.
0
Stellou la rebelle Messages postés 20 Date d'inscription vendredi 14 juin 2013 Statut Membre Dernière intervention 23 juillet 2013
20 juin 2013 à 08:26
J'avais pas vu que quelqun tavais rép.
0
f894009 Messages postés 17205 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 19 octobre 2024 1 709
19 juin 2013 à 12:15
Bonjour a vous deux,

Quelques modif de votre code et recherche cellule C meme ligne que Min et Max.

Boucle while wend ????????

Sub tri()
Dim Ligne As Single
Dim i As Integer
Dim Ligne_debut As Single

Ligne = 9
Ligne_debut = 9
i = 10
While i < 49
Sheets("Efforts_Portique").Activate
While Cells(Ligne, 4).Value <> ""
Ligne = Ligne + 1
Wend
Sheets("Max_par_elts").Activate
Cells(i, 5).FormulaLocal = "=MIN(Efforts_Portique!D" & Ligne_debut & ":D" & Ligne - 1 & ")"
valD = Cells(i, 5)
'recherche valeur cellule colonne C meme ligne que MIN
With Worksheets("Efforts_Portique").Range("D" & Ligne_debut & ":D" & Ligne - 1)
Set c = .Find(valD, LookIn:=xlValues)
If Not c Is Nothing Then
ValC = Worksheets("Efforts_Portique").Cells(c.Row, "C").Value
End If
End With
Cells(i + 1, 5).FormulaLocal = "=MAX(Efforts_Portique!D" & Ligne_debut & ":D" & Ligne - 1 & ")"
valD = Cells(i + 1, 5)
'recherche valeur cellule colonne C meme ligne que MAX
With Worksheets("Efforts_Portique").Range("D" & Ligne_debut & ":D" & Ligne - 1)
Set c = .Find(valD, LookIn:=xlValues)
If Not c Is Nothing Then
ValC1 = Worksheets("Efforts_Portique").Cells(c.Row, "C").Value
End If
End With
i = i + 2
Ligne = Ligne + 12
Ligne_debut = Ligne
Wend
End Sub
0
Panzerz Messages postés 6 Date d'inscription lundi 17 juin 2013 Statut Membre Dernière intervention 19 juin 2013
19 juin 2013 à 14:06
Bonjour f894009,

J'ai entré ton programme, et MIRACLE, il fonctionne à merveille ! Un grand merci donc pour ton aide si précieuse.

Oserais-je abuser de ta science infuse pour une toute petite question bonus... Il se trouve que j'ai étendu ton programme à d'autres colonnes de mes feuilles, sans aucun souci, sauf arrivé à la colonne P, VBA n'est pas content et me sort une magnifique
Erreur d'exécution '13' : Incompatibilité de type

en me surlignant :
Set p = .Find(valP, LookIn:=xlValues)

alors que j'ai suivi le même modèle pour toutes les autres colonnes sans qu'il m'ennuie. Une dernière idée ?
0
f894009 Messages postés 17205 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 19 octobre 2024 1 709
19 juin 2013 à 14:14
Re,

il fauf un peut plus de details et les lignes de codes.
0

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

Posez votre question
Panzerz Messages postés 6 Date d'inscription lundi 17 juin 2013 Statut Membre Dernière intervention 19 juin 2013
19 juin 2013 à 14:21
Sub tri()
Dim Ligne As Single
Dim i As Integer
Dim Ligne_debut As Single

Ligne = 9
Ligne_debut = 9
i = 11
While i < 50
Sheets("Efforts_Portique").Activate
While Cells(Ligne, 4).Value <> ""
Ligne = Ligne + 1
Wend
Sheets("Max_par_elts").Activate
Cells(i, 5).FormulaLocal = "=MIN(Efforts_Portique!D" & Ligne_debut & ":D" & Ligne - 1 & ")"
valD = Cells(i, 5)
Cells(i, 7).FormulaLocal = "=MIN(Efforts_Portique!F" & Ligne_debut & ":Efforts_Portique!F" & Ligne - 1 & ")"
valF = Cells(i, 7)
Cells(i, 9).FormulaLocal = "=MIN(Efforts_Portique!H" & Ligne_debut & ":Efforts_Portique!H" & Ligne - 1 & ")"
valH = Cells(i, 9)
Cells(i, 11).FormulaLocal = "=MIN(Efforts_Portique!J" & Ligne_debut & ":Efforts_Portique!J" & Ligne - 1 & ")"
valJ = Cells(i, 11)
Cells(i, 13).FormulaLocal = "=MIN(Efforts_Portique!N" & Ligne_debut & ":Efforts_Portique!N" & Ligne - 1 & ")"
valN = Cells(i, 13)
Cells(i, 15).FormulaLocal = "=MIX(Efforts_Portique!P" & Ligne_debut & ":Efforts_Portique!P" & Ligne - 1 & ")"
valP = Cells(i, 15)
'recherche valeur cellule colonne C meme ligne que MIN
With Worksheets("Efforts_Portique").Range("D" & Ligne_debut & ":D" & Ligne - 1)
Set d = .Find(valD, LookIn:=xlValues)
If Not d Is Nothing Then
ValC = Worksheets("Efforts_Portique").Cells(d.Row, "C").Value
End If
End With

With Worksheets("Efforts_Portique").Range("F" & Ligne_debut & ":F" & Ligne - 1)
Set f = .Find(valF, LookIn:=xlValues)
If Not f Is Nothing Then
ValE = Worksheets("Efforts_Portique").Cells(f.Row, "E").Value
End If
End With

With Worksheets("Efforts_Portique").Range("H" & Ligne_debut & ":H" & Ligne - 1)
Set h = .Find(valH, LookIn:=xlValues)
If Not h Is Nothing Then
ValG = Worksheets("Efforts_Portique").Cells(h.Row, "G").Value
End If
End With

With Worksheets("Efforts_Portique").Range("J" & Ligne_debut & ":J" & Ligne - 1)
Set j = .Find(valJ, LookIn:=xlValues)
If Not j Is Nothing Then
ValI = Worksheets("Efforts_Portique").Cells(j.Row, "I").Value
End If
End With

With Worksheets("Efforts_Portique").Range("N" & Ligne_debut & ":N" & Ligne - 1)
Set N = .Find(valN, LookIn:=xlValues)
If Not N Is Nothing Then
ValM = Worksheets("Efforts_Portique").Cells(N.Row, "M").Value
End If
End With

With Worksheets("Efforts_Portique").Range("P" & Ligne_debut & ":P" & Ligne - 1)
Set p = .Find(valP, LookIn:=xlValues)
If Not p Is Nothing Then
ValO = Worksheets("Efforts_Portique").Cells(p.Row, "O").Value
End If
End With


'idem pour le max'

Cells(i, 4) = ValC
Cells(i + 1, 4) = ValC1
Cells(i, 6) = ValE
Cells(i + 1, 6) = ValE1
Cells(i, 8) = ValG
Cells(i + 1, 8) = ValG1
Cells(i, 10) = ValI
Cells(i + 1, 10) = ValI1
Cells(i, 12) = ValM
Cells(i + 1, 12) = ValM1
Cells(i, 14) = ValO
Cells(i + 1, 14) = ValO1
i = i + 2
Ligne = Ligne + 12
Ligne_debut = Ligne
Wend
End Sub


J'ai très certainement fait une usine à gaz mais peu importe, ce que je ne comprends pas c'est que cette macro fonctionne très bien si j'enlève les lignes en gras, relatives à la colonne P.
0
f894009 Messages postés 17205 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 19 octobre 2024 1 709
19 juin 2013 à 14:37
Re,

MIN, MAX, MIX, MAN y a le choix

Cells(i, 15).FormulaLocal = "=MIX(Efforts_Portique!P" & Ligne_debut & ":Efforts_Portique!P" & Ligne - 1 & ")"

Cells(i, 15).FormulaLocal = "=MIN(Efforts_Portique!P" & Ligne_debut & ":Efforts_Portique!P" & Ligne - 1 & ")"
0
Panzerz Messages postés 6 Date d'inscription lundi 17 juin 2013 Statut Membre Dernière intervention 19 juin 2013
19 juin 2013 à 14:54
C'est gentil de prendre le temps de répondre à un débile... xD

Encore merci beaucoup, problème résolu !
0