プロが教える店舗&オフィスのセキュリティ対策術

Excel2013

Enterキーを押すと隣りのセルに移動ではなく、次に入力したいセルにカーソルが移動するようにしたいです。

たとえば、
必要事項を入力する書類で、B2のセルに入力したら次はD5のセルに入力、次はA6に入力といった書類あり、Enterキーを押して次の入力セルに移動するようにしたい。また、書類の書式を崩されたくないのでシート保護して使いたいです。
Enterで進み、戻る時はUPキーか、↑キーなどで設定したいと考えてます。

どなたか、VBで教えてくださる方お願いします。

A 回答 (5件)

以下の要件で作ってみました。

(当方、Excel2010です)

・入力順の制御をするセルの個数は制限しない。
・制御するセル番地をプログラム内に入れない。
・制御するセルを登録しやすくする。
・結合セルも可とする。

・基本的な移動順は上から下、左から右とする。(戻るときに必要)
・セルを移動するキー
  Enterキー、4つの方向キー、Tabキー、Shife+Tabキー
  セルを移動させたキーよりも移動後のセルで制御する
  方向キーの右、下はEnterキー、Tabキーと同じ
  方向キーの左、上はShift+Tabキー

・シートの保護・非保護には依存しないようにする。
・入力順の制御のオンオフを可能にする。

●最初に入力順の制御を行うシートで、開発タブ>挿入>フォームコントロールでチェックボックスを1つシート上に配置し、右クリック>コントトールの書式設定>コントロールタブ>リンクするセルを「$H$1」にして、チェックボックスはオフにしてください。マクロが「$H$1」になっているからです。後で修正してください。

入力用のマクロが動き出すと修正ができなくなるので、このチェックボックスのオン・オフでマクロを制御します。

●下記のマクロをシートのコードウィンドウに貼り付け、最初の行の「AdrJump」の右に動かすセルを「,」で区切って順に記入します。結合セルの場合はその左上のセル番地になります。数の制限はありませんがほどほどに。この登録データで環状リストを作ります。

●最初の時点は、編集した後、チェックボックスをオンにしてマクロを実行するとエラーが起きる可能性があります。VBE画面でマクロを中断し、「setEnableEvents」を実行してください。以降、エラーは起きないはずです。

●今のマクロは添付図での入力用の設定になっています。


シートのコードウィンドウに貼り付けます。

'□□□ 入力セルを順に書く □□□
Const AdrJump As String = "C2,C4,C5,F5,D7,D8,D10"

Dim Jmp1() As String  '飛び先のセル(今)
Dim Jmp2() As String  '飛び先のセル(前)
Dim DownUp As Integer '戻るか進むか(1:戻る、2:進む)

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  If Range("H1") = False Then Exit Sub

  Application.EnableEvents = False
  Jmp1 = Split(getAdr(Target), ",")
  If Jmp1(0) = "" Then
    '前に進むか戻るかを判定
    DownUp = 1 - (Range(Jmp2(0)).Row < Target.Row Or _
           Range(Jmp2(0)).Column < Target.Column)
    
    Jmp1 = Split(getAdr(Range(Jmp2(DownUp))), ",")
    Range(Jmp2(DownUp)).Select: Jmp2 = Jmp1
  Else
    Jmp1 = Split(getAdr(Range(Jmp1(0))), ","): Jmp2 = Jmp1
  End If
  Application.EnableEvents = True
End Sub

'選択セル(結合セルも可)によってどこに移動するか候補を決める
Function getAdr(Tgt As Range) As String
  Dim wk() As String, i As Integer
  
  wk = Split("," & AdrJump & ",", ",")
  wk(0) = wk(UBound(wk) - 1) '環状リスト(最初)
  wk(UBound(wk)) = wk(1)   '環状リスト(最後)
  
  getAdr = ",,"
  For i = 1 To UBound(wk) - 1
    If Tgt.Range("A1").Address(0, 0) = wk(i) Then
      getAdr = wk(i) & "," & wk(i - 1) & "," & wk(i + 1)
      Exit For
    End If
  Next
End Function

'最初、編集時エラーが発生したらこのプロシージャを実行する
Sub setEnableEvents()
  Erase Jmp1
  Erase Jmp2
  Application.EnableEvents = True
End Sub
「Enterキーで順番にセルの移動する。」の回答画像5

この回答への補足

お礼のフォームが無いので、補足入力フォームから重ねてお礼を申し上げます。

シート保護の設定で
"ロックされたセル範囲の選択"にもチェックを入れて試したところ、ロックされてないセルへ瞬時に戻るので仮に関数などが設定されているセルを選択されても編集されずに利用できるので、このまま利用させていただきたいと思います。

nishi6さん、どうもありがとうございました。

補足日時:2014/07/29 19:03
    • good
    • 1
この回答へのお礼

nishi6さん、ありがとうございます。

チェックボックスを図のように配置してやってみました。

上手く動きました!

まさしく私が作りたかったものとそっくりの例でした。

ただ、私以上にExcel、パソコンそのものに不慣れな者たちが扱うので、チェックボックスではなくボタンもしくはシートが開いたら動くようにした方がいいかもしれないと思いました。

その場合はどのようにコードを編集したらよいですか?

重ね重ねすいません。ご教授お願いします。

