Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


7569 / 76732 ←次へ | 前へ→

【74749】Re:セルの書き換え手法2点の違いを教えてください。
発言  ichinose@  - 13/9/7(土) 7:51 -

引用なし
パスワード
   この現象にループは関係ないので、
ループは外した方が例としては、簡素化されてよいと思います。

でも、このように例題コードを記述されること自体すごいですねえ!!

結論は、繰り返しになりますが、オブジェクトのプロパティは、記述するに
尽きるのですが。
現象のポイントは、

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と命名されたプログラムだと解釈してください。

それと、ご自分でオブジェクトを作成してみると、何となく理解できてくると
思います。
1 hits

【74718】セルの書き換え手法2点の違いを教えてください。 化け猫 13/9/3(火) 1:42 質問
【74719】Re:セルの書き換え手法2点の違いを教えてく... 化け猫 13/9/3(火) 5:20 発言
【74720】Re:セルの書き換え手法2点の違いを教えてく... ichinose 13/9/3(火) 6:18 発言
【74726】Re:セルの書き換え手法2点の違いを教えてく... 化け猫 13/9/4(水) 4:51 発言
【74727】Re:セルの書き換え手法2点の違いを教えてく... ichinose 13/9/4(水) 6:34 発言
【74728】Re:セルの書き換え手法2点の違いを教えてく... 13/9/4(水) 7:41 回答
【74731】Re:セルの書き換え手法2点の違いを教えてく... kanabun 13/9/4(水) 10:47 発言
【74733】Re:セルの書き換え手法2点の違いを教えてく... ichinose@食事中 13/9/4(水) 12:58 発言
【74747】Re:セルの書き換え手法2点の違いを教えてく... 化け猫 13/9/6(金) 23:32 発言
【74749】Re:セルの書き換え手法2点の違いを教えてく... ichinose@ 13/9/7(土) 7:51 発言
【74753】Re:セルの書き換え手法2点の違いを教えてく... 化け猫 13/9/7(土) 11:39 お礼
【74751】Re:セルの書き換え手法2点の違いを教えてく... kanabun 13/9/7(土) 8:45 発言

7569 / 76732 ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free