このようなことをしようとすると、タイプの不一致エラーが発生しているようです:
新しいブックで:
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()から範囲を返すとコードは終了するようです。範囲を返すことは可能ですか?
範囲はオブジェクトです。オブジェクトを割り当てるには、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
値の配列を表す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倍高速セル上。
Test2の最後の行を次のように変更します。
Set Test2 = rg
これも機能します
Function Test2(Rng As Range) As Range
Set Test2 = Rng
End Function