Récupération de la valeur d'une cellule
Résolu
Panzerz
Messages postés
6
Date d'inscription
Statut
Membre
Dernière intervention
-
Stellou la rebelle Messages postés 20 Date d'inscription Statut Membre Dernière intervention -
Stellou la rebelle Messages postés 20 Date d'inscription Statut Membre Dernière intervention -
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
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
A voir également:
- Récupération de la valeur d'une cellule
- Aller à la ligne dans une cellule excel - Guide
- Excel cellule couleur si condition texte - Guide
- Proteger cellule excel - Guide
- Convertisseur récupération de texte - Guide
- Formule pour copier la valeur d'une cellule excel ✓ - Forum Excel
7 réponses
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. :)
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. :)
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
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
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 ?
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 ?
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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.
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.
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 :)
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...
- 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.