'//シートモジュール
Private Sub Worksheet_Activate()
SettingKeys True
End Sub


Private Sub Worksheet_Deactivate()
'設定解除
SettingKeys False
End Sub

Sub OnEnterKeyMoving()
'★設定はここでします。
If Not ActiveSheet.Parent Is Me.Parent Then
SettingKeys False
Else
Select Case ActiveCell.Address(0, 0)
Case "B6": Range("D6").Select
Case "D6": Range("H6").Select
Case "H6": Range("K6").Select
Case "K6": Range("L6").Select
Case "L6": Range("O6").Select
Case "O6": Range("B8").Select
Case "B8": Range("F8").Select
Case "F8": Range("C10").Select
Case Else: ActiveCell.Offset(1).Activate
End Select
End If
End Sub


Sub SettingKeys(flg As Boolean)
If flg Then
Application.OnKey "~", Me.Name & ".OnEnterKeyMoving"
Application.OnKey "{ENTER}", Me.Name & ".OnEnterKeyMoving"
'MsgBox "キーを設定しました"
Else
Application.OnKey "{ENTER}"
Application.OnKey "~"
'MsgBox "キーを解除しました"
End If
End Sub


'-------------
'設定したシート名を入れる
'ThisWorkbook モジュール
Private Sub Workbook_Deactivate()
Dim sheetname As String


sheetname = Sheets(1).Name
Worksheets(sheetname).SettingKeys False
End Sub


Private Sub Workbook_Activate()
Dim sheetname As String


sheetname = Sheets(1).Name
Worksheets(sheetname).SettingKeys True
End Sub

エンターキーで指定したセルに移動するプログラムなのですがシート名を変更すると
動かなくなってしまいます。
どこを変更したらよいでしょうか?
分かる方いたらよろしくお願いします。

A 回答 (1件)

作者です。



たぶん、私の想像があっていれば、汎用的にお使いになりたいわけですね。
そういう指摘を受ければ、ごもっともです。

そうすると、一番良い方法は、Class からインスタンスを起こすことですね。
どのシートでも、使うようにするなら、以下のようなClass にしてあげます。
起動は、Aut_Open で、一旦閉じて開ければ、自動設定になっています。

最初にClass モジュールの挿入

'//標準モジュール
Public myClass As Class1
Public ShName As String
Sub Auto_Open()
'これは全体的にはアドイン式になっている
Dim sh As Worksheet
Set myClass = New Class1

ShName = "Sheet3" 'シート名を入れる
Set sh = Worksheets(ShName)

Set myClass.clsWorkbook = ThisWorkbook 'ここも変更が可能
Set myClass.clsApp = Excel.Application
Set myClass.clsWorksheet = sh
SettingKeys True
End Sub

Sub SettingKeys(flg As Boolean)
 With myClass
 If flg Then
  .clsApp.OnKey "~", "EnterMove" '半角の~波線
  .clsApp.OnKey "{ENTER}", "EnterMove"
  'MsgBox "キーを設定しました"
 Else
  .clsApp.OnKey "{ENTER}"
  .clsApp.OnKey "~", "" '半角の~波線
  'MsgBox "キーを解除しました"
 End If
End With
End Sub
Sub EnterMove()
 myClass.OnEnterKeyMoving
End Sub

'//Class1モジュール

Public WithEvents clsApp As Excel.Application
Public WithEvents clsWorksheet As Worksheet
Public WithEvents clsWorkbook As Workbook

Private Sub clsWorksheet_Activate()
 SettingKeys True
End Sub


Private Sub clsWorksheet_Deactivate()
'設定解除
 SettingKeys False
End Sub

Sub OnEnterKeyMoving()
'★設定はここでします。
 If Not ActiveWorkbook Is clsWorkbook Then
  SettingKeys False
 ElseIf clsWorksheet.Name <> ActiveSheet.Name Then
  SettingKeys False
 Else
  Select Case ActiveCell.Address(0, 0)
  Case "B6": Range("D6").Select
  Case "D6": Range("H6").Select
  Case "H6": Range("K6").Select
  Case "K6": Range("L6").Select
  Case "L6": Range("O6").Select
  Case "O6": Range("B8").Select
  Case "B8": Range("F8").Select
  Case "F8": Range("C10").Select
  Case Else: ActiveCell.Offset(1).Activate
  End Select
  
 End If
End Sub


'-------------
'設定したシート名を入れる
Private Sub clsWorkbook_Deactivate()
  SettingKeys False
End Sub

Private Sub clsWorkbook_Activate()
  SettingKeys True
End Sub
    • good
    • 0

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

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

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

QPrivate Sub Worksheet_Calculate()のことでお聞きします

いつもgooの皆さんに大変お世話になっております
マクロの勉強を初めて2ヶ月の者です

Private Sub Worksheet_Change(ByVal Target As Range)にマクロを書いているのですが
「特定のセル範囲が変更されたときに処理を実行する」は分かるのですが
特定のセル範囲が変更されなくても、例えば、セルの値がインストールされているアドインで
変化した時の処理はどこに書いたらいいのでしょうか?

