VBA - Rechercher des informations dans une colonne "mobile"

Bonsoir,

J'ai fait ce petit code pour rechercher des informations dans une colonne pouvant changer de place :

Option Explicit

Dim n As String, Rep As Byte
Dim lrfb As Long, lrco As Long, lrsa As Long, lrdc As Long, r As Long, lrCBN As Long, lran As Long
Dim lcco As Long, lcan As Long
Dim fb As Worksheet, sa As Worksheet, dc As Worksheet, ds As Worksheet, co As Worksheet, an As Worksheet, CBN As Worksheet
Dim rng As Range, cell As Range, rng2 As Range, Cell2 As Range
Dim rng3 As Range, rng4 As Range, rng5 As Range, rng6 As Range, rng7 As Range, rng8 As Range
Dim Cell3 As Range, Cell4 As Range, Cell5 As Range, Cell6 As Range, Cell7 As Range, Cell8 As Range
Dim i&, derLn&, nb&, derLn2&, nb2&
Dim del As Integer

Sub Savedatabase()

'Remplissage de la colonne [K] (Correspondance)
Dim i3 As Integer, num1b As Variant
Dim plagebota As Range, plagesaisie As Range, re As Range
Dim tve As Range, z As Range

    Set sa = Worksheets("Saisie")
    Set co = Worksheets("Correspondances")

        lrco = co.Cells(Rows.Count, 1).End(xlUp).Row
        lcco = co.Cells(1, co.Columns.Count).End(xlToLeft).Column

    With co
        Set z = .Range(Cells(1, 1), Cells(lrco, lcco))
    End With

Set tve = z.Cells.Find(what:="Indentifiant unique", LookAt:=xlWhole)

            Set plagebota = tve
                With sa
                    For i3 = 2 To lrsa
                        Set re = plagebota.Find(.Cells(i3, 13), LookAt:=xlWhole)
                            If Not re Is Nothing Then
                                .Cells(i3, 11) = re.Offset(, 4) 'Correspondance
                            Else
                                .Cells(i3, 11) = ""
                            End If
                    Next
                End With

End Sub

Malheureusement j'ai l'erreur "variable objet ou variable de bloc non définie" sur cette ligne :

Set z = .Range(Cells(1, 1), Cells(lrco, lcco))

Du coup je me demande si je m'y prend bien, peut-être z ne peut pas être un range ?

Je suis contraint de faire tout ça pour éviter d'avoir à faire une recherche s'appuyant sur des informations contenues dans deux colonnes ; ne sachant pas le faire.

Je poste ici dans le cas où vous me donneriez la solution plus vite que je ne la trouve.

Si je trouve quelque chose avant, je posterai ma solution à la suite.

Merci de votre attention

Bonne fin de journée !

Salut,

Une idée comme ça : peut-être que tu peux "NOMMER" ta colonne ?

Range("NomColonne")

Bonjour à tous,

Un essai :

Les . devant les Cells ...

Set z = .Range(.Cells(1, 1), .Cells(lrco, lcco))

ric

Bonsoir,

La réponse de ric était effectivement la solution... Un détail que je n'avais pas vu. Merci !

Bon, au final mon code fait absolument pas ce que je voulais haha.

Il me trouve "Identifiant unique".

Plagebota devient "Identifiant unique"

Et il recherche "Identifiant unique" dans la feuille 'sa' ; sauf que je ne veux pas qu'il cherche "Identifiant unique" mais la plage qui correspond !

Bonjour,

Quel faut-il comprendre ?

"Identifiant unique" est un entête de colonne de la feuille Correspondance.

Une fois la colonne déterminée, il faut boucler sur les cellules de cette colonne >

Chercher le contenue de ces cellules dans la feuille Saisie, colonne M >

Si trouvée, l'on écrit "Correspondance" en colonne K de la feuille Saisie >

Sinon l'on efface le contenu de la cellule de la colonne K de la feuille Saisie.

Est-ce bien cela ?

ric

Bonjour,

Quel faut-il comprendre ?

Que votre aide m'a aidé à résoudre mon problème, mais que visiblement je m'y prends mal puisque je ne parviens pas à indiquer que la colonne cible est celle qui possède l'en-tête "Identifiant unique".

Mais je vais finir par trouver !

J'ai fait ce code pour le moment, qui ne donne aucun résultat car j'ai une erreur sur la ligne : plge = co.Range(Cells(1, k), Cells(lrco, k)) 'Variable objet ou variable de bloc with non définie'.

Sub Savedatabase()

'Remplissage de la colonne [K] (Correspondance)
Dim i4 As Integer, num1b As Variant
Dim plagesaisie As Range, re As Range
Dim tve As Range, z As Range
Dim plge As Range
Dim k As Long

    Set sa = Worksheets("Saisie")
    Set co = Worksheets("Correspondances")

        lrco = co.Cells(Rows.Count, 1).End(xlUp).Row
        lcco = co.Cells(1, co.Columns.Count).End(xlToLeft).Column

    For k = 1 To lcco 'Step -1
        If co.Cells(1, k) = "Identifiant unique" Then
            Set plge = co.Range(Cells(1, k), Cells(lrco, k))
        End If
    Next k

