2017-10-27 6 views
0

小さなアニメーションを作成するために、いくつかのShapeオブジェクトを1つずつ表示して非表示にしたいこのコードがあります。ただし、コードの実行中に何も起こらず、コードの実行が停止するとすべての画像が一度表示されます。Shapes.Visibleループ内の真と偽VBA

Sub test() 

    For i = 1 To 4 

     Sheets("Game").Shapes("North" & i).Visible = True 

     Sleep 500 

     'Sheets("Game").Shapes("North" & i).Visible = False 
     'by setting it to false i'd like to achieve the animation effect 

     Debug.Print i 

     DoEvents 

    Next i 

End Sub 
+0

が動いています ' DoEvents'の前に 'Sleep'コールが何か助けてくれますか? –

+1

どこに形を隠していますか?あなたは 'Visible = True'の後に' DoEvents'を試みた後、 'Visible = False'の後に' DoEvents'を試みましたか? –

+0

'Visible = True'の後に' DoEvents'を設定し、 'Visible = False'の後に' DoEvents'を設定すると、トリックが実行されました! – Serveira

答えて

2

DoEventsは、別のワークシート上でユーザがクリックのようなものを実行し、処理するために他のコード(たとえば、Excelの自身を)ことができます(いずれかのWorksheet.ChangeまたはWorkbook.WorksheetChangeハンドラを呼び出します)...またはそれ自体を再描画します。

ループごとに1回ずつDoEventsを呼び出すと、Excelは可視性切り替えの間に再描画する機会を得ることができません。ループは既に実行中です。

ですから、上の表示を切り替える必要がある、(DoEvents)Excelが再描画させ、アニメーションの遅延のための睡眠その後、視界トグルオフ、(500msのは少し遅いIMOようだ)とExcelが再びを再描画させ、すなわちDoEvents 1以上を呼び出します時間。そのプロパティ(F4)を見て、プロジェクトエクスプローラでそれを選択し、変更その(Name)たとえば、に、GameSheetからGameワークシートがThisWorkbookである場合

、私は暖かく、あなたはそれをCodeNameを与えるお勧めします。あなたはイテレーションごとに二度同じワークシートを間接参照する必要がないように

これはあなたのグローバルスコープのオブジェクト変数を与える - 一体あなたも一度だけそのShapesコレクションを逆参照できます:

Private Const ANIMATION_DELAY As Long = 100 

Sub test() 

    With GameSheet.Shapes 

     For i = 1 To 4 

      Dim currentShape As Shape 
      Set currentShape = .Item("North" & i) 

      currentShape.Visible = True 
      DoEvents 

      Sleep ANIMATION_DELAY 

      currentShape.Visible = False 
      DoEvents 

      Debug.Print i 

     Next 

    End With 

End Sub 
+0

それはすごかった。私は間違いなく、ワークシートに 'CodeName'を与えるあなたのヒントに従います! – Serveira

0

TrueFalseを切り替えた後DoEventsを設定することで、コードを改正し、今では動作します:

Sub test() 

    For i = 1 To 4 

     Sheets("Game").Shapes("North" & i).Visible = True 

     DoEvents 

     Sleep 100 

     Sheets("Game").Shapes("North" & i).Visible = False 

     DoEvents 

     'by setting it to false i'd like to achieve the animation effect 

     Debug.Print i 



    Next i 

End Sub 
関連する問題