2016-10-14 4 views
0

У меня есть эта функция для проверки пустой и непустой ячейки в VBA.Ошибка времени выполнения 91 в Excel 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 

Эта строка возвращает ошибку:

Object variable or With block Variable not set

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

Но иногда, если я запускаю его, он не имеют ошибку, а в других случаях - ошибки. Любые головы?

+0

Почему вы должны 'rng2' внутри скобок оценки? Почему бы просто не использовать 'Set rng = main.Range (rng1 & rng2.Find (" * ",,,,, xlPrevious) .Row)'? – YowE3K

+0

@ YowE3K Я тоже пробовал это сделать. Он по-прежнему возвращает ту же ошибку. Спасибо :) – ramj

+1

У вас есть что-то в ячейках 'O23: O32'? Если '.Find' ничего не найдет, он вернет ярость' Nothing'. – YowE3K

ответ

0

ваш синтаксис функции не так хорошо

, во-первых, вы должны указать тип возврата данных функции т.е.

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

также вы только установить значение toCheckBlanks (значение возвращается функцией) в вашей инструкции if при условии (iBlank> 0). поэтому, если iBlank равен < = 0, ваша функция не будет работать должным образом. Вам необходимо убедиться, что всегда установлен CheckCheckBlanks, обычно это делается путем инициализации его значения по умолчанию в начале функции.

выглядит так, что в вашем коде есть куча шума и ненужных строк, ему нужно немного кругленькая до

+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 
Смежные вопросы