今現在、H列のTarget.RowとJ列のTarget.Rowにはアドインで、機器の温度が表示されていますが
この2点の温度変化で
Application.Speech.Speak "温度接近", True
などどやりたいのですが、Private Sub Worksheet_Calculate()に書けばいいのでしょうか
その場合、Private Sub Worksheet_Change(ByVal Target As Range)内の
Target.Row等の値はどうやったらPrivate Sub Worksheet_Calculate()で使えますか?
それとも、もしかしたら標準モジュールに書くのでしょうか?

うまく説明できていませんが、どなたか教えてください

いつもgooの皆さんに大変お世話になっております
マクロの勉強を初めて2ヶ月の者です

Private Sub Worksheet_Change(ByVal Target As Range)にマクロを書いているのですが
「特定のセル範囲が変更されたときに処理を実行する」は分かるのですが
特定のセル範囲が変更されなくても、例えば、セルの値がインストールされているアドインで
変化した時の処理はどこに書いたらいいのでしょうか?

今現在、H列のTarget.RowとJ列のTarget.Rowにはアドインで、機器の温度が表示されていますが
この2点の...続きを読む

Aベストアンサー

こんばんは。

今回の質問は、ご質問者さんには、別のイベントというか、紹介しましたね。その中に含まれていたかもしれません。

今回の件は、マクロを勉強して2ヶ月の人の話ではなく、3年やっても、5年やっても知らない人は知らないことで、かなりハイレベルというか、古めかしいというか、ほとんど知られていない技術だと思います。こういう話は、1冊の本にもなっています。本来、計測メーカー側の専門業者に頼んでしまったほうが早い気もします。たぶん、彼らは、公表はしていませんが、それ専用のVBA用のマクロを持っているはずです。

>特定のセル範囲が変更されなくても、例えば、セルの値がインストールされているアドインで
>変化した時の処理はどこに書いたらいいのでしょうか?

ふつうは、どこでもよいので、
=Now()
という式を書いて、
Private Sub Worksheet_Calculate()
に、イベントを拾わせるわけです。
しかし、少し、工夫が必要で、時々、これが困った動きをします。

Calculate のイベントが、ワークブック全体に働いてしまい、どこのシートを使っても、Calculateイベントが動いてしまいます。この方針で話が本格的になった時に、この対処法は、あらためて紹介します。

>(Worksheet_Change)のTarget.Row等の値はどうやったらPrivate Sub Worksheet_Calculate()で使えますか?

単に、モジュール変数を使って橋渡しするのか、それとも、同時で働くということなら、 Worksheet_Calculateのイベントでなくてもよいはずです。どのように使うのか、こちらではわかりかねます。本来、別の働きをするものです。もちろん、キーで入力した際は、Worksheet_Calculateのイベントは、起動します。

>Application.Speech.Speak "温度接近", True
>などどやりたいのですが、Private Sub Worksheet_Calculate()に書けばいいのでしょうか

ActiveX コントロールで入ってきた値が、どのように加わっていくのかにもよりますが、セルの位置は、Worksheet_Changeイベントのようにセルの位置は感知しませんから、インプットの場所が動いていくのでしたら、マクロで最後尾を探さなくてはなりません。

>それとも、もしかしたら標準モジュールに書くのでしょうか?
同様のコマンドで、標準モジュールに書く方法もあります。とても古い方法で、オブジェクト・ウィンドウにも出てこないはずです。しかし、まだ、同様の働きはしますが、今は、シートモジュールが主流になっています。

こんばんは。

今回の質問は、ご質問者さんには、別のイベントというか、紹介しましたね。その中に含まれていたかもしれません。

今回の件は、マクロを勉強して2ヶ月の人の話ではなく、3年やっても、5年やっても知らない人は知らないことで、かなりハイレベルというか、古めかしいというか、ほとんど知られていない技術だと思います。こういう話は、1冊の本にもなっています。本来、計測メーカー側の専門業者に頼んでしまったほうが早い気もします。たぶん、彼らは、公表はしていませんが、それ専用のVBA用の...続きを読む

QエクセルのPrivate Sub Worksheet_Change

エクセルのPrivate Sub Worksheet_Change

すいません。どうやっても動作しません。
シート1のB5のセルに英数字を入力しエンターを押して確定すると
シート2のC列から同レコードを検出し、その検出された行のB~E列の値を
シート1のH4、H5、H6、J7に値をかえします。
またB5の値はH8にも表示されます。
データがあった場合には、シート1のH4、H5、H6、J7に値が表示されています。
シート2にデータが無い場合はシート1のH4、H5、H6、J7には「#N/A」と表示されます。
ここまでは関数と計算式なのでマクロではありません。

ここでフォームで作成した「印刷ボタン」をクリックします。
すると「印刷ボタン」に登録したマクロが起動します。
シート1のセルG4~J11までが印刷されます。

マクロの内容は

シート1のH4に「#N/A」が表示されている場合はメッセージボックスで
「データがありません」と出ます。印刷は実行されません。

