5

関数でセル範囲を使用する方法がわかりません。

いくつかの例を無駄に検索しました。

次のテストを書きました。両方の「for」行で「オブジェクト変数が設定されていません」というエラーが発生します(正しい構文がわからないため、1つは「RangeAddress」がなく、2つ目はあります):

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)

誰かが引数で渡されたセル範囲を使用する方法を説明できますか?

4

2 に答える 2

7

Calc スプレッドシートでは、CellRange オブジェクトをパラメーターとしてユーザー定義関数に渡すことはできません。パラメータとしてセル範囲を指定すると、これは常にバリアント配列になります。したがって、2 つの可能性があります。

関数でセル値が必要な場合は、バリアント配列を取得して使用できます。

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が変更された場合にのみ再計算されます。

于 2015-10-11T09:09:01.930 に答える