プロが教えるわが家の防犯対策術!

Excel VBAで例えばセル"A2"をセレクトしている状態で
「ENTER」を押すとB5に自動的にセレクトすることはできないでしょうか?

Worksheet_Change関数を使おうと思ったのですが
"A2"の中身が変化しないと発動しません。

Worksheet_SelectionChange関数を使って"A2"を選択している状態で「ENTER」を押すと"A3"が選択されることを利用し、
「"A3"が選択されたら"B5"に飛ぶ」
も考えたのですが、マウスやキーボード操作で"A3"を
選択すると"B5"に飛んでしまうので、これも使えません。

何か対策案はないでしょうか。ご教授よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

こんばんは。



これは、定番のコードですが、私は、それに、もう少し工夫を凝らしてみました。
本来は、クラスによるインスタンスが良いとは思いますが、それを一般的にお勧めするには、ちょっと荷が重いような気がしました。

'<標準モジュール>

Private Sub ReturnDirectrion2SelectCell()
 If ActiveCell.Address(0, 0) Like "A2" Then
  Range("B5").Select
 Else
  'Original ReturnDirection の再現
  On Error Resume Next
  Select Case Application.MoveAfterReturnDirection
  Case xlDown
    ActiveCell.Offset(1).Select
  Case xlToRight
    ActiveCell.Offset(, 1).Select
  Case xlToLeft
    ActiveCell.Offset(, -1).Select
  Case xlUp
    ActiveCell.Offset(-1).Select
  End Select
 End If
End Sub

Sub SetKeys()
  '設定用
  Application.OnKey "~", "ReturnDirectrion2SelectCell"
  Application.OnKey "{Enter}", "ReturnDirectrion2SelectCell"
End Sub
Sub SetOffKeys()
 '解除用
 Application.OnKey "~"
 Application.OnKey "{Enter}"
End Sub

'-----------------------------------------

自動設定が必要な場合は、以下のコードを加えてください。

'-----------------------------------------
'<標準モジュール>
Sub Auto_Open()
 Call SetKeys
End If
Sub Auto_Close()
 Call SetOffKeys
End If
'-----------------------------------------

なお、現在の設定では、全てのブックの全てのシートに同じように適用されます。Auto_Open等の代わりに、例えば、Worksheet_Activate や Workbook_SheetActivateなどに、SetKeysをCall し、Worksheet_DeactivateやWorkbook_SheetDeactivateに、SetOffKeysをCallするようにすると良いと思います。
    • good
    • 4
この回答へのお礼

ご返事ありがとうございます。
期待していた通りの動作が実現できました。

本当にありがとうございました。

お礼日時:2005/10/26 21:12

以下のようにコーディングすればよいのでは



Private blnA2Select As Boolean
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If blnA2Select Then
Range("b5").Select
Else
End If
If Target.Address = "$A$2" Then
blnA2Select = True
Else
blnA2Select = False
End If
End Sub

【注意】
A2がセレクトされた状態から他のセルをセレクトするとB5が選択されるので、「"A2"を選択されている状態で「ENTER」を押すと"B5"を選択する」という要件から若干外れていますが…
「"A2"からフォーカスが外れると"B5"を選択する(「ENTER」に限らず)」
如何でしょう?
    • good
    • 0
この回答へのお礼

ご返信ありがとうございます。

いただいたプログラムを使ってみたところ
「"A2"を選択している状態でマウス操作で"C10"等を選択すると"B5"に飛んでしまう」
という現象が発生してしまいました。

そこで

If blnA2Select Then
Range("b5").Select
Else

If Target.Address = "$A$3" And blnA2Select = True Then
Range("b5").Select
Else

と変更したところ
「前回"A2"で今回"A3"を選択したときのみ"B5"に飛ぶ」
という動作を作ることが出来ました。

理想に近い状態なのですが、キーボード操作で
「"A2"⇒"A3"と移動すると"B5"に飛んでしまう」等
若干問題が残っています。

他によい対策案等ありましたら、ご教授お願いします。

お礼日時:2005/10/26 20:44

このQ&Aに関連する人気のQ&A

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

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QEnterキーでマクロを起動さす。

Excelの(例)A1のセルに検索値を入力しEnterキーを押すと事前に組まれたマクロが起動する方法を教えて下さい。

又はEnterキーにマクロは設定できませんか?

Aベストアンサー

#4のnojioさんの補足ということでお読みください。(書いているうちにかぶってしまいました。)

Worksheet_Changeがsumi-hamaさんの意図かもしれませんが・・・下記はEnterに対して機能します。


