web-dev-qa-db-ja.com

ExcelのVBA関数は範囲を返すことができますか?

このようなことをしようとすると、タイプの不一致エラーが発生しているようです:

新しいブックで:

A1 B1
5  4

Function Test1() As Integer
    Dim rg As Range
    Set rg = Test2()
    Test1 = rg.Cells(1, 1).Value
End Function
Function Test2() As Range
    Dim rg As Range
    Set rg = Range("A1:B1")
    Test2 = rg
End Function

= Test1()を追加すると5が返されますが、test2()から範囲を返すとコードは終了するようです。範囲を返すことは可能ですか?

24
Dane O'Connor

範囲はオブジェクトです。オブジェクトを割り当てるには、SETキーワードを使用する必要があり、Test2関数で忘れているように見えます。

Function Test1() As Integer
    Dim rg As Range
    Set rg = Test2()
    Test1 = rg.Cells(1, 1).Value
End Function

Function Test2() As Range
    Dim rg As Range
    Set rg = Range("A1:B1")
    Set Test2 = rg         '<-- Don't forget the SET here'
End Function
45
BradC

値の配列を表すVariant()を返すこともできます。範囲の値を新しい範囲に反転する関数の例を次に示します。

Public Function ReverseValues(ByRef r_values As Range) As Variant()
    Dim i As Integer, j As Integer, N As Integer, M As Integer
    Dim y() As Variant
    N = r_values.Rows.Count
    M = r_values.Columns.Count
    y = r_values.value    'copy values from sheet into an array
    'y now is a Variant(1 to N, 1 to M) 
    Dim t as Variant
    For i = 1 To N / 2
        For j = 1 To M
            t = y(i, j)
            y(i, j) = y(N - i + 1, j)
            y(N - i + 1, j) = t
        Next j
    Next i

    ReverseValues = y
End Function

ワークシートでは、適切な数のセルが選択された配列式(Ctrl-Shift-Enter)としてこの関数を適用する必要があります。 Swap()関数の詳細はここでは重要ではありません。

多くの行では、これは非常に効率的です。 x = Range.ValueおよびRange.Value = x操作がxが配列で、範囲に複数行の列が含まれる場合、操作を1つずつ直接行うよりもmany倍高速セル上。

8
ja72

Test2の最後の行を次のように変更します。

Set Test2 = rg
4
AnthonyWJones

これも機能します

Function Test2(Rng As Range) As Range
    Set Test2 = Rng
End Function
2
asif