web-dev-qa-db-ger.com

VBA für Excel löst "Objektvariable oder mit Blockvariable nicht festgelegt" aus, wenn kein Objekt vorhanden ist

In meinem Code habe ich diese Variablen deklariert:

Dim Field_Name, Datatype, row As Integer

Dann habe ich in einer For-Schleife diesen 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

Dieser Code löst jedoch den Laufzeitfehler "Objektvariable oder mit Blockvariable nicht festgelegt" aus. Gemäß der API ist die Range.Column- und Range.row-Eigenschaft eine schreibgeschützte Long-Eigenschaft. Ich habe versucht, den Datentyp meiner Variablen zu Long zu machen, jedoch ohne Erfolg. Es scheint, als würde die VBA von mir erwarten

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

Diese Variablen sind jedoch keine Objekte, so dass der Kompilierungsfehler "Object required" ausgegeben wird.

Jede Hilfe wäre sehr dankbar. Wenn Sie sich nicht sicher sind, wie das Problem behoben werden soll, sind alle Problemumgehungen oder alternative Methoden zum Abrufen der Spalten- und Zeilennummer einer Zelle sehr hilfreich.

5
7yphoid

Obwohl dies eine alte Frage ist, möchte ich auch etwas sagen.

Ich hatte das gleiche Problem, diesen Fehler bei der Verwendung der .Find-Methode zu erhalten. Ich kam zu dieser Frage und so werden andere das Gleiche tun.

Ich habe eine einfache Lösung für das Problem gefunden:

Wenn Find die angegebene Zeichenfolge nicht findet, wird Nothing zurückgegeben. Ein direkter Aufruf von Find führt zu diesem Fehler. Ihr .Column oder .row wird also einen Fehler auslösen.

In meinem Fall wollte ich eine Offset der gefundenen Zelle und löste sie so:

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

Vereinfachte Antwort:

Ihr .Find-Aufruf löst den Fehler aus.

Durch einfaches Hinzufügen von "Set" zu dieser Zeile wird das Problem behoben. das heißt ...

Set Datatype = Worksheets(i).UsedRange.Find("Datatype").Column

Ohne "Set" versuchen Sie, einer Variablen "nichts" zuzuweisen. "Nichts" kann nur einem Objekt zugeordnet werden.

Sie können hier nicht weiterlesen, es sei denn, Sie möchten wissen, was all die anderen (gültigen, lohnenden) Umstände über Ihren Code waren.

Um alle (garantierte) Code-Kritik zu beschreiben, ist Ihre Dim-Anweisung schlecht. Die ersten beiden Variablen werden nicht "typisiert" und enden als Varianten. Ironischerweise funktioniert deshalb die eben beschriebene Lösung.

Wenn Sie die Dim-Anweisung bereinigen möchten, deklarieren Sie DataType als Variante ...

Dim DataType as variant
4
John Joseph

Was ist mit dem untenstehenden Code:

    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