オンライン健康相談、gooドクター

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range)で、
セルA1をダブルクリックすると、プロシージャMacro1へとび、Macro1で所定の処理を行ったあと、もとのPrivate Sub Worksh
eet_BeforeDoubleClick(ByVal Target As Range)にもどします。

①Macro1で処理をしたあと、冒頭のPrivate Sub Worksheet_BeforeDoubleClick(ByVal Target As Range)に戻せない。

②Macro1の処理を終えないと、B1やC1のダブルクリックをしても無効としたい。

どのようにプログラムすれば宜しいでしょうか?

現状

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range)

Select Case Target.Address(False, False)

If Target.Address<>"A1"
Call Macro1
End If

If Target.Address<>"B1"←Macro1の処理が終わらないとダブルクリック無効としたい。
Call Macro2
End If

If Target.Address<>"C1"←Macro1の処理が終わらないとダブルクリック無効としたい。
Call Macro3
End If

EndSub
------------------------------------------------------------
Private Sub Macro1

MsgBox"AAA"←実際は別の処理。

Call ←冒頭のPrivate Sub Worksheet_BeforeDoubleClick(ByVal Target As Range) に戻したい。

この時、Callのあとはどのように記述すべきでしょうか?

そのまま、Call Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range) としても、Private Sub Worksheet_BeforeDoubleClick()としても、うまくいきません。

gooドクター

A 回答 (2件)

こんばんは。


なるべく単純に、ご質問を写してみました。
ただ、
If Target.Address<>"C1"
この部分は、適宜、変えてください。
もし、コードの一覧性が悪いのでしたら、Call されるマクロはシートモジュールでも構いません。myFlg をグローバル・スコープ変数やシート・スコープ変数にすればいいと思います。

'標準モジュール
Public myFlg As Variant

Sub Macro1()
 MsgBox "Execute Macro1"
End Sub
'--------
Sub Macro2()
 MsgBox "Execute Macro2"
End Sub
'--------
Sub Macro3()
 MsgBox "Execute Macro3"
End Sub

'シートモジュール
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
 Cancel = True
 If myFlg = False Then
  If Target.Address(0, 0) = "A1" Then
   Call Macro1
   myFlg = True
  End If
 Else
  If Target.Address(0, 0) = "B1" Then
   Call Macro2
  ElseIf Target.Address(0, 0) = "C1" Then
   Call Macro3
  End If
 End If
End Sub
    • good
    • 0

こんばんは!



どこか使っていないセルを使用し、フラグを立てる方法はどうでしょうか?

仮にZ1セルを利用する場合、
A1セルをダブルクリック → Macro1 の処理が終わった時点でZ1セルを「TRUE」とする。
B1・C1セルのダブルクリックはZ1セルが「TRUE」の場合のみ実行!
Macro2・Macro3を実行後のZ1セルは「FALSE」にする!

といった感じです。

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Intersect(Target, Range("A1:C1")) Is Nothing Then Exit Sub
Cancel = True
Select Case Target.Address(False, False)
Case "A1"
Call Macro1
Case "B1"
If Range("Z1") = True Then
Call Macro2
End If
Case Else
If Range("Z1") = True Then
Call Macro3
End If
End Select
End Sub

Private Sub Macro1()
'//Macro1の処理//
Range("Z1") = True
End Sub

Private Sub Macro2()
If Range("Z1") = True Then
'//Macro2の処理//
Range("Z1") = False
End If
End Sub

Private Sub Macro3()
If Range("Z1") = True Then
'//Macro3の処理//
Range("Z1") = False
End If
End Sub

こんな感じではどうでしょうか?m(_ _)m
    • good
    • 0
この回答へのお礼

目から鱗です。
Excelだからできる技ですね。
セルに値を入れるなんて発想は
無かったです。
ありがとうございます!

お礼日時:2017/08/27 22:07

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

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

gooドクター

人気Q&Aランキング