• ベストアンサー

VBA入力なしのエンターでのセル移動

VBA初心者です。 エクセル2010使用してるのですが チェンジイベントで入力時エンターで以下のように動きますが 入力なしのエンターでC5セルに移動させるには どのような方法があるのでしょうか? Private Sub Worksheet_Change(ByVal Target As Range) Select Case Target.Address Case "$H$5" Range("C8").Select End Select End Sub よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.10

No.8, 9、cjです。 大事なことを書き忘れましたが、試す時は それぞれ新しいブックで試すようにしてください。 幾つかの方法が提示されていますが、 ひとつのブックでこれらを併記しながら 機能させることはできませんので。 No.8, 9では  「H5セルでEnterキーを押下げたらC5セルを選択する」 ということをお求めなのだという解釈でお応えしています。 原質問への、もうひとつの解釈として  「H5セルでEnterキーを押下げた時  【値変更を伴う】場合は、C8セルを選択する  【値変更を伴わない】場合は、C5セルを選択する」 ということをお求めの場合の記述を下記、あげておきます。 文字通り、Enterキー押下げが【値変更を伴う】かどうか、であって、 「値が設定されているかどうか」でもなく 「セルが未編集であるかどうか」でもありません。 ここら辺も、はっきり判ればどうとでも直せるような書き方をしたつもりですが 今の処、どれが正しいのか確かめられていません。 また、今回の機能を複数(大量)のシートで適用させたい場合 などでも、多少の修正が必要です。 迷わず書けるような補足があれば、再度レスする用意はあります。 検証が大変かも知れませんが、焦らず頑張ってください。 ' ' ◆ 標準モジュール ◆ ' ' ============================== ' ' 必ず、モジュールの先頭に記入すること。 ※ Option Explicit ' ' Enterキー押下げ時、【値変更を伴って】いたかどうか ' ' を管理するフラグ(整数)。Public スコープの変数。 Public nMode As Integer ' ' Enterキーに、プロシージャ"CmdEntJump"を登録しているかどうか ' ' を管理するフラグ(論理値)。Private スコープの変数。 Private flgC As Boolean ' ' ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー ' ' Enterキーに、プロシージャ"CmdEntJump"を登録する Private Sub EnterEntJump()   ' ' 現在登録中ならば何もせずに抜ける   If flgC Then Exit Sub   ' ' Enterキーに登録   Application.OnKey "~", "CmdEntJump"   ' ' Enterキー(テンキー)に登録   Application.OnKey "{Enter}", "CmdEntJump"   ' ' 現在登録中という意味のフラグを設定   flgC = True End Sub ' ' ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー ' ' Enterキーに登録された内容を取り消す Private Sub CancelEntJump()   ' ' 現在登録中でないならば何もせずに抜ける   If Not flgC Then Exit Sub   ' ' Enterキーに登録された内容を取り消す   Application.OnKey "~"   ' ' Enterキー(テンキー)に登録された内容を取り消す   Application.OnKey "{Enter}"   ' ' 現在登録中ではないという意味のフラグを設定   flgC = False End Sub ' ' ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー ' ' Enterキーで呼び出される(登録する)プロシージャ Private Sub CmdEntJump()   ' ' 実行プロシージャを、Changeイベント後に実行されるように     ' ' 時間差を設けて(順番を後回しにして)呼び出す   Application.OnTime Now, "EntJump" ' ● End Sub ' ' ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー ' ' 実行プロシージャ、セル選択 Private Sub EntJump()   Select Case nMode   Case 0  ' 【値変更を伴わない】Enterキー押下げ時モード     ' ' アクティブシートのC5セルを選択     Range("C5").Select ' ●   Case 1  ' 【値変更を伴う】Enterキー押下げ時モード     ' ' アクティブシートのC8セルを選択     Range("C8").Select ' ●     ' ' nModeを初期化     nMode = 0   End Select End Sub ' ' ============================== ' ' ◆ 各シートモジュール ◆ ' ' ============================== ' ' 対象シートが アクティブ になった時のイベント処理 Private Sub Worksheet_Activate()   ' ' 『 アクティブセルのアドレスが 』   Select Case ActiveCell.Address   ' ' 『 "$H$5" ならば 』・・・Case "$H$5", "$J$5" のように追加可   Case "$H$5" ' ●     ' ' Enterキーに、"CmdEntJump"を登録するプロシージャを呼び出す     Application.Run "EnterEntJump"   End Select End Sub ' ' ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー ' ' 対象シートが 非アクティブ になった時のイベント処理 Private Sub Worksheet_Deactivate()   ' ' Enterキーに登録された内容を取り消すプロシージャを呼び出す   Application.Run "CancelEntJump" End Sub ' ' ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー Private Sub Worksheet_Change(ByVal Target As Range)   ' ' 『 Targetセルのアドレスが 』   Select Case Target.Address   ' ' 『 "$H$5" ならば 』・・・Case "$H$5", "$J$5" のように追加可   Case "$H$5" ' ●     ' ' 【値変更を伴うEnterキー押下げ時】”のモードを設定     nMode = 1   End Select End Sub ' ' ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー Private Sub Worksheet_SelectionChange(ByVal Target As Range)   ' ' 『 アクティブセルのアドレスが 』   Select Case Target.Address   ' ' 『 "$H$5" ならば 』・・・Case "$H$5", "$J$5" のように追加可   Case "$H$5" ' ●     ' ' Enterキーに、プロシージャ"CmdEntJump"を登録する     Application.Run "EnterEntJump"   ' ' 『 それ以外 の場合 ならば 』   Case Else     ' ' Enterキーに登録された内容を取り消す     Application.Run "CancelEntJump"   End Select End Sub ' ' ============================== ' ' ◆ ThisWorkbookモジュール ◆ ' ' ============================== ' ' ブックをアクティブにした(開いた)時のイベント処理 Private Sub Workbook_WindowActivate(ByVal Wn As Window)   ' ' 『 アクティブシートの名前が 』   Select Case ActiveSheet.Name   ' ' 『 "Sheet1" または "Sheet2" ならば 』・・・適宜指定■■   Case "Sheet1", "Sheet2" ' ■■     ' ' 解説省略     Select Case ActiveCell.Address     Case "$H$5" ' ●       ' ' Enterキーに、"CmdEntJump"を登録するプロシージャを呼び出す       Application.Run "EnterEntJump"     End Select   End Select End Sub ' ' ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー Private Sub Workbook_WindowDeactivate(ByVal Wn As Window)   ' ' Enterキーに登録された内容を取り消すプロシージャを呼び出す   Application.Run "CancelEntJump" End Sub ' ' ==============================

