何をいまさらダイアログシートなどとおっしゃらないで下さいませ。
今現在表示されているダイアログシートの名前を取得したいのです。
たとえばワークシート上にフォームのボタンを配置し、ボタンに以下のマクロを登録しておけば正しくシート名を返します。
Sub test01()
MsgBox ActiveSheet.Name '1
MsgBox ActiveSheet.Shapes(Application.Caller).Parent.Name '2
End Sub
ところが同じボタンをDialogsheetに配置し、そのダイアログを DialogSheets("Dialog1").Show で、ワークシート上に表示した段階でボタンをクリックすると、1.ではワークシート名が帰り、2ではシート名が違うのでエラーになってしまいます。
(ワークシートをアクティブにしないで、ダイアログシート上で右クリックして「ダイアログの実行」でダイアログを表示させれば1,2ともにDialog1とDialogSheet名を返しますが)
もちろん以下のようにDialogsheet名を明記すれば正しく返りますが、Application.Callerからダイアログシートの名前を取得したいのにDialogsheet名を明記するのでは無意味です。
Sub test02()
MsgBox ActiveSheet.Name '1
MsgBox DialogSheets("Dialog1").Shapes(Application.Caller).Parent.Name '2
End Sub
何か良い方法はないでしょうか?
現在はやむをえずダイアログを表示させる際、以下のように変数に格納していますが、これもApplication.Callerからダイアログシートの名前を取得するにはあまり意味がないように思います。
Dim DS
Sub D1_Start()
DS = "Dialog1"
DialogSheets("Dialog1").Show
End Sub
Sub test03()
MsgBox ActiveSheet.Name '1
MsgBox DialogSheets(DS).Shapes(Application.Caller).Parent.Name '2
End Sub
エクセル2000です。
宜しくお願いします。
古いやつだと、お笑いでしょうが・・(笑)
ありがとうございます!!
これでワークシートでもダイアログでも、たった一つのマクロで名前が取得できるようになり、そこから先の分岐ができるようになりました。
助かりました。
Sub test01()
Dim ds
On Error Resume Next
Set ds = ActiveDialog
On Error GoTo 0
If ds Is Nothing Then
MsgBox ActiveSheet.Shapes(Application.Caller).Parent.Name
Else
MsgBox ds.Shapes(Application.Caller).Parent.Name
End If
End Sub
お礼
古いやつだと、お笑いでしょうが・・(笑) ありがとうございます!! これでワークシートでもダイアログでも、たった一つのマクロで名前が取得できるようになり、そこから先の分岐ができるようになりました。 助かりました。 Sub test01() Dim ds On Error Resume Next Set ds = ActiveDialog On Error GoTo 0 If ds Is Nothing Then MsgBox ActiveSheet.Shapes(Application.Caller).Parent.Name Else MsgBox ds.Shapes(Application.Caller).Parent.Name End If End Sub