1

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

На некоторых форумах я нашел строку, которая должна работать для объектов ячеек:

someCell.Offset(0,colIndex)

Но из отладки я вижу, что входные данные из выбора - это набор Variant/String, а не объект "ячейка".

Есть ли способ для моей функции получить диапазон ячеек вместо Variant/Strings?

Также мой полный код:

Function RVLOOKUP(target, criteriaCellRange, colIndex)

    Dim found as Boolean
    Dim resultCell as Variant

    For Each cell In criteriaCellRange
        matchPosition = instr(target,cell)
        If matchPosition > 0 Then
            found = True
            resultCell = cell
            Exit For
        end if
    Next cell

    If found Then
        ' Here resultCell seems to be just a String not an actual cell object
        RVLOOKUP = resultCell.Offset(0,colIndex)
    else
        RVLOOKUP = "#NoMatch"
    end if

End Function

ОБНОВЛЕНО: предполагается, что код находит ячейку из attributeCellRange, которая является точным или частичным совпадением текста в целевой ячейке, и возвращает ячейку с горизонтальным смещением colIndex от совпадающей ячейки из critCellRange. Таким образом, в основном VLOOKUP, который также соответствует частичному тексту.

Так... ЗДЕСЬ у нас такая же проблема, и ответ там подтверждает мои подозрения:

При передаче диапазона ячеек в качестве параметра функции я считаю, что функция получает либо строки, либо значения. Ноль - это просто значение пустой ячейки. Не видя ваш код, трудно предложить решение вашей проблемы.

Кстати, я использую Libreoffice 5.4.4.2.

2 ответа2

1

Просто пара твиков:

Function RVLOOKUP(target, criteriaCellRange, colIndex)

    Dim found As Boolean
    Dim resultCell As Range

    For Each cell In criteriaCellRange
        matchPosition = InStr(cell, target)
        If matchPosition > 0 Then
            found = True
            Set resultCell = cell
            Exit For
        End If
    Next cell

    If found Then
        ' Here resultCell seems to be just a String not an actual cell object
        RVLOOKUP = resultCell.Offset(0, colIndex)
    Else
        RVLOOKUP = "#NoMatch"
    End If

End Function

Я перевернул аргументы InStr() и сделал resultCell Range

-1

Из ОО документации:

Аргументы передаются как значения

Аргументы, передаваемые макросу из Calc, всегда являются значениями. Невозможно узнать, какие клетки, если таковые имеются, используются. Например, = PositiveSum(A3) передает значение ячейки A3, а PositiveSum не может знать, что использовалась ячейка A3. Если вы должны знать, на какие ячейки ссылаются, а не на значения в ячейках, передайте диапазон в виде строки, проанализируйте строку и получите значения в ссылочных ячейках.

То, чего я хочу достичь, невозможно. :(

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .