ママのスキンケアのお悩みにおすすめアイテム

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

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

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

A 回答 (5件)

#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
    • good
    • 17

OnKey メソッドを使うと、特定のキーを押したときに、指定されたプロシージャを実行できたと思います。



Application.OnKey "{ENTER}", "MyProc"
    • good
    • 2

私もシート上でENTERキーを入力したことを、イベント(Event Prosedure)として捉えたいと


いつも思っています。しかし正確には、ワークシート上では、VBAでは存在しないと思います。APIなどを使うのではないかと思います。
#1、#2のご解答のことは存じておりますが。
ただ、ご質問者はそれらのご回答に満足されるように思います。それで充分かもしれないからです。しかしChangeイベントやSelectionChangeイベントは微妙に違うのではないでしょうか。例えばA1セルにAが入っていてAとA1セルに打ちこむ
またはEnterだけ打ち込んだら、Changeイベントは反応しなかったような記憶があります。
勿論ワークシートのイベント一覧にはEnter云々は見つかりません。
もし間違っていたらお叱りをお受けします。
もし出きれば、マクロ名をPrivate SubとSubEndの
間に書くだけですが。
    • good
    • 1

初めまして。

下記の様に操作すると貴方様の思い通りの動作をすると思います。

・新規ブックを立ち上げ、ALT+F11を押してVBE画面を表示させ、画面左上にVBAProjectと書かれている下のSheet1にマウスポインターをあわせてダブルクリックし、表示された右側の白い部分に下記のコードを記述する。

Private Sub Worksheet_Change(ByVal Target As Range)

if Target.Address = "$A$1" Then
実行したいマクロ
End if

End Sub

ご不明な点・不具合等がございましたらお気軽に補足して下さい。
    • good
    • 4

こんにちは。



Enterキーのみで絶えずマクロが起動したら、何も出来なくなると思いますが。。

シート名のタブを右クリック-コードの表示で、出てきたVBE画面にコピペします。
A1セルの値が変わるたびに、メッセージが出ます。

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
If Target.Cells(1, 1).Address = "$A$1" Then
  MsgBox Target.Cells(1, 1).Text
End If
End Sub

参考に。
    • good
    • 3

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

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

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

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

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

QExcel VBA あるセルでENTERを押すと特定のセルへ移動したい

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

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

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

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

Aベストアンサー

こんばんは。

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

'<標準モジュール>

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するようにすると良いと思います。

こんばんは。

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

'<標準モジュール>

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
  ...続きを読む

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ではありません。

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

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

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

Aベストアンサー

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

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

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
 ...続きを読む

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だからです。

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

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

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

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

Aベストアンサー

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

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

Qセルの値が変ると自動でマクロが実行される。

セルの値が変ると自動でマクロが実行されるVBAを教えて下さいm(_ _ )m
例えば、シート1のA1の値が変ると、マクロAが実行される。
シート1のA2の値が変ると、マクロBが実行される。
と一つのシート内に複数のイベントを設置したのですが、イマイチわかりません。
知恵をお貸し下さい。

Aベストアンサー

こんにちは
お邪魔します。

(1)まずはオーダー通りの基本型

Private Sub Worksheet_Change(ByVal Target As Range)
' ' 複数セルが変更された場合(単セルでない場合)は処理を抜ける
If Target.Count > 1 Then Exit Sub
' ' 変更されたセルが1列めでない場合は処理を抜ける
If Target.Column <> 1 Then Exit Sub
' ' 変更されたセルの行位置によって処理を分岐する
Select Case Target.Row
Case 1
' A1 の場合の処理
MsgBox "A1" ' 確認用(確認が済んだら当行削除)
Case 2
' A2 の場合の処理
MsgBox "A2" ' 確認用(確認が済んだら当行削除)
End Select
End Sub

(2)セルの位置によってもっと細かく分岐したい場合

Private Sub Worksheet_Change(ByVal Target As Range)
' ' 複数セルが変更された場合(単セルでない場合)は処理を抜ける
If Target.Count > 1 Then Exit Sub
' ' 変更されたセルの 列位置 によって処理を分岐する
Select Case Target.Column
Case 1 ' 1列めなら
' ' 変更されたセルの 行位置 によって処理を分岐する
Select Case Target.Row
Case 1 ' 1列め の 1行め なら
' A1 の場合の処理
MsgBox "A1" ' 確認用(確認が済んだら当行削除)
Case 2 ' 1列め の 2行め なら
' A2 の場合の処理
MsgBox "A2" ' 確認用(確認が済んだら当行削除)
End Select
Case 2 ' 2列めなら
' ' 変更されたセルの 行位置 によって処理を分岐する
Select Case Target.Row
Case 1 ' 2列め の 1行め なら
' B1 の場合の処理
MsgBox "B1" ' 確認用(確認が済んだら当行削除)
Case 2 ' 2列め の 2行め なら
' B2 の場合の処理
MsgBox "B2" ' 確認用(確認が済んだら当行削除)
End Select
End Select
End Sub

(3)セルのアドレスを採り文字列で分岐したい場合
   (個人的にはあまりお奨めしていませんが、知っておいた方が好いもの)

