web-dev-qa-db-ja.com

VBA for Excelは、オブジェクトがないときに「オブジェクト変数またはブロック変数が設定されていない」をスローします

私のコードでは、これらの変数を宣言しています:

Dim Field_Name, Datatype, row As Integer

次に、Forループ内に次のコードがあります。

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

ただし、そのコードは、「オブジェクト変数またはブロック変数が設定されていない」ランタイムエラーをスローします。 APIによると、Range.ColumnおよびRange.rowプロパティは読み取り専用のLongです。変数のデータ型をLongにしようとしましたが、成功しませんでした。 VBAは私がそうすることを期待しているようです

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

ただし、上記の変数はオブジェクトではないため、「必要なオブジェクト」コンパイルエラーがスローされます。

これに関するヘルプは大歓迎です。修正方法がわからない場合は、セルの列番号と行番号を取得するための回避策または代替方法をいただければ幸いです。

10
7yphoid

これは古い質問ですが、私も何か言いたいです。

.Findメソッドの使用中にこのエラーが発生するという同じ問題がありました。私はこの質問に来たので、他の人も同じことをするでしょう。

私は問題の簡単な解決策を見つけました:

Findが指定された文字列を見つけられない場合、Nothingを返します。 Findの直後に何かを呼び出すと、このエラーが発生します。したがって、.Columnまたは.rowはエラーをスローします。

私の場合、見つかったセルのOffsetが必要で、次のように解決しました。

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
11
Matroid

簡単な答え:

.Find呼び出しがエラーをスローしています。

その行に「Set」を追加するだけで問題が解決します。つまり...

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

「設定」なしでは、変数に「何も」を割り当てようとしています。 「なし」はオブジェクトにのみ割り当てることができます。

他の(有効で価値のある)大騒ぎがコードについて何であったかを理解したくない限り、ここで読むのをやめることができます。

すべての(保証された)コード批判を言い換えると、Dimステートメントは不適切です。最初の2つの変数は「型指定」されておらず、最終的にはバリアントになります。皮肉なことに、これが今説明したソリューションが機能する理由です。

Dimステートメントをクリーンアップすることにした場合は、DataTypeをバリアントとして宣言してください...

Dim DataType as variant
5
John Joseph

以下のコードはどうですか:

    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