Rechercher ligne puis colonne qui correspond à une valeur
Bonjour !!
J'ai écris une macro afin de me permettre de trouver une ligne dont la valeur de la colonne A correspond à une variable, puis rechercher dans cette ligne une certaine valeur et me renvoyer le numéro de la colonne. Sauf qu'il y a un problème avec la fonction find() que je ne comprend pas... Est-ce quelqu'un pourrait m'aider?
Merci d'avance!!
Sub valcol()
Dim r As Range
Dim s As Range
Dim Derlig As Integer
Dim i As Integer
Dim Line As Range
Derlig = Worksheets("RECAP").Columns("A:A").Find("*", Range("A1"), , , xlByRows, xlPrevious).Row
Lig = 0
Set r = Sheets("GRAPH").Range("B4")
Set s = Sheets("GRAPH").Range("B7")
With Worksheets("RECAP")
For i = 2 To Derlig
If Range("A" & i).Value = r.Value Then
Line = .Rows("i").Find(What:=s, lookat:=xlWhole)
If Not Line Is Nothing Then
Num = Line.Column
MsgBox ("Colonne : " & Num)
End If
Exit For
End If
Next
End With
End Sub
Bonjour,
Un classeur pour illustrer et faire des tests serait le bienvenu !!
À défaut:
Je ne sais pas ce que tu vas faire dans la suite de ton code, mais, entre nous ... tu es certain de ne pas ré-écrire la fonction RECHERCHEV ?
Bonjour U. Milité!
Merci beaucoup pour ces corrections! Ca fonctionne maintenant!
Comme tu l'as compris, je dois chercher une variable_1 dans une première colonne puis une variable_2 dans la ligne où se trouve la variable_1 trouvée, et ensuite récupérer le nom de la colonne où se trouve cette variable_2... et je pensais pas pouvoir faire ça avec la fonction recherchev()
Rebonjour U. Milité
Je reviens sur ce poste acr j'essaye d'utiliser la fonction findnext() pour que la macro me renvoie non pas le premier résultat trouvé mais tous... Je suis arrivé au code suivant :
Sub valcol_min()
Dim r As Range
Dim s As Range
Dim Derlig As Integer
Dim i As Integer
Dim Line As Range
Dim cellule1 As String
Dim cellule As Range
Dim plage As Range
Derlig = Worksheets("RECAP").Columns("A:A").Find("*", Range("A1"), , , xlByRows, xlPrevious).Row
Lig = 0
Set r = Sheets("GRAPH").Range("B4")
Set s = Sheets("GRAPH").Range("B7")
With Worksheets("RECAP")
For i = 2 To Derlig
If .Range("A" & i).Value = r.Value Then
Set Line = .Rows(i).Find(What:=s, lookat:=xlWhole)
If Not Line Is Nothing Then
Num = Line.Column
Set plage = Line
Do
Set Line = .Rows(i).FindNext(Line)
Set plage = Application.Union(plage, Line)
Loop Until Line.Column = Num
End If
End If
Next
End With
MsgBox plage.Address
End Sub
Ce code fonctionne et me donne bien l'adresse des cellules dans la Msgbox sauf que je n'arrive pas à lui faire me renvoyer le texte des entêtes de colonnes correspondantes plutôt que l'adresse des cellules.
Je n'arrive pas à savoir où placer la Variable "Num" et comment la déclarer...
Est-ce que tu aurais une idée du problème?
Avec le fichier exemple que j'avais encore oublié...
Et une petite rectification dans le code pour l'adapter au fichier exemple.
J'ai remis le fichier exemple avec quelques ajouts pour que mon explication soit plus claire...
Merci d'avance!!
Bonjour!
J'ai trouvé une solution :
Sub valcol_min()
Dim Derlig As Integer
Dim r As Range
Dim s As Range
Dim i As Integer
Dim Line As Range
Dim cel As Variant
Dim res As String
Dim plage As Range
Derlig = Worksheets("RECAP").Columns("A:A").Find("*", Range("A1"), , , xlByRows, xlPrevious).Row
Set r = Sheets("GRAPH").Range("B4")
Set s = Sheets("GRAPH").Range("B7")
With Worksheets("RECAP")
For i = 2 To Derlig
If .Range("A" & i).Value = r.Value Then
Set Line = .Rows(i).Find(What:=s, lookat:=xlWhole)
If Not Line Is Nothing Then
Num = Line.Column
Set plage = Line
Do
Set Line = .Rows(i).FindNext(Line)
Set plage = Application.Union(plage, Line)
Loop Until Line.Column = Num
End If
End If
Next
res = ""
For Each cel In plage
res = res & Worksheets("RECAP").Cells(1, cel.Column) & Chr(10)
Next
Range("c7") = Left(res, Len(res) - 1)
End With
End dub
(les références ont changées par rapport au fichier exemple que j'ai envoyé...)
Mais s'il y a plus simple je serai toujours preneur!
Bonjour,
Toujours pas certain de comprendre les tenants et aboutissants
Avec le minimum renseigné préalablement en B4 de la feuille GRAPH, teste la pièce jointe.
Le code revu:
Sub valcol_min()
Dim r As String
Dim s As Integer
Dim c As Range
Dim Line As Range
r = Sheets("GRAPH").Range("B1").Value
s = Sheets("GRAPH").Range("B4").Value
With Worksheets("RECAP")
Set Line = .Columns("A:A").Find(what:=r, LookIn:=xlValues, lookat:=xlWhole)
If Not Line Is Nothing Then
For Each c In Line.Offset(0, 2).Resize(1, 5)
If c = s Then listeCol = listeCol & .Cells(1, c.Column) & ", "
Next c
End If
End With
Sheets("GRAPH").[C4] = Mid(listeCol, 1, Len(listeCol) - 2)
End Sub
Bonjour U. Milité!
Merci pour ton code c'est beaucoup mieux que ce que j'ai fait!
Je veux connaitre le nom des colonnes contenant les valeurs minimum de la ligne renseignée en B1. Dans le fichier de base cette ligne est sélectionnée avec un menu déroulant et modifie automatiquement la valeur MIN (en B4 ) trouvée dans la ligne correspondante du tableau ... sauf que j'ai aussi besoin de connaitre le nom des colonnes correspondantes (je dis "des" car il peut éventuellement y avoir plusieurs valeurs MIN égales (comme dans mon exemple)...Toujours pas certain de comprendre les tenants et aboutissants
Par contre comme le tableau n'a pas de taille définie j'ai essayé de remplacer de différentes façons
For Each c In Line.Offset(0, 2).Resize(1, 5)
par
Worksheets("RECAP").rows(Line)
ou
Range(Line).Rows
mais fait comme ça le code récupère le nom de la première colonne de la ligne... J'ai aussi pensé que pour faire ça il fallait que j'ajoute une variable "Line_1" correspondant à la ligne trouvée:
Sub valcol_min()
Dim r As String
Dim s As Integer
Dim c As Range
Dim Line As Range
Dim Line_1 As Integer
r = Sheets("GRAPH").Range("B1").Value
s = Sheets("GRAPH").Range("B4").Value
With Worksheets("RECAP")
Line_1 = Application.Match(Sheets("GRAPH").[B1], Sheets("RECAP").[A:A], 0)
Set Line = .Columns("A:A").Find(what:=r, LookIn:=xlValues, lookat:=xlWhole)
If Not Line Is Nothing Then
For Each c In .Rows(Line_1)
If c = s Then listeCol = listeCol & .Cells(1, c.Column) & ", "
Next c
End If
End With
Sheets("GRAPH").[C4] = Mid(listeCol, 1, Len(listeCol) - 2)
End Sub
Pas de taille définie ... en hauteur ou en largeur ? La hauteur n'a pas vraiment d'importance, me semble-t-il ... la largeur, quant à elle, pourrait être donnée par les titres en ligne 1 ("EXP 1", "EXP 2", etc.)Par contre comme le tableau n'a pas de taille définie j'ai essayé de remplacer de différentes façons
Peux-tu préciser ?
Re,
Oui je parle du nombre de colonnes qui peut changer... c'est pourquoi j'essaye d'adapter cette ligne
For Each c In Line.Offset(0, 2).Resize(1, 5)
Mais pour le nombre de lignes je pense que dans tous les cas il n'y aura pas de problème avec cette ligne
Set Line = .Columns("A:A").Find(what:=r, LookIn:=xlValues, lookat:=xlWhole)
qui est sensée prendre en compte toute la colonne A non?... de toute façon il ne changera pas normalement...
En fait je ne comprends pas pourquoi dans ce code que tu m'as envoyé:
Sub valcol_min()
Dim r As String
Dim s As Integer
Dim c As Range
Dim Line As Range
r = Sheets("GRAPH").Range("B1").Value
s = Sheets("GRAPH").Range("B4").Value
With Worksheets("RECAP")
Set Line = .Columns("A:A").Find(what:=r, LookIn:=xlValues, lookat:=xlWhole)
If Not Line Is Nothing Then
For Each c In Line.Offset(0, 2).Resize(1, 5)
If c = s Then listeCol = listeCol & .Cells(1, c.Column) & ", "
Next c
End If
End With
Sheets("GRAPH").[C4] = Mid(listeCol, 1, Len(listeCol) - 2)
End Sub
On ne peut pas remplacer cette ligne:
For Each c In Line.Offset(0, 2).Resize(1, 5)
par cette ligne:
For Each c In .Rows(Line)
?
Pour prendre en compte toute la ligne... Bien que le mieux serait toute la ligne à partir de la troisième colonne...
Rebonjour U. Milité,
Concernant ce poste je précise que j'ai fait une demande similaire ici https://www.excel-downloads.com/threads/recuperer-nom-colonne-a-partir-de-cellules.20043437/#post-20315538 et pour laquelle j'ai obtenu un certain nombre de réponses.
Mais si je peux avoir une précision concernant mon dernier message je suis preneur
Merci encore...
Bonjour,
Mais pour le nombre de lignes je pense que dans tous les cas il n'y aura pas de problème avec cette ligne
Set Line = .Columns("A:A").Find(what:=r, LookIn:=xlValues, lookat:=xlWhole)
qui est sensée prendre en compte toute la colonne A non?... de toute façon il ne changera pas normalement...
L'instruction affecte, à la variable Line, la cellule dans laquelle est trouvée l'entrée choisie en B1 de la feuille "GRAPH" (si elle existe!)
Pour le nombre de colonnes variable, essaie de remplacer:
For Each c In Line.Offset(0, 2).Resize(1, 5)
par:
For Each c In Line.Offset(0, 2).Resize(1, .Cells(1, Columns.Count).End(xlToLeft).Column - 2)
Bonjour U. Milité!
Ca fonctionne!!
Je comprends un peu mieux comment utiliser .resize()
Merci pour ton aide!