Excel VBA質問箱 IV

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

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


1393 / 13646 ツリー ←次へ | 前へ→

【74748】タイマーの描画がうまく反映されない件 化け猫 13/9/7(土) 0:45 質問[未読]
【74750】Re:タイマーの描画がうまく反映されない件 ichinose@ 13/9/7(土) 8:26 発言[未読]
【74752】Re:タイマーの描画がうまく反映されない件 kanabun 13/9/7(土) 9:48 発言[未読]

【74748】タイマーの描画がうまく反映されない件
質問  化け猫  - 13/9/7(土) 0:45 -

引用なし
パスワード
   こんばんわ、以下のようなケース1~2を作り検証したところ、以下のような違いが出ました。

ケース1: 空白
     結果、予想通り描画されタイマーも動作する。
ケース2: RngScore = ScoreT
     描画がされず、タイマーも正常に機能しない。

Option Explicit
Declare Function GetTickCount Lib "kernel32" () As Long
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Sub kakunin2()
  
  Dim RngScore As Range
    
    Set RngScore = Worksheets("確認2").Range("C3:F3")
    RngScore = 0
  
  Dim ScoreT As Variant
    
    Set ScoreT = RngScore
  
  Dim StartTime As Long
    
    StartTime = GetTickCount
  
  Dim WaitTime As Long
    
    WaitTime = Range("A1")
  
  Dim start As Long
  
  
  Do
      
    start = GetTickCount
    
    Do Until 1000 <= (GetTickCount - start)
      
      Sleep 1000
    
    Loop
    
    DoEvents
  
    ScoreT(1, 2) = WaitTime - (GetTickCount - StartTime)
    ScoreT(1, 1) = 0
    ScoreT(1, 3) = 0
    ScoreT(1, 4) = 0
    
    "ケース1~2"
        
    
    If ScoreT(1, 2) < 0 Then
      
      Exit Do
      
    End If
     
  Loop
  
End Sub

ケース2で動作がうまくいかないのはなぜでしょうか。
質問に答えていただけると助かります。

以上、よろしくお願いいたします。

【74750】Re:タイマーの描画がうまく反映されない件
発言  ichinose@  - 13/9/7(土) 8:26 -

引用なし
パスワード
   >ケース2: RngScore = ScoreT
>     描画がされず、タイマーも正常に機能しない。
理由は、

www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=74718;id=excel

ここでの現象に起因します。

>タイマーも正常に機能しない。
ScoreT(1, 2)、つまり、セルD2は、Emptyなのですから、

Empty<0 Falseですから、ループから抜けないからです。

【74752】Re:タイマーの描画がうまく反映されない件
発言  kanabun  - 13/9/7(土) 9:48 -

引用なし
パスワード
   ▼化け猫 さん:

>  Dim RngScore As Range
>  Dim ScoreT As Variant
>    
>    Set ScoreT = RngScore
>    
>    (中略)  
>
>    ScoreT(1, 2) = WaitTime - (GetTickCount - StartTime)
>    ScoreT(1, 1) = 0
>    ScoreT(1, 3) = 0
>    ScoreT(1, 4) = 0

ここで ScoreT は
>    Set ScoreT = RngScore
Rangeオブジェクトとして使われています。
したがって、

>    ScoreT(1, 1) = 0

は省略しないで書くと、
  ScoreT.Item(1, 1).Value = 0
つまり、
  セル範囲ScoreTの (1行目,1列目)セルの値を 0 にせよ!
と記述しているわけです。

決して ScoreT という「配列」の (1, 1)要素に 0を代入している
わけではないのですよ(^^

この点は、よろしいでしょうか?

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