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 WithDé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).Valuemais 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"
ElseJe 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