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() peut-être en imbriquant mais je ne voyait pas comment.... De plus je ne l'ai pas encore fait mais j'aimerais récupérer non pas le nom de la première colonne trouvée seulement mais de toutes... et ensuite écrire leurs nom dans une même cellule (c'est ce que je vais faire maintenant )

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.

51tab-ex.xlsm (32.31 Ko)

J'ai remis le fichier exemple avec quelques ajouts pour que mon explication soit plus claire...

Merci d'avance!!

16tab-ex-2.xlsm (36.40 Ko)

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!

Toujours pas certain de comprendre les tenants et aboutissants

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)...

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

Par contre comme le tableau n'a pas de taille définie j'ai essayé de remplacer de différentes façons

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.)

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!

Rechercher des sujets similaires à "rechercher ligne puis colonne qui correspond valeur"