'            Set plagesaisie = Cells(tve, lrco) 'tve
                With sa
                    For i4 = 2 To lrsa
                        Set re = plge.Find(.Cells(i4, 2), LookAt:=xlWhole)
                            If Not re Is Nothing Then
                                .Cells(i4, 11) = re.Offset(, 4) 'Correspondance
                            Else
                                .Cells(i4, 11) = ""
                            End If
                    Next
                End With
End sub

Bonjour,

La première partie pour trouver la colonne Identifiant unique fonctionne.

Il n'y manquerait qu'un Exit For après la ligne Set plge = ....

Sur quel fichier teste-t-on le code ?

ric

Bonjour,

Je fais mes tests sur le document ci-joint.

J'ai du m’emmêler les pinceaux...

Edit :

Ah et il faut renommer l'en-tête de la colonne 5 ( feuille 'Correspondances') par "Identifiant unique" il y a écrit "Indentifiant unique" j'avais deux copies, j'ai envoyé la mauvaise évidemment.

3recherche.xlsm (31.71 Ko)

Haaa mais voilà c'est bon !

Voici le code :

Private Sub CommandButton1_Click()
Dim i4 As Integer, num1b As Variant
Dim plagesaisie As Range, re As Range
Dim tve As Range, z As Range
Dim plge As Range
Dim k As Long

    Set sa = Worksheets("Saisie")
    Set co = Worksheets("Correspondances")

        lrco = co.Cells(Rows.Count, 1).End(xlUp).Row
        lcco = co.Cells(1, co.Columns.Count).End(xlToLeft).Column
        lrsa = sa.Cells(Rows.Count, 1).End(xlUp).Row

    For k = 1 To lcco 'Step -1
        If co.Cells(1, k) = "Identifiant unique" Then
            Set plge = co.Range(Cells(1, k), Cells(lrco, k))
            Exit For
        End If
    Next k

'            Set plagesaisie = Cells(tve, lrco) 'tve
                With co
                    For i4 = 2 To lrsa
                        Set re = plge.Find(.Cells(i4, 5), LookAt:=xlWhole)
                            If Not re Is Nothing Then
                                sa.Cells(i4, 11) = re.Offset(, -1) 'Correspondance
                            Else
                                .Cells(i4, 11) = ""
                            End If
                    Next
                End With
 End sub
                

Je ne donnais pas les bonnes coordonnées ici :

sa.Cells(i4, 11) = re.Offset(, -1)

Bonjour,

Good

Mais, est-ce que la colonne Correspondance est toujours la voisine de gauche de la colonne Identifiant unique ?

ric

Non, elle est toujours située à gauche, mais pas toujours à la même position en effet...

Il faut donc que je déclare une variable qui corresponde au nombre de colonnes qui se trouvent entre "Correspondance" et "Identifiant unique", merci beaucoup pour la remarque !

Et comme toujours j'ai les mêmes erreurs... Dès que j'utilise .row, .adress ou .column pour trouver les coordonnées des en-têtes de mes colonnes.

Savez-vous comment obtenir les coordonnées des deux colonnes que je recherche ? Pour ensuite compter le nombre de colonnes qui les séparent.

J'ai essayé de plein de façons différentes, j'ai encore et toujours cette erreur : "Variable objet ou variable de bloc with non définie"

Dim a As Range, b As Range, ad As Range, ad2 As Range
With co.Range(Cells(1, 1), Cells(1, lcco))
'a = Range("A1:M" & lcco).Find("Correspondance", lookat:=xlWhole).Row
'Set a = co.Range(Cells(1, 1), Cells(1, lcco)).Find("Correspondance", , xlValues) '.Address

Set a = .Find("Correspondance", LookIn:=xlValues)
ad = a.Address
'Set b = co.Range(Cells(1, 1), Cells(1, lcco)).Find("Identifiant unique", , xlValues) '.Address
Set b = .Find("Identifiant unique", LookIn:=xlValues)
ad2 = b.adress
End With

' = a.Address
'a1 = a.Column

'Dim a As Long, b As Long, a1 As Long, b1 As Long, c As Long
'With co
'    Set a = .Range(Cells(1, 1), Cells(1, lcco)).Find("Identifiant unique", LookIn:=xlValues)
'        a1 = Cells(1, a)
'    Set b = .Range(Cells(1, 1), Cells(1, lcco)).Find("Correspondance", LookIn:=xlValues)
'        b1 = Cells(1, b)
'    Set c = Cells(a1, ab).Columns.Count
'End With

Il y a des erreurs dès que j'utilise .row ; .adress ou .column.

Bonjour,

Ajouter une recherche sur Correspondance,

