Функция доступа к диапазону ячеек

Я не могу найти, как использовать диапазоны ячеек с функциями.

Я тщетно искал несколько примеров.

Я написал следующий тест. Я получаю ошибку «Объектная переменная не установлена» в обеих строках «for» (одна без «RangeAddress», а вторая с ним, потому что я не уверен в правильном синтаксисе):

function CHECKBZRANGE(cellRange) as integer
    dim nCol as integer
    dim nLine as integer
    dim i as integer

    for nCol = cellRange.StartColumn to cellRange.EndColumn
        for nLine = cellRange.RangeAddress.StartRow to cellRange.RangeAddress.EndRow
            i = i + 1      ' placeholder for some computation
        next nLine
    next nCol
    checkBZ_range = i
end function

Эта функция вызывается с ячейкой типа =CHECKBZRANGE(A6:C9)

Может ли кто-нибудь объяснить, как использовать диапазон ячеек, переданный аргументом?


person Gregory MOUSSAT    schedule 10.10.2015    source источник


Ответы (2)


С электронными таблицами Calc невозможно передать объекты CellRange в качестве параметров пользовательским функциям. Если в качестве параметра вы укажете диапазон ячеек, это всегда будет вариантный массив. Итак, есть две возможности.

Либо вам нужны значения ячеек в функции, затем вы можете взять массив вариантов и использовать его:

public function CHECKBZRANGE(vCellRangeValues as variant) as integer

    dim i as integer
    dim vCellValue as variant

    if not isarray(vCellRangeValues) then
        vCellValue = vCellRangeValues
        msgbox vCellValue
        i = i + 1
        CHECKBZRANGE = i
        exit function
    end if

    for each vCellValue in vCellRangeValues
        msgbox vCellValue
        i = i + 1
    next

    CHECKBZRANGE = i
end function

Может использоваться как: =CHECKBZRANGE(A6:C9)

Или вам действительно нужен объект диапазона ячеек, тогда вы должны указать его позиции в качестве параметров:

public function CHECKBZRANGE2(lcol1 as long, lrow1 as long, lcol2 as long, lrow2 as long ) as integer

    dim i as integer
    dim oCellRange as object
    dim lRow as long
    dim lCol as long
    dim oCell as object

    oCellRange = ThisComponent.CurrentController.ActiveSheet.getCellRangeByPosition(lcol1-1,lrow1-1,lcol2-1,lrow2-1)

    for lCol = 0 to oCellRange.Columns.Count -1
     for lRow = 0 to oCellRange.Rows.Count -1
        oCell = oCellRange.getCellByPosition(lCol, lRow)
        msgbox oCell.AbsoluteName
        i = i + 1
     next
    next

    CHECKBZRANGE2 = i
end function

Может использоваться как: =CHECKBZRANGE2(COLUMN(A6);ROW(A6);COLUMN(C9);ROW(C9))

Подсказка: это будет пересчитано только в случае изменения A6 или C9.

person Axel Richter    schedule 11.10.2015

да. Возможно! Просто активируйте совместимость с VBA.

Option VBASupport 1

Option Compatible

Function Addressing(R As Range)

Addressing = R.Address

End Function
person Luiz    schedule 30.05.2020