tackty
質問者

お礼

ご回答ありがとうございます。 今回ご丁寧にすごい説明まで 頂いて感謝してます。 私の不手際の悪さからまた 下記のところでエラーがでて 先に進まない状態です。 Application.Run "EnterEntJump" 私自身なにか基本ができてないので、 勉強して理解したいと思います。

その他の回答 (9)

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.9

(2/2連投)  ・[マクロの表示]画面から実行されては困るプロシージャを  Private スコープで書きます。  ・シート、ブックの選択変更時、ブックを開いた時、にも、  正しく機能するように書きます。  ・対象以外のシート、ブックで誤作動しないように書きます。   注目して欲しいコメントにアイコン(記号)を付けました  ■■  ・・・  適用シートのシート名を正しく指定。必須!!  ●  ・・・  運用時、適用セルを変更する場合の指定項目  ※  ・・・  注意点  ◆ ~ ◆  ・・・  モジュール名。モジュールの始まり。       ' ' ◆ 標準モジュール ◆ ' ' ============================== ' ' プロシージャ名を変更するなら、すべてのモジュールで統一すること。 ※ ' ' 必ず、標準モジュールの先頭に記すこと。 ※ Option Explicit ' ' Enterキーに、プロシージャ"EnterJump"を登録しているかどうか ' ' を管理するフラグ。Private スコープの変数。 Private flg As Boolean ' ' ――――――――――――――――――――――――――――― ' ' Enterキーに、プロシージャ"EnterJump"を登録する Private Sub SetEnterJump()   ' ' 現在登録中ならば何もせずに抜ける   If flg Then Exit Sub   ' ' Enterキーに登録   Application.OnKey "~", "EnterJump"   ' ' Enterキー(テンキー)に登録   Application.OnKey "{Enter}", "EnterJump"   ' ' 現在登録中という意味のフラグを設定   flg = True End Sub ' ' ――――――――――――――――――――――――――――― ' ' Enterキーに登録された内容をリセットする Private Sub ResetEnterJump()   ' ' 現在登録中でないならば何もせずに抜ける   If Not flg Then Exit Sub   ' ' Enterキーに登録された内容をリセット   Application.OnKey "~"   ' ' Enterキー(テンキー)に登録された内容をリセット   Application.OnKey "{Enter}"   ' ' 現在登録中ではないという意味のフラグを設定   flg = False End Sub ' ' ――――――――――――――――――――――――――――― ' ' Enterキーに登録するプロシージャ Private Sub EnterJump()   ' ' アクティブシートのC5セルを選択   Range("C5").Select ' ● End Sub ' ' ==============================       ' ' ◆ 各シートモジュール ◆ ' ' ============================== '' 対象シートが アクティブ になった時のイベント処理 Private Sub Worksheet_Activate()   ' ' 『 アクティブセルのアドレスが 』   Select Case ActiveCell.Address   ' ' 『 "$H$5" ならば 』・・・Case "$H$5", "$J$5" のように追加可   Case "$H$5" ' ●     ' ' Enterキーに、"EnterJump"を登録するプロシージャを呼び出す     Application.Run "SetEnterJump"   End Select End Sub ' ' ――――――――――――――――――――――――――――― '' 対象シートが 非アクティブ になった時のイベント処理 Private Sub Worksheet_Deactivate()   ' ' Enterキーに登録された内容をリセットするプロシージャを呼び出す   Application.Run "ResetEnterJump" End Sub ' ' ――――――――――――――――――――――――――――― Private Sub Worksheet_SelectionChange(ByVal Target As Range)   ' ' 『 アクティブセルのアドレスが 』   Select Case ActiveCell.Address   ' ' 『 "$H$5" ならば 』・・・Case "$H$5", "$J$5" のように追加可   Case "$H$5" ' ●     ' ' Enterキーに、プロシージャ"EnterJump"を登録する     Application.Run "SetEnterJump"   ' ' 『 それ以外 の場合 ならば 』   Case Else     ' ' Enterキーに登録された内容をリセットする     Application.Run "ResetEnterJump"   End Select End Sub ' ' ==============================       ' ' ◆ ThisWorkbookモジュール ◆ ' ' ============================== ' ' ブックをアクティブにした(開いた)時のイベント処理 Private Sub Workbook_WindowActivate(ByVal Wn As Window)   ' ' 『 アクティブシートの名前が 』   Select Case ActiveSheet.Name   ' ' 『 "Sheet1" または "Sheet2" ならば 』・・・適宜指定■■   Case "Sheet1", "Sheet2" ' ■■     ' ' 解説省略     Select Case ActiveCell.Address     Case "$H$5" ' ●       ' ' Enterキーに、"EnterJump"を登録するプロシージャを呼び出す       Application.Run "SetEnterJump"     End Select   End Select End Sub ' ' ――――――――――――――――――――――――――――― Private Sub Workbook_WindowDeactivate(ByVal Wn As Window)   ' ' Enterキーに登録された内容をリセットするプロシージャを呼び出す   Application.Run "ResetEnterJump" End Sub ' ' ==============================

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.8

