Cells.Value renvoit valeur vide

Bonjour à tous,

J'ai un soucis pour récupérer la valeur d'une cellule dans un autre fichier.

J'avais programmé dans un "fichier 1" une recherche dans un tableau structuré. Quand tout à fonctionné, j'ai copié le code dans un "Fichier 2". Le fichier 2 étant mon fichier final, il ouvre le fichier 1 pour effectuer la recherche dedans. Tout semble fonctionner, il trouve les adresses des cellules etc. jusqu'au moment ou je récupère la valeur de la cellule ciblée, la le MsgBox est vide. J'ai vite compris pourquoi, il vient récupérer la valeur de la cellule de mon "Fichier 2" et pas celle du "Fichier 1"

Voici mon code actuel on y trouve le Cellule = Cells(myrange1, Colonne).Value que je veut récupérer. Je me suis dit vu que je suis dans un With ExcelDoc.Sheets("Audits").ListObjects("Tableau_Audits") pourquoi pas mettre un . devant Cells mais cela ne fonctionne pas, me renvoyant une erreur 438. Cela doit être bête mais je ne trouve pas comment faire.

    'Déclaration des variables
    Dim Fichier As String
    Dim Dossier As String
    Dim Chemin As String
    Dim Ligne As Integer
    Dim Colonne As Integer
    Dim Tableau_Adresses As String
    Dim Cellule As String
    Dim Tableau As Range
    Dim ExcelApp As Object
    Dim ExcelDoc As Object
    Dim Value
    Dim rCell1 As Range
    Dim rCell2 As Range
    Dim myrange1 As Long
    Dim myrange2 As Long
    Dim Test As Integer

    'Remplissage du tableau de suivi des audits
    'Définition du chemin
    Fichier = "CR" & ".xlsx"
    Dossier = "C:\CR"
    'Dossier = "Z:\Qualité\4 - Audit Qualité\0 - Interne"
    Chemin = Dossier & "\" & Fichier

    'Définition des objets
    Set ExcelApp = CreateObject("Excel.Application")
    ExcelApp.Visible = True 'Mettre True pour rendre Excel visible
    Set ExcelDoc = ExcelApp.Workbooks.Open(Chemin) 'Ouvre le document Excel

    With ExcelDoc.Sheets("Audits").ListObjects("Tableau_Audits")
        Value = "2024"
        Set rCell1 = .DataBodyRange.Find(what:=Value, LookIn:=xlValues, lookat:=xlWhole)
        If Not rCell1 Is Nothing Then
            myrange1 = rCell1.Row
            'Set Colonne = .ListColumns(rCell.Column - (.HeaderRowRange.Cells(1).Column) + 1)
            'Ligne = rCell.Row - .HeaderRowRange.Row
            'MsgBox "La valeur cherchée est dans la colonne " & Colonne.Name & Chr(10) & "à la ligne " & Ligne & "."
            MsgBox rCell1.Address
            Colonne = .ListColumns("Poste").DataBodyRange.Column
            Cellule = Cells(myrange1, Colonne).Value
            If Cells(myrange1, Colonne) = "Montage" Then
                MsgBox "good"
            Else
                MsgBox "pas good"
                Do
                    Set rCell2 = .DataBodyRange.Find(Value, After:=rCell1)
                    If Not rCell2 Is Nothing Then
                        myrange2 = rCell2.Row
                        MsgBox rCell2.Address
                        MsgBox .Cells(myrange2, Colonne).Value
                        If Cells(myrange2, Colonne) = "Montage" Then
                            Test = 1
                            MsgBox "Test = 1"
                        Else
                            Set rCell1 = rCell2
                            Test = 0
                        End If
                    End If
                Loop Until Test = 1
            End If
            MsgBox Cells(myrange2, Colonne).Address
        Else
            MsgBox "La valeur recherchée est inconnue.", vbOKOnly
        End If
    End With

Désolé de vous embêter avec un sujet aussi nul mais je sèche...

re,

avec ce ".", vous référez vers le listobject mais c'est faux, vous voulez référer au "range" du listobject donc c'est

cellule =.range.Cells(myrange1, Colonne).Value

mais vous avez déjà rCell1 ou rCell2, donc pourquoi n'utilisez-vous pas un décalage, rCell1.offset(,3).value pour savoir le poste 3 colonnes vers droite.

Hello,

Alors j'ai résolu de mon côté l'erreur en remplaçant With ExcelDoc.Sheets("Audits").ListObjects("Tableau_Audits") par With ExcelDoc.Sheets("Audits") car je pilote la feuille et pas le tableau structuré.

Mon code est clairement pas propre mais pour l'instant il fonctionne... Je découvre le pilotage de TS et ce n'est clairement pas évident.

Pour le offset, je préfère piloter la colonne en cherchant via le nom du tableau structuré justement parce que si un jour on insère une nouvelle colonne entre les deux, le code continue à fonctionner, là ou le décalage ne fonctionnerait plus

Comment pouvez-vous vous rendre la tâche plus difficile ? Et pourquoi chercher dans tout le tableau ? Il faut ce limiter à la colonne "Année" ?
     
     Set LO = ExcelDoc.Sheets("Audits").ListObjects("Tableau_Audits") 'votre tableau
     With LO
          iOffset = .ListColumns("Poste").Index - .ListColumns("Année").Index 'décalage entre ces 2 colonnes
          Value = "2024"
          Set rCell1 = .ListColumns("Année").DataBodyRange.Find(what:=Value, LookIn:=xlValues, lookat:=xlWhole) 'uniquement dans cette colonne
          If Not rCell1 Is Nothing Then 'trouvé
               If rCell1.Offset(, iOffset).Value = "Montage" Then 'alors ce décalage
                    MsgBox "good"
               Else

Je n'utilisais pas le Offset car je l'utilisais en général pour décaler, étant encore débutant, jamais je n'aurais pensé qu'on pouvait récupérer une valeur de décalage pouvant varier simplement mais c'est top, merci pour l'idée. Du coup voici le code modifié, cela fonctionne parfaitement merci pour ton aide

    With ExcelDoc.Sheets("Audits").ListObjects("Tableau_Audits") 'Tableau
        iOffset = .ListColumns("Poste").Index - .ListColumns("Année").Index 'Décalage entre colonne "Année" et Cclonne "Poste"
        Value = "2024"
        Set rCell1 = .ListColumns("Année").DataBodyRange.Find(what:=Value, LookIn:=xlValues, lookat:=xlWhole) 'Recherche dans colonne "Année"
        If Not rCell1 Is Nothing Then
            If rCell1.Offset(, iOffset).Value = "Montage" Then 'alors ce décalage
                MsgBox "good"
                Exit Sub
            Else
                MsgBox "pas good"
                Do
                    Set rCell2 = .ListObjects("Tableau_Audits").DataBodyRange.Find(Value, After:=rCell1)
                    If Not rCell2 Is Nothing Then
                        If rCell2.Offset(, iOffset).Value = "Montage" Then 'alors ce décalage
                        MsgBox "Good 2"
                        Else
                            Set rCell1 = rCell2
                            MsgBox "pas good 2"
                        End If
                    End If
                Loop Until rCell2.Offset(, iOffset).Value = "Montage"
            End If
            MsgBox rCell2.Offset(, iOffset).Address
        Else
            MsgBox "La valeur recherchée est inconnue.", vbOKOnly
        End If
    End With
Rechercher des sujets similaires à "value renvoit valeur vide"