Справочные таблицы VBA в индексном совпадении - PullRequest
0 голосов
/ 29 января 2020

РЕДАКТИРОВАТЬ: я получаю ошибку #VALUE! при попытке запустить эту функцию. Это работает, если я просто делаю If statement, поэтому логика c кажется хорошей. Проблема заключается в воссоздании формулы INDEX MATCH MATCH. Я пытаюсь сослаться на столбец 15 таблицы с именем «Численность персонала» и найти соответствующий результат в столбце «Регион».

tblHeadcount:

Name          Region    
Bob           001    
Jake          003    
Bill          001
Function CO_GLREFORM(CellRef1 As Range, CellRef2 As Range, CellRef3 As Range) As String
    Dim tblHeadcount As ListObject
    Dim matchColResult As Long
    Dim matchRowResult As Long
    Dim indexResult As Variant

    '------THIS IS THE CODE THAT CREATES #VALUE! ERROR
    'Set tblHeadcount = ActiveSheet.ListObjects("Headcount")
    'matchColResult = WorksheetFunction.Match(CellRef3, tblHeadcount.ListColumns(15).DataBodyRange, 0)
    'matchRowResult = WorksheetFunction.Match(tblHeadcount.HeaderRowRange(16), tblHeadcount.TotalsRowRange, 0)
    'indexResult = WorksheetFunction.Index(tblHeadcount.DataBodyRange, matchColResult, matchRowResult)

    If UCase(CellRef1) = "CONFERENCE" Or UCase(CellRef1) = "TRAINING" Then
       '-----THIS IS THE CODE GENERATED (WITH ADJ) FROM THE MACRO RECORDER------ 
       ActiveCell.FormulaR1C1 = _
        "=CellRef2 &""-""&INDEX(Headcount,MATCH(CellRef3,Headcount[Name Verification],0),MATCH(Headcount[[#Headers],[Region]],Headcount[#Headers],0))&""-7210.0100"""
       '-----THIS IS MY ATTEMPT TO RECREATE THE FORMULA 
       'CO_GLREFORM = CellRef2 & "-" & indexResult & "-7210.0100"
    Else
        ActiveCell.FormulaR1C1 = _
        "CO_GLREFORM = CellRef2 &""-""&INDEX(Headcount,MATCH(CellRef3,Headcount[Name Verification],0),MATCH(Headcount[[#Headers],[Region]],Headcount[#Headers],0))&""-7210.0105"""
        'CO_GLREFORM = CellRef2 & "-" & indexResult & "-7210.0105"
    End If

    '--------THIS IS THE FORMULATE I AM REPLICATING----------------
    'If(OR(CellRef1="CONFERENCE",CellRef1="TRAINING"),CellRef2&"-"& _
        INDEX(Headcount,MATCH(CellRef3,Headcount[Name Verification],0), MATCH(Headcount[[#Headers],[Region]],Headcount[#Headers],0))&"-7210.0100",CellRef2&"-"& _
        INDEX(Headcount,MATCH(CellRef3,Headcount[Name Verification],0),MATCH(Headcount[[#Headers],[Region]],Headcount[#Headers],0))&"-7210.0105")

End Function
``

1 Ответ

1 голос
/ 29 января 2020

Это WorksheetFunction.Match(tblHeadcount.HeaderRowRange(16), tblHeadcount.TotalsRowRange, 0) - пустая трата времени. Он находит положение текста в заголовке столбца 16 в заголовках столбцов. Вместо этого просто используйте номер 16 в индексе.

Переменная matchColResult возвращает номер строки, переменная matchRowResult содержит номер столбца. Это рецепт для бедствия и не помогает с устранением неполадок.

Я создал таблицу с 17 столбцами, и эти строки теперь работают без ошибок:

Set tblHeadcount = ActiveSheet.ListObjects("Headcount")
'use a different name for this: matchColResult = WorksheetFunction.Match(CellRef3, tblHeadcount.ListColumns(15).DataBodyRange, 0)
matchRow = WorksheetFunction.Match(CellRef3, tblHeadcount.ListColumns(15).DataBodyRange, 0)
'remove this: matchRowResult = WorksheetFunction.Match(tblHeadcount.HeaderRowRange(16), tblHeadcount.TotalsRowRange, 0)
' the above match for column 16 can just be expressed by the number 16
indexResult = WorksheetFunction.Index(tblHeadcount.DataBodyRange, matchRow, 16)

Одна из причин #Value! ошибка в том, что указанный диапазон недопустим, например, если вы ищете столбец 16 в таблице, которая содержит менее 16 столбцов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...