teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

コード例追加

2019/05/23 13:37

投稿

hatena19
hatena19

スコア34367

answer CHANGED
@@ -19,14 +19,75 @@
19
19
  Set rng = ActiveCell
20
20
 
21
21
  MsgBox sh.Name & "シートの" & rng.Address(False, False) & "セルをダブルクリックしました。"
22
-
22
+ '実際には sh と rng を使った処理を記述
23
23
  End Sub
24
24
  ```
25
25
 
26
- シートのモジュール
26
+ ダブルクリックで処理を実行したいシートのモジュール
27
27
 
28
28
  ```vba
29
29
  Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
30
30
  Call CellDoubleClick
31
31
  End Sub
32
+ ```
33
+
34
+ ---
35
+ クラスモジュールを使う場合
36
+
37
+ シートが動的に追加されたり、削除されたりする場合で、追加されたシートにもダブルクリックでイベント処理したい場合は、クラスモジュールにするメリットもでてきます。
38
+
39
+ その場合は、Collection にクラスを格納するようすると、自由に追加、削除できます。
40
+
41
+ クラスモジュール clsWs
42
+ ```vba
43
+ Option Explicit
44
+
45
+ Private WithEvents ws As Excel.Worksheet
46
+
47
+ Public Property Let MySheet(ByVal c As Excel.Worksheet)
48
+ Set ws = c
49
+ End Property
50
+
51
+ 'シートのダブルクリックイベント
52
+ Private Sub ws_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
53
+ Dim Sh As Worksheet
54
+ Dim rng As Range
55
+
56
+ Set Sh = ActiveSheet
57
+ Set rng = ActiveCell 'Target でもOK
58
+
59
+ MsgBox Sh.Name & "シートの" & rng.Address(False, False) & "セルをダブルクリックしました。"
60
+ '実際には sh と rng を使った処理を記述
61
+ End Sub
62
+ ```
63
+
64
+ ThisWorkbook モジュール
65
+ ```vba
66
+ Option Explicit
67
+ Public MySheets As Collection
68
+ 'ブックを開く時
69
+ Private Sub Workbook_Open()
70
+ Dim cWs As clsWs
71
+ Dim i As Long
72
+
73
+ Set MySheets = New Collection
74
+ For i = 1 To ThisWorkbook.Worksheets.Count
75
+ Set cWs = New clsWs
76
+ cWs.MySheet = ThisWorkbook.Worksheets(i)
77
+ MySheets.Add cWs, ThisWorkbook.Worksheets(i).CodeName
78
+ Next
79
+
80
+ End Sub
81
+ 'シートの追加時
82
+ Private Sub Workbook_NewSheet(ByVal Sh As Object)
83
+ Dim cWs As clsWs
84
+ Set cWs = New clsWs
85
+ cWs.MySheet = Sh
86
+ MySheets.Add cWs, Sh.CodeName
87
+ End Sub
88
+ 'シートの削除前
89
+ Private Sub Workbook_SheetBeforeDelete(ByVal Sh As Object)
90
+ MySheets(Sh.CodeName).MySheet = Nothing
91
+ MySheets.Remove Sh.CodeName
92
+ End Sub
32
93
  ```