(1/2連投) こんにちは。お邪魔します。 誤解があるといけないので断っておきますが、 お求めのような機能は、ExcelやExcel VBAに 標準で備わっているものではありません。 なので、工夫して、自力で実装することになりますので、 初級向きとは言えない内容かも知れません。 ただ、組み合わせが難しい、ということだけで、 ひとつひとつの技術は簡単なもので、 初級の範疇を超えるものは含まれませんので、 VBAのヘルプや教本などで、ひとつひとつ確認しながら ゆっくりでいいので、覚える(確かめる)ようにしてください。 蛇足になりますが、N0.4、No.5、で問題になっている  > "このブックでマクロが使用できないか、またはすべての  > マクロが無効になっている可能性があります。" このエラーについては、 エラーメッセージの内容が不適切な文章なので、 混乱しているということなのだと思います。 kmetu様ご提示のコードは、通常は問題なく機能するものです。 考えられるエラーの(初心者にありがちな)原因として、  No.4 標準モジュールの、Public Sub MoveCells() について  1)プロシージャ名を標準モジュールでのみ変更している場合  2)対象ブックではなく、PERSONAL.XLSBの標準モジュールに記載している場合 などがあり、これらのケースでは上記のメッセージを含む エラーメッセージが表示されます。 もっとも、、、実際には上記のメッセージの前に  「マクロ フルパス+ブック名+プロシージャ名 を実行できません」 を付加した形で表示されていた筈です。 今後の為に、 他人に解決を委ねる時は、正確なエラーメッセージを伝えるようにしましょう。 原因 1)の場合、  プロシージャ名を変更する時は  呼び出す側のプロシージャ名も同時に変更するようにしましょう。  VBE(Visual Basic Editor)の置換機能を使って  【対象】を[カレントプロジェクト]等として一括置換するのが確実です。 原因 2)の場合、  同一ブック(同一プロジェクト)の標準モジュールに記載しましょう。  手順がわからないなら、  VBEのメニューバー[挿入]→[標準モジュール]という手順で  新規の標準モジュールが挿入されます。  通常、特に断りが無く提示されているマクロ(コード)は  対象となるブックの標準モジュールに記載するものです。  そうしないと正しく動きません。  、、、そういう暗黙の了解がある、と、覚えてください。 私が書いたものを(投稿文字数制限に掛かる為)次の投稿であげてみます。 サンプル(パーツの提示)ではなく、実用コードとして、 自分ならこんな風に書くであろう内容です。 さしあたり気が付いた難点に、諸々手当てしていますから、 使い勝手は悪くない、とは思いますけれども。 運用に困るようでしたら、相談してみてください。

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.7

