私のコードでは、これらの変数を宣言しています:
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
ただし、上記の変数はオブジェクトではないため、「必要なオブジェクト」コンパイルエラーがスローされます。
これに関するヘルプは大歓迎です。修正方法がわからない場合は、セルの列番号と行番号を取得するための回避策または代替方法をいただければ幸いです。
これは古い質問ですが、私も何か言いたいです。
.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
簡単な答え:
.Find呼び出しがエラーをスローしています。
その行に「Set」を追加するだけで問題が解決します。つまり...
Set Datatype = Worksheets(i).UsedRange.Find("Datatype").Column
「設定」なしでは、変数に「何も」を割り当てようとしています。 「なし」はオブジェクトにのみ割り当てることができます。
他の(有効で価値のある)大騒ぎがコードについて何であったかを理解したくない限り、ここで読むのをやめることができます。
すべての(保証された)コード批判を言い換えると、Dimステートメントは不適切です。最初の2つの変数は「型指定」されておらず、最終的にはバリアントになります。皮肉なことに、これが今説明したソリューションが機能する理由です。
Dimステートメントをクリーンアップすることにした場合は、DataTypeをバリアントとして宣言してください...
Dim DataType as variant
以下のコードはどうですか:
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