Dans mon code, j'ai déclaré ces variables:
Dim Field_Name, Datatype, row As Integer
Ensuite, dans une boucle For, j'ai ce code:
Field_Name = Worksheets(i).UsedRange.Find("Field Name").Column
Datatype = Worksheets(i).UsedRange.Find("Datatype").Column
row = Worksheets(i).UsedRange.Find("Field Name").row + 1
Toutefois, ce code renvoie l'erreur d'exécution "Variable d'objet ou avec variable de bloc non définie". Selon l'API, les propriétés Range.Column et Range.row sont des propriétés Long en lecture seule. J'ai essayé de rendre le type de données de mes variables à Long, mais sans succès. Il semblerait que VBA attend de moi que je fasse
Set Field_Name = Worksheets(i).UsedRange.Find("Field Name").Column
Set Datatype = Worksheets(i).UsedRange.Find("Datatype").Column
Set row = Worksheets(i).UsedRange.Find("Field Name").row + 1
Cependant, lesdites variables ne sont pas des objets, ce qui génère l'erreur de compilation "Objet requis".
Toute l'aide pouvant etre apportée serait très appréciée. Si vous ne savez pas comment résoudre ce problème, toute solution de rechange ou tout autre moyen permettant d'obtenir le numéro de colonne et le numéro de ligne d'une cellule serait grandement apprécié.
Même si cette question est ancienne, j'aimerais dire quelque chose aussi.
J'ai eu le même problème pour obtenir cette erreur en utilisant la méthode .Find
. Je suis venu à cette question et d'autres vont faire la même chose.
J'ai trouvé une solution simple au problème:
Lorsque Find
ne trouve pas la chaîne spécifiée, il renvoie Nothing
. Appeler quelque chose directement après Find
entraînera cette erreur. Donc, votre .Column
ou .row
générera une erreur.
Dans mon cas, je voulais une Offset
de la cellule trouvée et je l'ai résolue comme suit:
Set result = Worksheets(i).Range("A:A").Find(string)
If result Is Nothing Then
'some code here
ElseIf IsEmpty(result.Offset(0, 2)) Then
'some code here
Else
'some code here
End If
Réponse simplifiée:
Votre appel .Find lance l'erreur.
Ajouter simplement "Set" à cette ligne résoudra le problème. c'est à dire...
Set Datatype = Worksheets(i).UsedRange.Find("Datatype").Column
Sans "Set", vous essayez d'affecter "rien" à une variable. "Rien" ne peut être assigné qu'à un objet.
Vous pouvez arrêter de lire ici, sauf si vous souhaitez comprendre ce que tous les autres problèmes (valables, valables) concernent votre code.
Pour paraphraser toutes les critiques (garanties) du code, votre déclaration Dim est mauvaise. Les deux premières variables ne sont pas "typées" et finissent en variantes. Ironiquement, c'est pourquoi la solution que je viens de décrire fonctionne.
Si vous décidez de nettoyer cette instruction Dim, déclarez DataType en tant que variante ...
Dim DataType as variant
Qu'en est-il du code ci-dessous:
For i = 1 to 1 ' change to the number of sheets in the workbook
Set oLookin1 = Worksheets(i).UsedRange
sLookFor1 = "Field Name"
Set oFound1 = oLookin1.Find(What:=sLookFor1, LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=False)
If Not oFound1 Is Nothing Then
Field_Name = oFound1.Column
RRow = oFound1.Row +1
' code goes here
Else
Msgbox "Field Name was not found in Sheet #" & i
End If
Set oLookin2 = Worksheets(i).UsedRange
sLookFor2 = "Datatype"
Set oFound2 = oLookin2.Find(What:=sLookFor2, LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=False)
If Not oFound2 Is Nothing Then
DataType = oFound2.Column
' code goes here
Else
Msgbox "Datatype was not found in Sheet #" & i
End If
Next i