Excel VBA中的运行时错误91

我有这个function来检查VBA中的空白和非空白单元格。

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 

我试图用这种方式:

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

这一行返回一个错误:

对象variables或With块variables未设置

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

但有时如果我运行它,它没有错误,有时它错误。 任何抬头?

尝试这个:

 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 

你的函数语法不太好

首先你应该指定函数的返回数据types

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

你也只能在条件(iBlank> 0)的if语句中设置toCheckBlanks的值(函数返回的值)。 因此,如果iBlank <= 0,您的function将无法正常工作。 您需要确保始终设置toCheckBlanks,通常这是通过在函数启动时将其初始化为默认值来完成的

看起来像在你的代码中有一堆噪声和不必要的行,它需要一点整洁

我想你可以缩短到:

 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