programing

객체가 없을 때 Excel용 VBA가 "Object variable or with block variable not set"을 던집니다.

mailnote 2023. 6. 15. 22:00
반응형

객체가 없을 때 Excel용 VBA가 "Object variable or with block variable not set"을 던집니다.

내 코드에서, 나는 다음 변수들을 참조하십시오.

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

그러나 이 코드는 "Object variable or with block variable not set" 런타임 오류를 발생시킵니다.API에 따르면 레인지.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

그러나 이 변수는 개체가 아니므로 "Object required" 컴파일 오류를 발생시킵니다.

이에 대한 어떤 도움이라도 주시면 대단히 감사하겠습니다.수정 방법을 잘 모르면 셀의 열 번호와 행 번호를 얻을 수 있는 해결 방법이나 다른 방법을 알려주시면 감사하겠습니다.

비록 이것이 오래된 질문이지만, 저도 한마디 하고 싶습니다.

저는 이 오류를 사용하는 동안 같은 문제를 겪었습니다..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

"Set"이 없으면 변수에 "nothing"을 할당하려고 합니다."아무것도"는 개체에만 할당할 수 있습니다.

다른 모든 (유효하고 가치 있는) 소동이 당신의 코드에 대해 무엇이었는지 이해하고 싶지 않다면 여기서 그만 읽어도 됩니다.

모든 (보증된) 코드 비판을 바꿔 말하면, Dim 문이 잘못되었습니다.처음 두 변수는 "입력"되지 않고 변형으로 끝납니다.아이러니하게도, 이것이 제가 방금 설명한 해결책이 작동하는 이유입니다.

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

이 게시물은 오래된 게시물입니다. 하지만 왜 갑자기 PDF 내보내기를 엑셀 시트로 가져올 수 없는지 파악하는 데 어려움을 겪다가 우연히 발견했습니다.

저에게 문제는 제가 맞추려고 했던 행이 병합되었다는 것입니다. 먼저 전체 시트에 대해 간단한 병합을 수행했고 그것은 매력적으로 작동했습니다.

      '////// Select and open file
  FieldFileName = Application.GetOpenFilename(FileFilter:="Excel Files,*.xl*;*.xm*") 'pick the file
  Set frBook = Workbooks.Open(FieldFileName, UpdateLinks:=0, ReadOnly:=True, AddToMru:=False)
  For Each mySheet In frBook.Worksheets
    mySheet.Cells.UnMerge
  Next mySheet

언급URL : https://stackoverflow.com/questions/22735093/vba-for-excel-throws-object-variable-or-with-block-variable-not-set-when-there

반응형