重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

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

よろしくお願いいたします。

A 回答 (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
' ' ==============================
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

今回ご丁寧にすごい説明まで
頂いて感謝してます。

私の不手際の悪さからまた
下記のところでエラーがでて
先に進まない状態です。
Application.Run "EnterEntJump"

私自身なにか基本ができてないので、
勉強して理解したいと思います。

お礼日時:2013/09/07 11:25

(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
' ' ==============================
    • good
    • 0

(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のメニューバー[挿入]→[標準モジュール]という手順で
 新規の標準モジュールが挿入されます。
 通常、特に断りが無く提示されているマクロ(コード)は
 対象となるブックの標準モジュールに記載するものです。
 そうしないと正しく動きません。
 、、、そういう暗黙の了解がある、と、覚えてください。

私が書いたものを(投稿文字数制限に掛かる為)次の投稿であげてみます。
サンプル(パーツの提示)ではなく、実用コードとして、
自分ならこんな風に書くであろう内容です。
さしあたり気が付いた難点に、諸々手当てしていますから、
使い勝手は悪くない、とは思いますけれども。
運用に困るようでしたら、相談してみてください。
    • good
    • 0

こんばんは!


一案です。
シートモジュールにもう一つ「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
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

やりたいことができました。

助かりました。

ありがとうございます。

お礼日時:2013/09/07 11:29

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

    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

私自身なにか基本ができてないようです。

勉強して先に進めるようにがんばります。

お礼日時:2013/09/07 11:28

> なにか設定しなくてはいけないこととか


> ありますでしょうか?


こちらを参考にしてください。
http://office.microsoft.com/ja-jp/excel-help/HA0 …
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

上記を参考に全てマクロを有効に
してみたのですが、同じメッセージが
でてきます。

H5でエンターはエラーになります。

標準モジュールの実行クリックは
C5セルに移動してくれます。

他のマクロは正常に動いてます。

お礼日時:2013/09/01 19:00

すみません訂正です



標準モジュールのほうは

Public Sub MoveCells()

Range("C5").Select
Application.OnKey "~"
Application.OnKey "{Enter}"

End Sub

にしてください。

この回答への補足

回答ありがとうございます。

早速試したのですが、セルH5でエンターすると
下記のエラー表示が出てしまいます。

"このブックでマクロが使用できないか、またはすべての
マクロが無効になっている可能性があります。"

なにか設定しなくてはいけないこととか
ありますでしょうか?

補足日時:2013/09/01 00:10
    • good
    • 0

補足です。



単純にするのでしたら

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が実行されるので、あまりお勧めとは言えないかもしれません。
    • good
    • 0

こちらのやりとりが参考になるでしょう



http://oshiete.goo.ne.jp/qa/1737730.html
    • good
    • 0

> 入力なしのエンターでC5セルに移動させるには


セルC5へは「どこから」移動ですか?

飛んで欲しくないセルを書き込み禁止しておくとか。

この回答への補足

H5セルからです。

補足日時:2013/08/31 19:09
    • good
    • 0

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