2014-01-07 8 views
0

Я пытаюсь создать функцию, которая будет запускать цикл, который проверяет, существует ли у организации (var 'org') кампания, которая на самом деле началась, поэтому «If (< = Now() '. Существует неопределенное количество кампаний, которые я нахожу в электронной таблице с помощью «CountIf» и присваивается модулю как «total».Excel VBA Vlookup Ошибка выполнения 1004

В электронной таблице, когда ячейка, которая нуждается в чтобы действительная кампания обнаружила, что кампания, случайно угаданная в другой ячейке, недействительна, она переходит к функции VBA, предоставляя функции как идентификатора организации, так и общего количества кампаний в этой организации.

Мои коды:

Sub Macro() 
    Dim x 
    x = MacIDGen(111, 11) 
End Sub 

Function MacIDGen(org, total) 

    Dim iteration As Boolean, result As Range 

    For current = 1 To total 
     result = Application.WorksheetFunction.VLookup(org & " " & current, ActiveWorkbook.Sheets("Donations").Range("C:E"), 3, False) 
     If (result <= Now()) Then 
      MacIDGen = org & " " & current & " Test successful" 
      current = total 
     End If 
    Next current 

End Function 

Spreadsheet структура:

Org ID- Org Camp Count- Camp No.- Valid Camp No. 
62  1    1   62 1 
14  2    1   14 1 
2  4    4   2 4 
79  5    4   79 4 

Во время отладки в редакторе VBA в runtime error 1004 культур вверх и при выполнении в таблице функция кажущаяся не делает ничего, и клетка принимает последнее действительное значение до довольно быстро освежающих клеток. Как я могу это исправить?

+0

Попробуйте изменить тип результата с Range на Variant. VLookup() возвращает значения (строка, double) или тип ошибки. – Makah

+0

Это было покрыто много раз раньше: –

+0

[ЗДЕСЬ] (http://stackoverflow.com/questions/20593959/using-vlookup-from-a-vba-module-in-excel-to-check-if-value -is-in-table) является одним из примеров ... [ДРУГОЕ ОДИН] (http://stackoverflow.com/questions/19057369/vlookup-in-vba-within-a-for-loop) ... И [ДРУГОЙ ONE] (http://stackoverflow.com/questions/9634611/unable-to-get-the-lookup-property-of-the-workheetfunction-class) в тех же строках ... –

ответ

1

Так что для тех, кто может наткнуться на это позже, вот мой рабочий код:

Function MacIDGen2(org As Integer, total As Integer) 

Dim iteration As Boolean, trueArray() As String, totalTrue As String, randArrNo As Integer, result 
ReDim trueArray(total) 
totalTrue = 0 

For current = 0 To total - 1 
    On Error Resume Next 
    result = Application.WorksheetFunction.VLookup(org & " " & current + 1, ActiveWorkbook.Sheets("Campains").Range("C:E"), 3, False) 
    On Error GoTo 0 
    If (Not IsNull(result)) Then 
     If (result <= Now()) Then 
      trueArray(totalTrue) = current + 1 
      totalTrue = totalTrue + 1 
     End If 
    End If 

Next current 

If (totalTrue > 0) Then 
    randArrNo = WorksheetFunction.RandBetween(0, totalTrue - 1) 
    MacIDGen2 = org & " " & trueArray(randArrNo) 
Else 
    MacIDGen2 = 0 
End If 

End Function 

В основном «On Error Resume Next» исправили проблему. Затем я добавил проверку If IsNull для результата.

Я также немного улучшил код, поскольку теперь он случайным образом выбирает любую из действующих кампаний. Прежде чем он просто выберет первую действительную кампанию, которую он найдет.

Те, у кого есть острый глаз, также могут заметить, что лист, на который я ссылаюсь в обновленной версии, отличается от того, который был в моем исходном коде. Исходный лист был неправильным, и я ссылался на тот же лист, с которого я вызывал модуль, заканчивая круговой ссылкой. Это крошечное небольшое расхождение стоило мне в течение нескольких часов срыва смущения волос.

Смежные вопросы