Private Sub Worksheet_Change(ByVal Target As Range)
'' ' 変更されたセルの 参照文字列(A1型) によって処理を分岐する
Select Case Target.Address(False, False)
Case "A1"
MsgBox "A1" ' 確認用(確認が済んだら当行削除)
Case "A2"
MsgBox "A2" ' 確認用(確認が済んだら当行削除)
Case "B1"
MsgBox "B1" ' 確認用(確認が済んだら当行削除)
Case "B2"
MsgBox "B2" ' 確認用(確認が済んだら当行削除)
End Select
End Sub

とりあえず、単セルの場合だけ、理解を深めてみましょう。
複数セルに値変更があった場合については、その後でいいと思います。
(1)にある
If Target.Count > 1 Then Exit Sub
If Target.Column <> 1 Then Exit Sub
のような記述はイベントプロシージャでは多用される基本中の基本ですから
よーく咀嚼して呑み込んじゃってください。

一応、いわずもがなですが、
上に挙げたようなイベントプロシージャを複数併記することはできませんので
使わないものはコメントブロックして下さい。
VBE(Visual Basic Editor)のツールバーに[編集]というのを追加してあれば
[コメントブロック]、[非コメントブロック]というボタンがありますので適宜。

また、イベントプロシージャで注意するべき点として
例えば今回のChangeイベントの処理中にセルの値を変更すれば
再度Changeイベントが呼び出される(再帰)ということを知っておいてください。
その場合、
  Application.EnableEvents = False
  ' 処理
  Application.EnableEvents = True
のような形で、再帰を回避します。

私自身VBAを覚え初めの頃は、イベントプロシージャとばかり格闘して
日に何百回もエラーを出しながら納得がいくまで色んなことを試していた覚えがあります。
・オブジェクトやプロパティの基本的な扱い方
・条件分岐
などの基本事項を覚えるのには最適の課題ですから、頑張って挑戦し続けてください。

以上です。

///
Re:#2 ちょっと違うかも。
それは、「A1 と 同じ値 に変更された セル があった場合」の処理になっています。
Private Sub Worksheet_Change(ByVal Target As Range)
If Target = Range("A1") Then
MsgBox Target.Address
End If
End Sub
として、例えば、C3セルにA1と同じ値を設定すると違うのがわかると思います。
あしからず、、、

こんにちは
お邪魔します。

(1)まずはオーダー通りの基本型

Private Sub Worksheet_Change(ByVal Target As Range)
' ' 複数セルが変更された場合(単セルでない場合)は処理を抜ける
If Target.Count > 1 Then Exit Sub
' ' 変更されたセルが1列めでない場合は処理を抜ける
If Target.Column <> 1 Then Exit Sub
' ' 変更されたセルの行位置によって処理を分岐する
Select Case Target.Row
Case 1
' A1 の場合の処理
MsgBox "A1" ' 確認用(確認が済んだら当行削除)
...続きを読む

Q【Excel VBA】マクロでExcel自体を終了させたい

環境:WindowsXP、Excel2003

マクロでエクセルを終了(ブックを閉じて、アプリケーション自体も終了)させたいのですが、以下のコードではアプリケーションが閉じてくれません。

ThisWorkbook.Close
ExcObj.Quit
Application.Quit

どこか悪いところはありますでしょうか?

よろしくお願いします。

Aベストアンサー

普通に考えれば質問者のコードで上手くいきそうですが
hana-hana3さんの回答にもあるようにThisWorkBook.Closeでコード終了となりますので
Application.QuitをThisWorkBook.Closeの前にもってこないといけません。
Application.Quitはそれがあるプロシージャのコードが全て終わるまで
その実行を保留するちょと特別動作をします。

'-------------------------------------
 Application.Quit
 ThisWorkbook.Close
'-------------------------------------
 
 

QExel VBA 別ブックから該当データを検索し、必要なデータを取得する方法について

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数ではなく、マクロで処理を希望します。

自分では、部品表の商品番号をコピーして、コード一覧表で検索し、検索結果の右隣のセル(B列のコード)の値を部品表のC列に貼り付ければよいかと思い、書いてみたんですが…

Sub 別ブックから貼り付ける()
  Dim 検索する As Long
Windows("部品表.xls").Activate
検索する = cells(i,2).Value
Windows("コード一覧表.xls").Activate
ActiveWindow.SmallScroll Down:=-3
Selection.AutoFilter Field:=3, Criteria1:="=検索する", Operator:= xlAnd

と、してみたものの、検索しても、その検索結果の隣のセルのコードをどうやって取得すればいいのかが、わかりませんでした。

基本事項は本で学びましたが、呪文のようなコードはよく理解できません。懸命にネットで検索して、訳して理解する努力をしてはいますが。

どうぞよろしくお願いします。

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数...続きを読む

Aベストアンサー

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks.Open("C:\★★\コード一覧表.xls") '★要変更★
 I = 2
 Do While Range("A" & I).Value <> ""
  ThisWorkbook.Worksheets("Sheet1").Range("C" & I).Value = Application.VLookup(ThisWorkbook.Worksheets("Sheet1").Range("B" & I).Value, xlBook.Worksheets("Sheet1").Range("A2:B65535"), 2, 0)
  I = I + 1
 Loop
 xlBook.Close
 Application.ScreenUpdating = True
 MsgBox ("完了")
End Sub

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks....続きを読む

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

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

Aベストアンサー

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

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


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

このカテゴリの人気Q&Aランキング