web-dev-qa-db-fra.com

VBA pour Excel renvoie "Variable d'objet ou avec variable de bloc non définie" lorsqu'il n'y a pas d'objet

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

5
7yphoid

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 Offsetde 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
10
Matroid

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
4
John Joseph

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
1
CaptainABC