| 
    
     |  | この現象にループは関係ないので、 ループは外した方が例としては、簡素化されてよいと思います。
 
 でも、このように例題コードを記述されること自体すごいですねえ!!
 
 結論は、繰り返しになりますが、オブジェクトのプロパティは、記述するに
 尽きるのですが。
 現象のポイントは、
 
 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と命名されたプログラムだと解釈してください。
 
 それと、ご自分でオブジェクトを作成してみると、何となく理解できてくると
 思います。
 
 |  |