|
|
| Excel VBA Macro ・ セル制御 ・ FAQ |
|
矢印キーが押されたときに特定のセルを飛ばして移動させるには?
|
|
|
|
Question 80.4 |
Excel VBA Borad (掲示板)より |
 |
 |
|
|
ときどき読ませていただき、参考にさせていただいています。 早速ですが、ある特定のセルにカーソルが行かないようにしたいのです。
たとえば、特定のセルを B2だとします。
A2から右矢印キーで B2に動かそうとすると、C2に行く
C2から左矢印キーで B2に動かそうとすると、A2に行く
B1から下矢印キーで B2に動かそうとすると、B3に行く
B3から上矢印キーで B2に動かそうとすると、B1に行くようにしたいのです。
Target.Row=2 かつ Target.Column=2 の時に
B2以外のセルへ行かせればよいと思うのですが、
どの矢印キーが押されたのか の判断がわかりません。 どなたか教えていただけますか。よろしくお願いします。
[補足]
マクロを使わなくても、セルの書式設定-保護-ロック での設定と、シートの保護-ロックされたセル範囲の選択 での設定を組み合わせれば一応可能と思いますが、その特定のセルを変更しようとするとメッセージが出てしまいます。
このメッセージがうっとうしいので、そのセルをとばして次のセルに行かせたいのです。
|
|
|
強引ですが、こんな方法はどうでしょう。 ワークシートモジュールに
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Application.OnKey "{RIGHT}", "右"
Application.OnKey "{LEFT}", "左"
Application.OnKey "{DOWN}", "下"
Application.OnKey "{UP}", "上"
End Sub
標準モジュールに
Sub 右()
If ActiveCell.Address(False, False) = "A2" Then
ActiveCell.Offset(0, 2).Activate
ElseIf Not ActiveCell.Column = 256 Then
ActiveCell.Offset(0, 1).Activate
End If
End Sub
Sub 左()
If ActiveCell.Address(False, False) = "C2" Then
ActiveCell.Offset(0, -2).Activate
ElseIf Not ActiveCell.Column = 1 Then
ActiveCell.Offset(0, -1).Activate
End If
End Sub
Sub 下()
If ActiveCell.Address(False, False) = "B1" Then
ActiveCell.Offset(2, 0).Activate
ElseIf Not ActiveCell.Row = 65536 Then
ActiveCell.Offset(1, 0).Activate
End If
End Sub
Sub 上()
If ActiveCell.Address(False, False) = "B3" Then
ActiveCell.Offset(-2, 0).Activate
ElseIf Not ActiveCell.Row = 1 Then
ActiveCell.Offset(-1, 0).Activate
End If
End Sub
実用性あるかわかりませんが (汎用性は無い)、一応 B2 には移動不能になっているかと。
直接選択してしまえば意味ありませんが、カーソルでの移動は制御できるかなと。
|
|
|
確認しました。B2をとばしているのを見て、感激しますね。当たり前でしょうが。 汎用性については、大丈夫です。変更して利用させていただきます。 なお、直接マウスでB2を選択した時は、ワークシートモジュールに
If Target.Column = 2 And Target.Row = 2 Then
Cells(Target.Row, Target.Column + 1).Select
End If
のように、1セル分右に動かすことにして、追加することにします。 または、Application.MoveAfterReturnDirection に応じてセルを動かすようにしてみます。実際に作成しているシートは、もう少しだけ複雑ですが,・・・。
今まで、「あるキーが押されたら」という制御をしたことがほとんどなかったので、とても参考になりました。
ありがとうございました。
|
|
|
|
| |
|
|