2016-10-14 4 views
0

VBA에서 비어있는 셀과 비어 있지 않은 셀을 검사하는 기능이 있습니다.Excel VBA에서 런타임 오류 91

Object variable or With block Variable not set

Set rng = main.Range(rng1 & [rng2].Find("*", , , , , xlPrevious).Row) 

하지만 그것을 실행하는 경우, 그렇지 않은 때때로 :이 줄은 오류를 반환

If toCheckBlanks("O23:O", Range("O23:O32")) Then exit sub 

:

Function toCheckBlanks(rng1 As String, rng2 As Range) 
Dim iBlank&, iNonBlank& '& declare variables as long 
Set main = ThisWorkbook.Sheets("Main") 
Dim rng As Range 
Set rng = Nothing 

Set rng = main.Range(rng1 & [rng2].Find("*", , , , , xlPrevious).Row) 

With WorksheetFunction 
    iNonBlank = .CountA(rng) 'count non-blank 
    iBlank = .CountBlank(rng) ' count blank 
End With 

If iBlank > 0 Then 
    toCheckBlanks = True 
End If 

Set rng = Nothing 
End Function 

나는 이런 식으로 사용하려고했습니다 오류가 있으며 다른 경우에는 오류가 발생합니다. 머리가 위로 향하고 있습니까?

+0

가 왜 평가 괄호 안에'rng2'을해야합니까? 왜 그냥'Set rng = main.Range (rng1 & rng2.Find ("*",,, xlPrevious) .Row)'를 사용하지 않을까요? – YowE3K

+0

@ YowE3K 나는 또한 그것을 시도했다. 여전히 같은 오류를 반환합니다. 고마워요 :) – ramj

+1

세포'O23 : O32'에 뭔가 있어요? '.Find'가 아무 것도 찾지 못하면'Nothing'을 반환합니다. – YowE3K

답변

0

함수 구문은

은 첫째로 당신은 또한 만 (값이 함수에 의해 반환되는 toCheckBlanks의 값을 설정

Function toCheckBlanks(rng1 As String, rng2 As Range) as Boolean 

즉 함수의 반환 데이터 형식을 지정해야하므로 좋지 않다) 조건 (iBlank> 0)에 대한 if 문의. 따라서 iBlank가 < = 0이면 함수가 제대로 작동하지 않습니다. toCheckBlanks가 항상 설정되어 있는지 확인해야합니다. 일반적으로 이것은 함수 시작시 기본값으로 초기화하여 수행됩니다.

코드에 노이즈 및 불필요한 줄이있는 것처럼 보입니다. 약간의 코드가 필요합니다. 단정 한 최대

+0

함수의 반환 데이터 형식을 지정해도 오류가 변경되지 않습니다. 감사. – ramj

+0

내가 열거 한 다른 문제는 더 중요합니다. 잠재적으로 때때로 작동하는 이유를 설명하고 때로는 실패합니다. – lllpratll

+0

나는 또한 그것을 수행했습니다. :) – ramj

1

이 시도 :

Function toCheckBlanks(rng1 As String, rng2 As Range) As Boolean 
    Dim iBlank&, iNonBlank& '& declare variables as long 
    Dim FindResult As Range 
    Set main = ThisWorkbook.Sheets("Sheet1") 
    Dim rng As Range 

    Set FindResult = rng2.Find("*", , , , , xlPrevious) 
    If FindResult Is Nothing Then 
     'do whatever is appropriate if rng2 is Empty 
     '... 
     toCheckBlanks = False 
    Else 
     Set rng = main.Range(rng1 & FindResult.Row) 

     With WorksheetFunction 
      iNonBlank = .CountA(rng) 'count non-blank 
      iBlank = .CountBlank(rng) ' count blank 
     End With 

     toCheckBlanks = iBlank > 0 

    End If 
End Function 
0

을 나는 당신이 그것을 아래로 단축 할 수 있다고 생각 :

Function toCheckBlanks(rng1 As String, rng2 As Range) As Boolean 
    Dim rng As Range 

    Set rng = rng2.Find("*", , , , , xlPrevious) 
    If Not rng Is Nothing Then 
     Set rng = ThisWorkbook.Sheets("Main").Range(rng1 & rng2.Find("*", , , , , xlPrevious).Row) 
     toCheckBlanks = WorksheetFunction.CountBlank(rng) > 0 
    End If 
End Function