お礼日時:2014/07/29 17:42

言い忘れたので追記。



さっきのは、シートに記載してください。

標準モジュールには
Declare Function GetAsyncKeyState Lib "User32.dll" (ByVal vKey As Long) As Long
と入れてください。

さすがに、シートへのプログラムの書き方、
標準モジュールの出し方等が分からないことは無いと思いますので、
コレにて回答とさせてもらいます。
    • good
    • 0
この回答へのお礼

satoron666さん、返事遅くなり申し訳ありません。

シート、標準モジュールにコピペして、ワークシートではB2,D5,A6セル以外シート保護をして試してみました。

"指定セルを選択してください。"のmsgBoxが出て次のD5セルに進めませんでしたが、シート保護を解除したら、ちゃんとエンターキーでB2→D5→A6と移動が出来ました。

エンターキーが押されたら一旦シート保護を解除するようなコードが必要でしょうか、何度もすいませんご教授お願いします。

お礼日時:2014/07/29 18:14

http://www.happy2-island.com/excelsmile/smile04/ …

参考リンクです。



保護を掛けて、それ以外選択できない状態になっているという設定で
話を進めます。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim RangeA As Range
Dim RangeB As Range
Dim RangeC As Range
Set RangeA = Range("B2")
Set RangeB = Range("D5")
Set RangeC = Range("A6")

If Target.Address <> Cells(RangeA.Row + 1, RangeA.Column).Address And _
Target.Address <> RangeA And Target.Address <> RangeB And Target.Address <> RangeC And _
Target.Address <> Cells(RangeB.Row + 1, RangeB.Column).Address And _
Target.Address <> Cells(RangeC.Row + 1, RangeC.Column).Address And _
Target.Address <> Cells(RangeA.Row - 1, RangeA.Column).Address And _
Target.Address <> Cells(RangeB.Row - 1, RangeB.Column).Address And _
Target.Address <> Cells(RangeC.Row - 1, RangeC.Column).Address Then
MsgBox "指定セルを選択してください。"
Application.EnableEvents = False
Range("B2").Select
Application.EnableEvents = True
Exit Sub
End If

If GetAsyncKeyState(13) <> 0 Then 'Enter押されている場合
If Target.Address = Cells(RangeA.Row + 1, RangeA.Column).Address Then
Application.EnableEvents = False
RangeB.Select
Application.EnableEvents = True
Exit Sub
End If
If Target.Address = Cells(RangeB.Row + 1, RangeB.Column).Address Then
Application.EnableEvents = False
RangeC.Select
Application.EnableEvents = True
Exit Sub
End If
If Target.Address = Cells(RangeC.Row + 1, RangeC.Column).Address Then
Application.EnableEvents = False
RangeA.Select
Application.EnableEvents = True
Exit Sub
End If

ElseIf GetAsyncKeyState(33) <> 0 Or GetAsyncKeyState(38) Then '33はPgUp、38は上
If Target.Address = Cells(RangeA.Row - 1, RangeA.Column).Address Then
Application.EnableEvents = False
RangeC.Select
Application.EnableEvents = True
Exit Sub
End If
If Target.Address = Cells(RangeB.Row - 1, RangeB.Column).Address Then
Application.EnableEvents = False
RangeA.Select
Application.EnableEvents = True
Exit Sub
End If
If Target.Address = Cells(RangeC.Row - 1, RangeC.Column).Address Then
Application.EnableEvents = False
RangeB.Select
Application.EnableEvents = True
Exit Sub
End If
End If
End Sub

範囲以外を選択した場合の設定等も一応行いました。

現状、Enterを押した際などはセル番地が変わってしまうため、
それを考慮してプログラムを組んでいます。
その為、セルの上下1セルは選択できるような仕組みになっていると
プログラムは上手く動くかな?と思います。

当方2003ですが、しっかり稼動しました。
適当なプログラムで申し訳ないですが…稼動すればいいな~と思ってます。
    • good
    • 0

http://msdn.microsoft.com/ja-jp/library/office/f …

上記の「イベント処理」を使用して

'B2だったらD5に移動
if Target.Column = 2 And Target.Row = 2 Then
Range("D5").Select
'D5だったらA6に移動
Else if Target.Column = 4 And Target.Row = 5 Then
Range("A6").Select
Endif

のようにするしかありません。

これは「一方通行」なので、スタートから順に、B2⇒D5⇒A6、のように、決まった順にしか移動させられません。

>Enterで進み、戻る時はUPキーか、↑キーなどで設定したいと考えてます。

そのような「贅沢な仕様」は実現できません(VBAでは、セル編集時に押したキーを判定する方法が用意されていない)ので、諦めましょう。
    • good
    • 0

B2、D5、A6のセルを選択。


右クリック-[セルの書式設定]
「保護」のタブ、ロックをoffに。
「ロックされていないセル範囲の選択」のみチェックし、シートを保護。

すると、Excelの標準の機能だけで質問文の希望の動作が出来ると思いますが。
    • good
    • 0
この回答へのお礼

早速、お返事ありがとうございます。

実際の書類は複雑になっていて、不規則に入力セルが配置されてるので、保護をすると思ったようにEnterキーで移動してくれません。
それで、VBならと思い質問させて頂きました。
ありがとうございます。

お礼日時:2014/07/23 17:09

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A