下記コードを標準モジュールに貼り付け、
 Onkey_Set を実行することでEnterキーにマクロが割り当てられます。
 マクロ側で(MacroTest)Sheet1のA1を特定しています。

 Onkey_Off を実行することでEnterキーは元の機能に戻ります。


'Enterキーにマクロを割り当て
Sub Onkey_Set()
  Application.OnKey "{Enter}", "MacroTest"
End Sub

'デモ(Sheet1のセルA1のみで機能させる)
Sub MacroTest()
  If ActiveSheet.Name = "Sheet1" Then
    If ActiveCell.Address(0, 0) = "A1" Then
      MsgBox "Sheet1のセルA1でEnterキーを押しました"
    End If
  End If
End Sub

'Enterキーを元の機能に戻す
Sub Onkey_Off()
  Application.OnKey "{Enter}"
End Sub

#4のnojioさんの補足ということでお読みください。(書いているうちにかぶってしまいました。)

Worksheet_Changeがsumi-hamaさんの意図かもしれませんが・・・下記はEnterに対して機能します。


下記コードを標準モジュールに貼り付け、
 Onkey_Set を実行することでEnterキーにマクロが割り当てられます。
 マクロ側で(MacroTest)Sheet1のA1を特定しています。

 Onkey_Off を実行することでEnterキーは元の機能に戻ります。


'Enterキーにマクロを割り当て
Sub Onkey_Set()
  Applic...続きを読む

QVBA エンターキーでイベントに入りたい。

テキストボックスにデータ入力後エンターキーの押下でイベントに入りたいのですが、下記のコーディングで[通過]メッセージが表示されません。英数字は通過しますが、エンターキーは動作停止します。
これと全く同じコーディングでVB6は正しく動きます。(ただし、Pvate Sub text1_KeyPress(KeyAscii As Integer)に変更してます。)
<コーディング>
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
Msgbox "通過"
If KeyAscii = vbKeyReturn Then
KeyAscii = 0
End If
End Sub

これが出来ると、そのつどキーボードから手を離さずに済むので作業効率がグンとあがります。どうかよろしくご教示ください。Excel2003SP3

Aベストアンサー

こんにちは。

>ご指摘のオブジェクトとプロシージャは間違いないことを確認しています。(TextBox1,keyPress)コードのロジックはこれ以上簡単に書きようがないほど単純明快です。

>Excelで実際にこのコードを実行していただけませんか。

ご自身のコードが間違いがないと思い込んでいられるから、そういう発言をされるのだと思いますが、ここでのお話の前提は、あくまでも、VBAです。VB6ではありません。

私が、期待通りの反応を示さないので、「実際にこのコードを実行してください」とおっしゃっているようですが、はっきり言えば、その最初のコードは、VBAでは間違っています。それに気がついてください。

質問のコードのままのコードでは、Enter キーのイベントは、取れないのです。別にPCの故障でもソフトの問題でもないし、こちらが試していないわけでもありません。

Visual Basic とVBAは、細かい点で違います。

VBAのこの種のイベントの KeyAscii では、VB6 で取れる、EnterキーのKeyAsciiの 「13」 は、取れません。 KeyAscii は、MSForms.ReturnIntegerとなって、Integer ではありません。

だから、私は、その代わりとして、KeyDown イベントを使えばよいとしているわけなのです。

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
 If KeyCode = vbKeyReturn Then
  MsgBox "Enterキーが入りました", 64
  'KeyCode =0
 End If
End Sub

Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
 MsgBox "通過"
End Sub

こんにちは。

>ご指摘のオブジェクトとプロシージャは間違いないことを確認しています。(TextBox1,keyPress)コードのロジックはこれ以上簡単に書きようがないほど単純明快です。

>Excelで実際にこのコードを実行していただけませんか。

ご自身のコードが間違いがないと思い込んでいられるから、そういう発言をされるのだと思いますが、ここでのお話の前提は、あくまでも、VBAです。VB6ではありません。

私が、期待通りの反応を示さないので、「実際にこのコードを実行してください」とおっしゃってい...続きを読む

Qエクセルでエンターを押すと任意のセルに移動は出来ますか?

エクセルでエンターを押すと任意のセルに移動は出来ますか?
A1のセルでエンターを押すとC1に移動するようにしたいです。
宜しくお願いします^^

Aベストアンサー

No.2の補足に対する回答です

