2016-10-20 7 views
0

私は{DOWN}を押すまで基本的に以下のアクションをループしたいが、プライベートサブは100%正しいとは思われないので、コードは永遠にループする。Onkey {RIGHT}

Public pressdown As Boolean 

Sub DemoOnKey() 
    Application.OnKey "{RIGHT}", "moveright" 
    Application.OnKey "{LEFT}", "moveleft" 
    Application.OnKey "{DOWN}", "movedown" 
    Application.OnKey "{UP}", "moveup" 

End Sub 

Sub moveright() 
    Do Until pressdown  
    Selection.Copy Destination:=Selection.Offset(0, 1) 
    Selection.Offset(0, 1).Select 
    Selection.Offset(0, -1).ClearContents 

    DoEvents 
    Loop 

    If pressdown = True Then 
    Call movedown 'Calls similar macro to moveright, but to movedown, hehe 
    End If  
End Sub 

Private Sub Form_KeyPress(Key As Integer) 
    Const down = "{DOWN}" 
    If Application.OnKey = down Then pressdown = True 
End Sub 
+4

グローバル変数としてどこかで宣言されていますか? – Comintern

+1

{DOWN}が押されたときに押された状態がtrueに設定されています。{RIGHT} – Rdster

+0

@Rdsterではありません。これはタイプミスです。 @Cominternあなたは 'Public Pressdown As Range'のような意味ですか? 私は今それを行い、マクロは 'Do Until pressdown'でエラーになりました – Serveira

答えて

1

任意の場所にForm_KeyPress(Key As Integer)を含めることはできません。これは、ユーザーフォームでなければならないイベントハンドラです。それがあった場合は、If Application.OnKey = downを実行することができないため、コンパイル時にエラーが発生します。このサブは決して入力されず、したがって決してコンパイルされないので、あなたはそれを離れています。

あなたのアプローチは間違っています。
スネークを設定方向に動かし、この方向を変更する4つのキーハンドラを持つループがあります。

また、ダイレクトループはExcelのキー操作で問題を引き起こすため、適切な方法ではありません。

+1

情報をありがとう。だから、私は例えば、以下のためにそれを編集した: 'ケース "右" ActiveCell.Copy先:= Selection.Offset(0、1) ActiveCell.Offset(0、1).Select のActiveCell。オフセット(0、-1).ClearContents' 移動しようとしましたが、何も起こりませんでした。 それから、マクロ「DemoOnKey」を実行しようとしましたが、「このオブジェクトモジュールが派生するオブジェクトモジュールにはすでにメンバー識別子があります」と表示されます。 'Sub move()'について – Serveira

+0

@Serveiraまず、 'DemoOnKey'を実行し、' move'を実行して、再生するシートに移動します。メンバーに不満がある場合は、同じ名前の2つの手続きがないことを確認します。また、Excelのバージョンが異なると、単純なループによって異なる問題が発生するため、コードを変更しました。 – GSerg

+0

偉大な、私はそれを試してみましょう!私はまだたくさんのことを学ぶことができます。このコードを明確にすることに感謝します。 – Serveira