H4が「#N/A」以外の場合は印刷が実行されますがその前に
シート3のセルA1の数値をプラス1してシート3のB2に、セルA1の値の先頭にAを付けて
表示します。(セルA1が0002ならB1はA0002)
それがシート1のH12に表示されます。(H12への表示は計算式で対応)
印刷ボタンを押すごとにシート3のセルA1は1づつ繰り上がります。
シート1のH12の値が変わってから印刷がされます。
と同時に
シート1のセルB5がDELETEされセルB5がアクティブになります。
結果シート1のH4、H5、H6、J7、H8は「#N/A」が表示されます。
H12はクリアされません。
印刷終了後にもセルの値が変化する事になります。

もう一つフォームで作成した「初期化」というボタンがあります。
これをクリックするとマクロが起動して
シート1のセルB5がDELETEされセルB5がアクティブになります。
よってシート1のセルH4、H5、H6、J7、H8も「#N/A」に値が変わります。

ここまでは完璧に動作しています。
でこの「印刷ボタン」を押してマクロが起動ではなく
セルB5に入力しエンターを押したらマクロを起動させたいです。

Private Sub Worksheet_Change(ByVal Target As Range)
を利用しましたが動作しません。

シート1のB5のセルに入力しエンターを押すと
シート1の一部のセルの値が変化。
印刷ボタンを押すと、シート3の一部のセルの値が変化し
その後再びシート1のセルの一部が変化し印刷が開始され
その後シート1のセルB5がDELETEされアクティブに。
それに伴いシート1の一部のセルの値が変化する。
マクロが起動すると、シート1とシート3のセルの値が数回変化します。

このような場合はPrivate Sub Worksheet_Change(ByVal Target As Range)で
セルB5の入力後エンターで確定しての上記のマクロ起動は無理なのでしょうか?

エクセルのPrivate Sub Worksheet_Change

すいません。どうやっても動作しません。
シート1のB5のセルに英数字を入力しエンターを押して確定すると
シート2のC列から同レコードを検出し、その検出された行のB~E列の値を
シート1のH4、H5、H6、J7に値をかえします。
またB5の値はH8にも表示されます。
データがあった場合には、シート1のH4、H5、H6、J7に値が表示されています。
シート2にデータが無い場合はシート1のH4、H5、H6、J7には「#N/A」と表示されます。
こ...続きを読む

Aベストアンサー

application.EnableEvents = False
処理
application.EnableEvents = True
ちゃんと上記の様にしていますか?

EnableEvents入れてなかったらシート1の値変えた時点で
再度Changeイベントが頭から始まりますよ。
処理中にエラーになるとEnableEventsがFalseのままになり
イベントが発生しなくなるのでOn error gotoとか書いた方がいいですよ。
あとデバッグは覚えた方が良いと思います。

QWorksheet_Activate のイベントでエラー

Worksheet_Activate() のイベントに,
他のシートに書き込む作業を書いては
いけないのでしょうか。エラーになります。

Range(“他のシート名!A2”) = ActiveSheet.Name
「実行時エラー’1004’  ‘Range’ メソッドは失敗しました。
 ‘Worksheet’ オブジェクト」

Excel2010です。宜しくお願いします。

Aベストアンサー

worksheets("他のシート名").range("a2").value = me.name

QEXCELのVBAでのSelectとActivateの違い

VBAの初心者です。
ExcelのVBAでメッセージを表示してシートを切換えるというのを作りたいのです。
見真似で作成したのが↓です。


Dim rtn As String
rtn = MsgBox("シートを切換えますか", vbYesNo, "シートの切替")
If rtn = vbYes Then
Worksheets("送付先一覧").Activate
Range("a1").Select

Else
Exit Sub
End If

動作確認はできましたが、上記の「Activate」を「Select」に変更しても特に動作異常がありません。
そこで、疑問ですが、「Activate」と「Select」ってどうやって使い分けるのでしょうか?

Aベストアンサー

こんにちは。

通常は、シートもセルも Select でよいと思います。
選択して、扱えるようにするということだと思います。

#2さんも述べておりますが、Activate って、ひとつを選ぶことですね。でも、なぜか、Activate は、ほとんど使いません。

たぶん、Select は、選択した後に、その選択したものを、そのままオブジェクトとして確保して使えるので便利だから選ばれるのかもしれません。

Select → Selection
として使えます。

QVBA(EXCEL2003)におけるselect,activateメソッドの違い

EXCEL2003でVBAを独習中です。どうもselectとactivateの違いをなかなか理解できません。
例えば
sheets("sheet1").select と sheets("sheet1").activateの違いは何かということがわかりません。
まして activesheet.activate などと書かれていると、何でアクティブなシートをアクティブにしなければならないのだ?と思ってしまいます。
VBAに関しては、数回目の初心者ですので、何でも言ってください。

Aベストアンサー

シンプルに言うと、
セルをクリックしたままマウスをドラッグさせると、ドラッグさせた範囲は薄いブルーになりますよね(元が白いセルなら)、そこがセレクトされた範囲です。
しかしながら、最初にクリックしたセルだけは色が変わってないですよね、そこがアクティブです。
セル以外に、シートでもCtrlやShiftを押しながら複数選べますよね、同様です。


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

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

おすすめ情報