Private Sub Worksheet_Change(ByVal Target As Range)
 Select Case Target.Address(False, False)
  Case "A1"       'このセルが変更されたら---(1)
   Range("C1").Select 'このセルに移動する---(2)
  Case "C1"       'このセルが変更されたら---(1)
   Range("A2").Select 'このセルに移動する---(2)
  Case "A2"       'このセルが変更されたら---(1)
   Range("C2").Select 'このセルに移動する---(2)
  Case Else
 End Select
End Sub

もし、A列を変更した場合に同じ行のC列、C列を変更した場合に次の行のA列というロジックであれば、
Private Sub Worksheet_Change(ByVal Target As Range)
 Select Case Target.Column
  Case 1 'A列が変更されたら---(1)
   Cells(Target.Row, 3).Select 'C列の同じ行に移動する---(2)
  Case 3 'C列が変更されたら---(3)
   Cells(Target.Row + 1, 1).Select 'A列の次の行に移動する---(4)
  Case Else
 End Select
End Sub

No.2の補足に対する回答です

Private Sub Worksheet_Change(ByVal Target As Range)
 Select Case Target.Address(False, False)
  Case "A1"       'このセルが変更されたら---(1)
   Range("C1").Select 'このセルに移動する---(2)
  Case "C1"       'このセルが変更されたら---(1)
   Range("A2").Select 'このセルに移動する---(2)
  Case "A2"       'このセルが変更されたら---(1)
   Range("C2").Select 'このセルに移動する---(2)
  Case Else
 ...続きを読む

QEnterキーで順番にセルの移動する。

Excel2013

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

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

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

Aベストアンサー