こんばんは! 一案です。 シートモジュールにもう一つ「SelectionChange」イベントを追加してみてはどうでしょうか? わざわざSelect Case を使わなくてもよいと思うのですが、 何か他のコードとの兼ね合いがあるかもしれませんので、極力お示しのコードを変えないようにしてみました。 Private Sub Worksheet_Change(ByVal Target As Range) Select Case Target.Address Case "$H$5" If Target <> "" Then Range("C8").Select Else Range("C5").Select End If End Select End Sub Private Sub Worksheet_SelectionChange(ByVal Target As Range) With Target If .Address(False, False) = "H6" Then If .Offset(-1) = "" Then Range("C5").Select End If End If End With End Sub ※ EnterでH6セルに移動した場合にH5セルが空白の場合はC5セルを選択するようにしていますので、 H6セルに何か入力したい場合、H5セルが空白の場合はH6セルは選択できずにC5セルが選択されてしまいます。 この程度ですが参考になりますかね?m(_ _)m

tackty
質問者

お礼

ご回答ありがとうございます。 やりたいことができました。 助かりました。 ありがとうございます。

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.6

今回のコードだけの別の新しいブックを作成して試してみてください。

tackty
質問者

お礼

ご回答ありがとうございます。 私自身なにか基本ができてないようです。 勉強して先に進めるようにがんばります。

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.5

> なにか設定しなくてはいけないこととか > ありますでしょうか? こちらを参考にしてください。 http://office.microsoft.com/ja-jp/excel-help/HA010354316.aspx

tackty
質問者

お礼

回答ありがとうございます。 上記を参考に全てマクロを有効に してみたのですが、同じメッセージが でてきます。 H5でエンターはエラーになります。 標準モジュールの実行クリックは C5セルに移動してくれます。 他のマクロは正常に動いてます。

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.4

すみません訂正です 標準モジュールのほうは Public Sub MoveCells() Range("C5").Select Application.OnKey "~" Application.OnKey "{Enter}" End Sub にしてください。

tackty
質問者

補足

回答ありがとうございます。 早速試したのですが、セルH5でエンターすると 下記のエラー表示が出てしまいます。 "このブックでマクロが使用できないか、またはすべての マクロが無効になっている可能性があります。" なにか設定しなくてはいけないこととか ありますでしょうか?

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.3

補足です。 単純にするのでしたら Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Address = "$H$5" Then Application.OnKey "~", "MoveCells" Application.OnKey "{Enter}", "MoveCells" End If End Sub 標準モジュールを作成し、できたMoudule1に Public Sub MoveCells() Range("C5").Select End Sub とすればいけますが、シート上のどのセルでも選択されるたびにWorksheet_SelectionChangeが実行されるので、あまりお勧めとは言えないかもしれません。

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.2

こちらのやりとりが参考になるでしょう http://okwave.jp/qa/q1737730.html

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

> 入力なしのエンターでC5セルに移動させるには セルC5へは「どこから」移動ですか? 飛んで欲しくないセルを書き込み禁止しておくとか。

tackty
質問者

補足

H5セルからです。

関連するQ&A

専門家に質問してみよう