できるかできないかご教示ください。
VBAにてダブルクリックイベントを書いてます。
これは1シート毎に書かなくてはならないのでしょうか?
書くとしても5枚コピペすればよいだけなので、なんてことはないんですが
5シート分のモジュールができるのはあまり美しくないなぁと思い。
15シートのうちの5シート分に同じダブルクリックイベントを発生させたいのです。
できる様であれば、そのやり方もご教示ください。
VBA
1Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) 2Dim jan As String 3Dim name As String 4Dim i As Long 5Dim r As Long 6Dim sh As Worksheet 7Dim rng As Range 8 9Set sh = Worksheets("couponSku") 10Set rng = ActiveCell 11' B列を選んでいればJanを取得 12 If rng.Column = 2 And rng.Row >= 47 Then 13 jan = Target.Address(False, False) 14 jan = Range(jan).Value 15 r = sh.Range("A1").End(xlDown).Row 16 For i = 2 To r 17 If jan = sh.Cells(i, 1).Value Then 18 jan = sh.Cells(i, 2).Value 19 End If 20 Next 21 Call Google_serch(jan) 22' C列を選んでいればクーポン名取得 23 ElseIf rng.Column = 3 And rng.Row >= 47 Then 24 name = Target.Address(False, False) 25 name = Range(name).Value 26 Call Google_serch(name) 27 End If 28 29End Sub 30
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答4件
0
ワークブックにもダブルクリックイベントありますよね。
今のワークシートに書いてる処理をまるっとワークブックの方のダブルクリックイベントに持っていったらどうでしょうか。
VBA
1Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean) 2’ 今までの処理をコピペ 3End Sub
ただこれだけだと「15シートのうち5シートのみ」の要件は満たせませんから、イベント内冒頭でActiveSheetの名前で判断すればよいかと思います。
本格的な実装にするのであれば他の回答にあるようにクラスを使うことになります。
投稿2019/05/24 02:24
総合スコア17000
0
すでにいくつか回答は出ていますので、重箱の隅をつつく話ですがいくつか気になった点を記載しておきます。
Target から Worksheet は取得できる
Rangeオブジェクトには、そのオブジェクトが属しているワークシートを示すWorksheet
プロパティがあります。
ワークシートを取得したい場合は、イベントの引数のTarget
からTarget.Worksheet
で取得した方が良いと思われます。
Worksheets()
やActiveSheet
と違い、ちゃんと型も明示されていますので扱いやすく、処理としても堅牢になると思われます。
BeforeDoubleClick イベントでも Target.Count が1とは限らない
BeforeDoubleClick イベントでもTarget
には複数のセルが含まれる可能性はあります(複数のセルを選択した状態で他のソフトにアクティブを移し、Excelのウィンドウをダブルクリックすると発生しやすい。せっかちな人だとよく起きる)。
質問に記載の処理では、Target
に複数のセルが含まれる場合うまく動作しないため
vba
1If Target.CountLarge <> 1 Then Exit Sub
などをイベント処理の最初に追加しておくと良いと思います。
遠回りなコード
vba
1jan = Target.Address(False, False) 2jan = Range(jan).Value 3 4name = Target.Address(False, False) 5name = Range(bame).Value
上記のコードは以下ではだめでしょうか?
vba
1jan = Target.Value 2 3name = Target.Value
投稿2019/05/23 15:18
総合スコア2166
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
今回の要件なら、標準モジュールに共通モジュールを書いて、それを各シートから呼び出せはいいかと思います。
もう少し複雑なものなら、クラスモジュールを使うメリットも出てきますが、ダブルクリックの場合は、
それほどメリットはないと思います。
ダブルクリックはアクティブなシートでしか発生しないので、シートはActiveSheetでOK。
ダブルクリックすると、そのセルがアクティブになるので、セルは ActiveCell でOK。
ですので、それを使えば標準モジュールに共通に記述できます。
標準モジュール
vba
1Public Sub CellDoubleClick() 2 Dim sh As Worksheet 3 Dim rng As Range 4 5 Set sh = ActiveSheet 6 Set rng = ActiveCell 7 8 MsgBox sh.Name & "シートの" & rng.Address(False, False) & "セルをダブルクリックしました。" 9 '実際には sh と rng を使った処理を記述 10End Sub
ダブルクリックで処理を実行したいシートのモジュール
vba
1Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) 2 Call CellDoubleClick 3End Sub
クラスモジュールを使う場合
シートが動的に追加されたり、削除されたりする場合で、追加されたシートにもダブルクリックでイベント処理したい場合は、クラスモジュールにするメリットもでてきます。
その場合は、Collection にクラスを格納するようすると、自由に追加、削除できます。
クラスモジュール clsWs
vba
1Option Explicit 2 3Private WithEvents ws As Excel.Worksheet 4 5Public Property Let MySheet(ByVal c As Excel.Worksheet) 6 Set ws = c 7End Property 8 9'シートのダブルクリックイベント 10Private Sub ws_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) 11 Dim Sh As Worksheet 12 Dim rng As Range 13 14 Set Sh = ActiveSheet 15 Set rng = ActiveCell 'Target でもOK 16 17 MsgBox Sh.Name & "シートの" & rng.Address(False, False) & "セルをダブルクリックしました。" 18 '実際には sh と rng を使った処理を記述 19End Sub
ThisWorkbook モジュール
vba
1Option Explicit 2Public MySheets As Collection 3'ブックを開く時 4Private Sub Workbook_Open() 5 Dim cWs As clsWs 6 Dim i As Long 7 8 Set MySheets = New Collection 9 For i = 1 To ThisWorkbook.Worksheets.Count 10 Set cWs = New clsWs 11 cWs.MySheet = ThisWorkbook.Worksheets(i) 12 MySheets.Add cWs, ThisWorkbook.Worksheets(i).CodeName 13 Next 14 15End Sub 16'シートの追加時 17Private Sub Workbook_NewSheet(ByVal Sh As Object) 18 Dim cWs As clsWs 19 Set cWs = New clsWs 20 cWs.MySheet = Sh 21 MySheets.Add cWs, Sh.CodeName 22End Sub 23'シートの削除前 24Private Sub Workbook_SheetBeforeDelete(ByVal Sh As Object) 25 MySheets(Sh.CodeName).MySheet = Nothing 26 MySheets.Remove Sh.CodeName 27End Sub
投稿2019/05/23 12:10
編集2019/05/23 13:37総合スコア34347
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
ベストアンサー
ワークシートイベントをフックするユーザークラスを作成し、ブックを開いた時に各シートをこのクラスにも格納してあげれば可能です。
「ユーザークラスの作成」というと敷居が高く感じられますが、実際のコードはそこまで複雑ではありません。
まずは試してみて、うまく動いたら、なぜこれで目的の動作が実現できたのか調べて理解を深めていけばいいと思います。
例えば以下のようなユーザークラスを作成します。
clsWs
Private WithEvents ws As Excel.Worksheet 'プロパティ設定で対象シートを受け取る Public Property Let MySheet(ByVal c As Excel.Worksheet) Set ws = c End Property 'シートのダブルクリックイベント Private Sub ws_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) MsgBox "DBL!" End Sub
次に共通モジュールで、このクラスの変数と、そこに各シートを格納する関数を用意します。
Module1
'ユーザークラスの配列 Public MySheets() As New clsWs '現在あるシートをユーザークラスに格納 Public Sub SetMySheets() ReDim MySheets(ThisWorkbook.Sheets.Count) Dim i As Integer 'ブック内の全シートをユーザークラスに格納する ⇒これでワークシートをダブルクリックしたときにclsWsのダブルクリックイベントが実行される For i = 1 To ThisWorkbook.Sheets.Count MySheets(i).MySheet = ThisWorkbook.Sheets(i) Next End Sub
このSetWorkSheets関数でclsWsに格納されたワークシートでダブルクリックすると、clsWsのダブルクリックイベントに記載した処理が実行されることになります。
必要ならブックを開いた時や、シートが追加されたタイミングでSetWorkSheets関数を実行するといいでしょう。
まずはがんばってみてください。
投稿2019/05/23 07:28
総合スコア3020
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/05/24 03:28
2019/05/30 05:05
2019/05/30 05:08
2019/05/30 05:10
2019/05/30 05:53
2019/06/05 04:37
2019/06/05 09:03 編集
2019/06/05 07:59