No.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
この回答への補足
お礼のフォームが無いので、補足入力フォームから重ねてお礼を申し上げます。
シート保護の設定で
"ロックされたセル範囲の選択"にもチェックを入れて試したところ、ロックされてないセルへ瞬時に戻るので仮に関数などが設定されているセルを選択されても編集されずに利用できるので、このまま利用させていただきたいと思います。
nishi6さん、どうもありがとうございました。
nishi6さん、ありがとうございます。
チェックボックスを図のように配置してやってみました。
上手く動きました!
まさしく私が作りたかったものとそっくりの例でした。
ただ、私以上にExcel、パソコンそのものに不慣れな者たちが扱うので、チェックボックスではなくボタンもしくはシートが開いたら動くようにした方がいいかもしれないと思いました。
その場合はどのようにコードを編集したらよいですか?
重ね重ねすいません。ご教授お願いします。
No.4
- 回答日時:
言い忘れたので追記。
さっきのは、シートに記載してください。
標準モジュールには
Declare Function GetAsyncKeyState Lib "User32.dll" (ByVal vKey As Long) As Long
と入れてください。
さすがに、シートへのプログラムの書き方、
標準モジュールの出し方等が分からないことは無いと思いますので、
コレにて回答とさせてもらいます。
satoron666さん、返事遅くなり申し訳ありません。
シート、標準モジュールにコピペして、ワークシートではB2,D5,A6セル以外シート保護をして試してみました。
"指定セルを選択してください。"のmsgBoxが出て次のD5セルに進めませんでしたが、シート保護を解除したら、ちゃんとエンターキーでB2→D5→A6と移動が出来ました。
エンターキーが押されたら一旦シート保護を解除するようなコードが必要でしょうか、何度もすいませんご教授お願いします。
No.3
- 回答日時:
参考リンクです。
保護を掛けて、それ以外選択できない状態になっているという設定で
話を進めます。
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ですが、しっかり稼動しました。
適当なプログラムで申し訳ないですが…稼動すればいいな~と思ってます。
No.2
- 回答日時:
上記の「イベント処理」を使用して
'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では、セル編集時に押したキーを判定する方法が用意されていない)ので、諦めましょう。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 表内で、Enterキーで横→行の最後入力したら次の行の先頭に移動するマクロを作りたい 3 2022/05/01 21:19
- Visual Basic(VBA) vbaでセルに入力したときに,その横にあるセルを保護し入力不可にするマクロを作りたいです。 2 2022/04/24 20:59
- Excel(エクセル) エクセルについて質問です。 8 2022/05/31 16:00
- Excel(エクセル) Excel ヘルプの[ロック解除]、<c0>、</c0> の意味は何ですか? 1 2023/02/20 16:58
- Excel(エクセル) エクセルでシート保護のかかり方の違いとセルの非保護の設定 3 2022/08/09 10:02
- マウス・キーボード テンキーの設定がおかしくなっています。 5 2023/08/09 15:35
- Excel(エクセル) MSさん、シッカリしてよ~んッ! 3 2023/01/30 13:15
- Excel(エクセル) エクセルについて教えてください。 2 2023/06/14 11:11
- Excel(エクセル) エクセルの祝日に色が反映しない 4 2022/05/18 09:58
- Excel(エクセル) エクセルのバージョン2016フリーズ改善策 5 2022/12/13 09:13
このQ&Aを見た人はこんなQ&Aも見ています
-
カンパ〜イ!←最初の1杯目、なに頼む?
飲み会で最初に頼む1杯、自由に頼むとしたら何を頼みますか? 最初はビールという縛りは無しにして、好きなものを飲むとしたら何を飲みたいですか。
-
一回も披露したことのない豆知識
あなたの「一回も披露したことのない豆知識」を教えてください。 「そうなんだね」と「確かに披露する場所ないね」で評価します。
-
これ何て呼びますか Part2
あなたのお住いの地域で、これ、何て呼びますか?
-
プリン+醤油=ウニみたいな組み合わせメニューを教えて!
プリンと醤油を一緒に食べると「ウニ」の味がする! というような意外な組み合わせから、新しい味になる食べ物って色々ありますよね。 あなたがこれまでに試した「組み合わせメニュー」を教えてください。
-
タイムマシーンがあったら、過去と未来どちらに行く?
20XX年、ついにタイムマシーンが開発されました。 あなたは過去に行く? それとも未来? タイムマシーンにのって、どこに行って、何をしたいか教えてください!
-
Excel VBA あるセルでENTERを押すと特定のセルへ移動したい
Excel(エクセル)
-
エクセルでエンターを押すと任意のセルに移動は出来ますか?
その他(コンピューター・テクノロジー)
-
エクセルVBAを使いセルを指定した順番に異動させ
Excel(エクセル)
-
-
4
値を入力後、自動的にアクティブセルが移動するマクロ
Excel(エクセル)
-
5
入力するセルの順番を自動選択(セルの移行)
Excel(エクセル)
-
6
エクセルのVBA 特定のセルでエンターキーでマクロ実行
Excel(エクセル)
-
7
エクセルでエンターを押すと隣のセルではなく指定したセルに!
Excel(エクセル)
-
8
Enterキーでマクロを起動さす。
その他(ソフトウェア)
-
9
EXCELでENTERキーでセルの移動マクロ
Excel(エクセル)
-
10
入力後enterを押すと、非保護の別セルへ移動したい。(エクセル)
Excel(エクセル)
-
11
VBA エンターキーでイベントに入りたい。
PowerPoint(パワーポイント)
-
12
excelの入力順を決める方法について
Excel(エクセル)
-
13
エクセル TABキーの動きをマクロで
Excel(エクセル)
-
14
エクセルvba (ByVal Target As Range)について
Excel(エクセル)
-
15
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
16
テキストボックス(VBA)でEnterを押したときに作動するマクロ
Access(アクセス)
-
17
excelで セルの移動時にマクロ実行を設定したい。
Excel(エクセル)
-
18
エクセル イベントマクロ Changeイベントを複数作りたい
Access(アクセス)
-
19
ExcelVBAでテキストボックスの表示形式を小数点第二位まで表示する方法
Visual Basic(VBA)
-
20
TextBoxに日付を自動的に入れる
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAで特定の文字が入った行をコ...
-
Excelのマクロについて教えてく...
-
VBAのエラー表示の対処法について
-
VBA 別ブックからコピペしたい...
-
Excelのマクロについて教えてく...
-
Excel 範囲指定スクショについ...
-
【ExcelVBA】インデックスが有...
-
VBAのループ処理について教えて...
-
エクセルでCDOを使ったメール送...
-
EXCEL vbaでシート上に配置した...
-
Excel_VBAについて質疑です。(...
-
【ExcelVBA】dictionaryの重複...
-
VBAでセルの書式を変えずに文字...
-
修正依頼:【VBA】 結合セルに...
-
Excelのマクロについて教えてく...
-
Excelのマクロについて教えてく...
-
Web画面の文字をVB6で取得したい
-
[VB.net] ボタン(Flat)のEnable...
-
エクセルのVBAコードについて教...
-
エクセルvbaの対象セルに色をつ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【ExcelVBA】5万行以上のデー...
-
【ExcelVBA】dictionaryの重複...
-
VBAでセルの書式を変えずに文字...
-
[Excel VBA]特定の条件で文字を...
-
【VBA】 結合セルに複数画像と...
-
VBA 別ブックからコピペしたい...
-
エクセルVBAのブックを開く方法...
-
WindowsのOutlook を VBA から...
-
エクセルでCDOを使ったメール送...
-
エクセルvbaの対象セルに色をつ...
-
【ExcelVBA】インデックスが有...
-
Excelのマクロについて教えてく...
-
エクセルVBAで特定のセルの値を...
-
エクセルのVBAコードについて教...
-
【VBA】値を変更しながら連続で...
-
Outlookの「受信日時」「件名」...
-
VBA 2次元配列の出力
-
Excel 範囲指定スクショについ...
-
VBA 別ブックから条件に合うも...
-
Web画面の文字をVB6で取得したい
おすすめ情報