以下の要件で作ってみました。(当方、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

以下の要件で作ってみました。(当方、Excel2010です)

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

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

...続きを読む

QSub ***( ) と Private Sub ***( ) の違い

初歩的な質問で申し訳ありませんが・・・

自分でコードを書いていても、イベントが発生したりした時の処理で、コードのウィンドウで上のドロップダウンリストで選択できる時の処理などは自動的に[Private Sub Command1_Click( )]などと出てくるのでそのまま使っています。自分で別途プロシージャーを作成する時は[Sub ****( )]としています。
ですがその違いを理解しないまま、自分で作成する時は[Private Sub]ではなくて[Sub]を使っています。

Sub ***( ) と Private Sub ***( ) の違いは何なんでしょうか?
どなたか説明頂けませんか?
よろしくお願いします。

Aベストアンサー

「Sub」の部分にカーソルを置いて[F1]を押せばヘルプが起動します。
「指定項目」のところに「Public」と「Private」の説明がありますよ。
省略して「Sub hogehoge()」とした場合は「Public」とみなされます。

Publicは「すべてのモジュールから呼び出せるプロシージャ」ということになります。
Privateとすると「同じモジュールの中からしか呼び出せないプロシージャ」となります。

もしExcelをお持ちでしたらExcelのVBEで標準モジュールを追加し、「Sub Test1()」と「Private Sub Test2()」を作成してみてください。
そしてExcelの[ツール]-[マクロ]-[マクロ(Alt+F8)]でマクロ実行のダイアログを表示させてみるとわかります。
ここには実行できるプロシージャの一覧が表示されますが、Test1は表示されているけれどTest2は表示されません。
Test1はPublicで、Test2はPrivateだからです。

QEXCELでENTERキーでセルの移動マクロ

こんにちは。
EXCELでENTERキーでセルの移動マクロを使いたいのですが、下記のマクロで改良を教えてもらいたいと思います。
まず、最初は必ず、セルB5にフォーカスしたいということ。そうして、できればOFFSETを使わないで、rangeかcellを使いたいのですが、お願いします。

Sub セル移動()
Range("B5").Select
Select Case ActiveCell.Column
Case 1
ActiveCell.Offset(1, 1).Activate
Case 2
ActiveCell.Offset(2, 2).Activate
Case 3
ActiveCell.Offset(1, 1).Activate
Case 4
ActiveCell.Offset(1, 1).Activate
End Select
End Sub

こんにちは。
EXCELでENTERキーでセルの移動マクロを使いたいのですが、下記のマクロで改良を教えてもらいたいと思います。
まず、最初は必ず、セルB5にフォーカスしたいということ。そうして、できればOFFSETを使わないで、rangeかcellを使いたいのですが、お願いします。

Sub セル移動()
Range("B5").Select
Select Case ActiveCell.Column
Case 1
ActiveCell.Offset(1, 1).Activate
Case 2
ActiveCell.Offset(2, 2).Activate
Case 3
...続きを読む

Aベストアンサー

根本的に
質問例はSUB ENDのプログラムになってます。
すなわち人間がF5等押すとか、メニューの実行をクリックして実行するか、他のルーチンから飛んでくるか、しないと働きません。それでよいのですか?
私はイベントプロシージュアーで組まないと、質問にふさわしくなく、便利でないと思います。
ーーーー
さてワークシートのイベントですが、
>ENTERキーでセルの移動
したいのでしょうが、エンターキー押し下げをきっかけにするイベントにするイベントは、現状(E2002)設けられていないように
思います。
Changeイベントで代用するとしても、ENTERでなく、TABや矢印キー
でセルを移動しても、コピー貼り付けしても、発動します。
その辺考えましたか。
毎回質問のルーチンを実行するために、別のコマンドボタン等をおすのは、便利性という意味から、意味がない。
>できればOFFSETを使わないで、rangeかcellを使いたいのですが
も質問で使っていながら、こう表現するのは、理由を帰すべきと思う。
結局何がしたいのか、質問に良く表現されてない。
ーーー
今B5ならC2に
今C2ならd5のように飛び飛びに、自動でカーソルを移動して
ほしいということかな。
私が過去に載せた回答と似たものを上げてみます。
Private Sub Worksheet_Change(ByVal Target As Range)
f = Array("$B$5", "$C$2", "$D$5", "$F$2")
t = Array("$C$2", "$D$5", "$F$2", "$B$5")
For i = 0 To UBound(f)
If Target.Address = f(i) Then
Range(t(i)).Select
End If
Next
End Sub
B5->C2ー>D5->F2ー>B5を繰り返します。
2つのArrayの中は、Fからtに飛ぶ仕組みで、その組み合わせで作れば増やしたり、どこへでも飛ばせる。
これとて使えるかどうか。
カーソルが動く、そしてデータが入れられる。
そこで何をするか?
またB5に戻って、データの一揃いが揃ったとき
誰が(人手かプログラムか)そのデータで何をどうするのじか?
書いてないが、そこと関連しないと、この質問の回答は生かせないと
思う。
思い付いたニーズをとりあえず、質問に出した感じがした。

根本的に
質問例はSUB ENDのプログラムになってます。
すなわち人間がF5等押すとか、メニューの実行をクリックして実行するか、他のルーチンから飛んでくるか、しないと働きません。それでよいのですか?
私はイベントプロシージュアーで組まないと、質問にふさわしくなく、便利でないと思います。
ーーーー
さてワークシートのイベントですが、
>ENTERキーでセルの移動
したいのでしょうが、エンターキー押し下げをきっかけにするイベントにするイベントは、現状(E2002)設けられていないように
思...続きを読む

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。

Qエクセルでエンターを押すと隣のセルではなく指定したセルに!

エクセルでエンターを押すとセルが右隣に移動します。
次に入力したいのは4個右のセルなので、エンターキー
を4回押しています。

一回エンター押すと指定したセルに飛ばすにはどうし
たらいいのか教えて下さい。

Aベストアンサー

こんにちは。

セル単位・列単位なら「名前」を付ける方法も在ります。



E列を選択して「Ctrl」キーを押しながらA列を選択して
名前Box(数式バーの左側の小窓)に任意の名前
(仮に「入力」)を直接入力します。

一度B1セル等を選択してから「名前Box」のプルダウン
から「入力」を選択して「Enter」キーで確認してください。

2番目を最初に選択して3・4・・・と選択して
最初に入力したいセル・列は最後に選択してください。

※Excel2002からなら「セルのロック」と「シート保護」
を併用した方法も在ります。

Q別のシートから値を取得するとき

Worksheets("シート名").Activate
上記のを行ってから別シートの値を取得するのですが、
この処理を行うと指定したシートへ強制的にとんでしまいます。。。

※イメージ
For ~ To ~
  Worksheets("シートA").Activate
  シートAの値取得
       :
  Worksheets("シートB").Activate
  シートBの値取得
Next

このイメージ処理を行うとものすごい勢いで画面がチカチカします。。。
シートを変えずに他のシートから値を取得する方法はないのでしょうか。
教えてください!

Aベストアンサー

Worksheets("シートA").Range("A1")

みたいな感じでできませんか?

QEXCEL あるセルに数字が入力されれば既存マクロ実行させたい

ボタン等のグラフィックオブジェクトのマクロ実行は簡単なのですが、
ある位置のセルにデーターが入力されれば、
既存のマクロを自動実行させることできますか?

Aベストアンサー

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
if Range(ある位置) <>"" then call 既存のマクロ名
End Sub

ある位置と既存のマクロ名を変更して使ってみてください。
あと このVBAは 操作するワークシートのほうに記述します。


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

人気Q&Aランキング