Soustraire la colonne Correspondante de l'Identifiant unique dans le re.offset(, Tc - Tiu) ou écrit ainsi re.offset(, -(Tiu - Tc)

Un essai ...

Private Sub CommandButton1_Click()
Dim i4 As Integer, num1b As Variant
Dim plagesaisie As Range, re As Range
Dim tve As Range, z As Range
Dim plge As Range
Dim Tiu As Integer  ' pour trouver entête Identifiant unique
Dim Tc As Integer   ' pour trouver entête Correspondance

    Set sa = Worksheets("Saisie")
    Set Co = Worksheets("Correspondances")

    lrco = Co.Cells(Rows.Count, 1).End(xlUp).Row
    lcco = Co.Cells(1, Co.Columns.Count).End(xlToLeft).Column
    lrsa = sa.Cells(Rows.Count, 1).End(xlUp).Row

    For Tiu = 1 To lcco    ' cherche identifiant unique
        If Co.Cells(1, Tiu) = "Identifiant unique" Then
            Set plge = Co.Range(Cells(1, Tiu), Cells(lrco, Tiu))  ' set plage indentifiant unique
            Exit For
        End If
    Next Tiu

    For Tc = 1 To lcco    ' cherche correspondance
        If Co.Cells(1, Tc) = "Correspondance" Then Exit For
    Next Tc

    '            Set plagesaisie = Cells(tve, lrco) 'tve
    With Co
        For i4 = 2 To lrsa
            Set re = plge.Find(.Cells(i4, Tiu), LookAt:=xlWhole)
            If Not re Is Nothing Then
                sa.Cells(i4, 11) = re.Offset(, Tc - Tiu)   ' colonne identifiant unique moins colonne correspondance
            Else
                .Cells(i4, 11) = ""
            End If
        Next
    End With
End Sub

ric

Bonjour,

J'ai corrigé le code précédent, il y avait une petite erreur Set re = plge.Find(.Cells(i4, Tiu), LookAt:=xlWhole) au lieu de Set re = plge.Find(.Cells(i4, 5), LookAt:=xlWhole),

La colonne "Indentifiant unique" devrait être la colonne 5 (ce n'était pas le but recherché).

Ainsi, les 2 colonnes peuvent être n'importe où.

"Correspondance" peut être à gauche ou à droite de "Indentifiant unique"

ric

Bonjour,

Merci de votre réponse !

J'ai toujours la même erreur ici :

With co
        For i4 = 2 To lrsa
            Set re = plge.Find(.Cells(i4, 5), LookAt:=xlWhole)
            If Not re Is Nothing Then
                sa.Cells(i4, 11) = re.Offset(, Tc - Tiu)   ' colonne identifiant unique moins colonne correspondance
            Else
                .Cells(i4, 11) = ""
            End If
        Next
    End With

Set re = plge.Find(.Cells(i4, 5), LookAt:=xlWhole)

Je pense que c'est parce que find recherche dans la colonne n°5 ; alors que cette dernière ne s'y trouve pas dans mon test, puisque sa position est variable.

Edit : Même en modifiant cette valeur, j'ai la même erreur ("Variable objet ou variable de bloc with non définie").

Bonjour,

As-tu lu mon message juste avant ton dernier ?

Où je mentionne :

Set re = plge.Find(.Cells(i4, Tiu), LookAt:=xlWhole)

au lieu de

Set re = plge.Find(.Cells(i4, 5), LookAt:=xlWhole)

La colonne "Indentifiant unique" devrait être la colonne 5 (ce n'était pas le but recherché).

Le code 3 posts plus haut a aussi été corrigé.

ric

Merci encore !

J'avais fais la modification à un moment, sans faire attention à votre message. Mais voyant qu'il y avait toujours une erreur, j'ai supposé m'être trompé.

Tout s'exécute bien, mais les données ne sont pas mises en face de leurs correspondances.

Normalement cette ligne : sa.Cells(i4, 11) = re.Offset(, Tc - Tiu) doit faire apparaître les données en colonne 11, en face des cellules qui ont permit de faire la recherche ; sauf que les données se retrouvent toujours à partir de la ligne deux et écrasent les données précédemment renseignées, si cela était le cas.

Si je fais une recherche pour deux listes différentes, en deux temps, la première sera écrasée par la seconde dans la feuille saisie.

Je fais pourtant exactement la même chose ailleurs et ça fonctionne...

EDIT : C'est un problème qui venait de mon document, j'ai changé cette ligne :

Set re = plge.Find(.Cells(i4, 2), LookAt:=xlWhole)

car sinon la recherche se faisait sur la même feuille.

N'ayant pas mon document dans sa totalité, vous ne pouviez pas deviner.

Merci beaucoup pour votre aide ! Désormais tout semble fonctionner très bien !

Post précédent mis à jour, pour que vous ayez la notification au cas où vous chercheriez l'origine du problème.

Bonne journée !

Rechercher des sujets similaires à "vba rechercher informations colonne mobile"