|
▼Jaka さん:
>▼akiholic さん:
>>引数で渡した配列は、破壊したくないので、一度はコピーが必要と考えています。
>>文法上の記法を私が知らないだけで、TestFunc2と同等の内容が表現できればと思ったのですが。。。
>>
>>vbaでTestFunc2を表現できないのであれば、戻り値を参照渡しとして対応することを考えたいと思っています。
>
>破壊したくないの意味が良く解ってないけど、
>ByValにすれば・・・?。
>
>Sub Test()
> Dim a As Variant, b As Variant
> a = Array(1)
>' b = TestFunc1(a)
>' Debug.Print b(0)
>
> b = TestFunc2(a)
> Debug.Print b(0)
> Debug.Print a(0)
> End Sub
>
>Function TestFunc2(ByVal a As Variant) As Variant
> a(0) = 10
> TestFunc2 = a
> End Function
ByValで渡すと、その時点でコピーが生成されてしまうので、効率は悪いように思われます。
以下のコードで実験してみましたが、参照渡しの引数として結果を受け取るのが、効率としては良さそうですね。。。
気軽に動的配列を扱っていたのですが、代入させたり関数処理させた際に、やたらと処理が重くなることに気づいて、TestFunc3を考えたのですが、意図通りには動かなかったので、質問させて頂きました。
===
#If VBA7 Then
Declare PtrSafe Function timeGetTime Lib "winmm.dll" () As Long
#Else
Declare Function timeGetTime Lib "winmm.dll" () As Long
#End If
Sub Test()
Dim a As Variant, b As Variant, c As Variant, d As Variant, e As Variant, f As Variant, i As Long, dmy As Variant, j As Long, T0 As Long
ReDim a(100000) As Double
For i = 0 To 100000
a(i) = Rnd()
Next i
T0 = timeGetTime()
For i = 0 To 1000
b = TestFunc1(a)
Next
Debug.Print timeGetTime() - T0
T0 = timeGetTime()
For i = 0 To 1000
c = TestFunc2(a)
Next
Debug.Print timeGetTime() - T0
'T0 = timeGetTime()
'For i = 0 To 1000
' d = TestFunc3(a)
'Next
'Debug.Print timeGetTime() - T0
T0 = timeGetTime()
For i = 0 To 1000
Call TestFunc4(a, e)
Next
Debug.Print timeGetTime() - T0
T0 = timeGetTime()
For i = 0 To 1000
f = a
f(0) = 50
Next
Debug.Print timeGetTime() - T0
Debug.Print a(0), b(0), c(0), e(0), f(0)
End Sub
Function TestFunc1(x As Variant) As Variant
Dim y As Variant
y = x
y(0) = 10
TestFunc1 = y
End Function
Function TestFunc2(ByVal x As Variant) As Variant
x(0) = 20
TestFunc2 = x
End Function
'Function TestFunc3(x As Variant) As Variant
' TestFunc3 = x
' TestFunc3(0) = 30 * Rnd()
'End Function
Function TestFunc4(x As Variant, y As Variant) As Variant
y = x
y(0) = 40
End Function
<<実行結果>>
TestFunc1: 112
TestFunc2: 97
TestFunc4: 47
ベタ: 47
|
|