|
この現象にループは関係ないので、
ループは外した方が例としては、簡素化されてよいと思います。
でも、このように例題コードを記述されること自体すごいですねえ!!
結論は、繰り返しになりますが、オブジェクトのプロパティは、記述するに
尽きるのですが。
現象のポイントは、
1 MyVという変数は、Variant型なので、色んな型の値がはいることができます。 書式の記述の仕方次第でRange型変数から、違う型の変数に変化すること
2 Rangeオブジェクトの代入式(MyRanage = MyV)において、右辺(MyV)に
プロパティを記述しないと左辺側で既定のプロパティをチェックし、Valueプロパティが配列だとEmptyに設定する
「2」については、既投稿をよく読んでください
MyVというVariant型変数が どの型の変数に代わっていくのかを
追ってみるとよいです
ケース1の場合
Declare Function GetTickCount Lib "kernel32" () As Long
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Sub test1()
Dim MyRange As Range
Set MyRange = Range("B4:G4")
Dim MyV As Variant
Set MyV = MyRange
Dim MyF As Variant
Set MyF = Range("B5:G5")
Dim StartTime As Long
Dim WaitTime As Long
StartTime = GetTickCount
WaitTime = Range("B3")
MsgBox TypeName(MyV)
Do
MyV = MyF
MsgBox TypeName(MyV)
If (GetTickCount - StartTime) > WaitTime Then
Exit Do
End If
DoEvents
Loop
End Sub
ループに入る直前の確認では、確かにMyVという変数は、Range型と表示されます。
が、
MyV = MyF
↑これの実行直後の
MsgBox TypeName(MyV)
は、Variant() と表示されます。
つまり、MyVという変数は、ただの配列が格納されているのです。
セル範囲Range("B4:G4")とは、無関係になっています。
よって、見た目には何の変化も起こりません。
MyV = MyF
を
MyV.Value=MyF.Value
と代えるだけでMyVをRange型変数だと解釈し、値が入ります。
ケース2の場合
Sub test2()
Dim MyRange As Range
Set MyRange = Range("B4:G4")
Dim MyV As Variant
Set MyV = MyRange
Dim MyF As Variant
Set MyF = Range("B5:G5")
Dim StartTime As Long
Dim WaitTime As Long
StartTime = GetTickCount
WaitTime = Range("B3")
MsgBox TypeName(MyV)
Do
MyV = MyF
MsgBox TypeName(MyV)
MyRange = MyV
If (GetTickCount - StartTime) > WaitTime Then
Exit Do
End If
DoEvents
Loop
End Sub
test1と同様、MyVという変数は、ループ内で Variant()と表示されています。
MyRange = MyV
配列変数をRange型の変数のValueプロパティ(既定のプロパティ)への代入は、
よく使われる手法ですから、Myrangeで規定されたセル範囲に値が設定されます。
ケース3
Sub test3()
Dim MyRange As Range
Set MyRange = Range("B4:G4")
Dim MyV As Variant
Set MyV = MyRange
Dim MyF As Variant
Set MyF = Range("B5:G5")
Dim StartTime As Long
Dim WaitTime As Long
StartTime = GetTickCount
WaitTime = Range("B3")
MsgBox TypeName(MyV)
Do
MyV(1, 1) = MyF(1, 1)
MsgBox TypeName(MyV(1, 1))
If (GetTickCount - StartTime) > WaitTime Then
Exit Do
End If
DoEvents
Loop
End Sub
MsgBox TypeName(MyV(1, 1))は、Range と表示されます。
MyV(1, 1)は、正確には、 MyV.item(1,1)です。
MyV(1, 1) この書式で記述した時点でMyvという変数をRange型の変数だと
解釈してくれているということです。
よって、セルB4にだけ 値が設定されます。
ケース4
Sub test4()
Dim MyRange As Range
Set MyRange = Range("B4:G4")
Dim MyV As Variant
Set MyV = MyRange
Dim MyF As Variant
Set MyF = Range("B5:G5")
Dim StartTime As Long
Dim WaitTime As Long
StartTime = GetTickCount
WaitTime = Range("B3")
MsgBox TypeName(MyV)
Do
MyV(1, 1) = MyF(1, 1)
MsgBox TypeName(MyV)
MyRange = MyV
If (GetTickCount - StartTime) > WaitTime Then
Exit Do
End If
DoEvents
Loop
End Sub
上記では、MyRangeもMyVもRange型変数です。
MyRange = MyV
これには前述のポイント2が関係してきます。
>Rangeオブジェクトの代入式(MyRanage = MyV)において、右辺(MyV)に
プロパティを記述しないと左辺側で既定のプロパティをチェックし、Valueプロパティが配列だとEmptyに設定する
以上です。Rangeオブジェクトの規定のプロパティValueをオブジェクト内にある
ただの変数という解釈だと中々理解できませんよ!!
Valueと命名されたプログラムだと解釈してください。
それと、ご自分でオブジェクトを作成してみると、何となく理解できてくると
思います。
|
|