Excel シートにボタンを作成するVBA
ExcelシートのA列にWAVEファイルのフルパス名が書かれている状態で、
このWAVEファイルを再生するボタンをC列に作成するVBAを作りたいのですが、
ボタンが押されたときに実行されるプロシージャに引数がないときは、
コード1のようにすればできますが、
ボタンが押されたときに実行されるプロシージャに引数があるときは、
コード2のように記述してもエラーになりますが、
どのように記述すればよいのでしょうか。(Windows10,Excel2010)
'-----------------コード1------------------------------------------
Sub test()
Dim row As Integer
Dim wave_file_path As String
row = 1
wave_file_path = ThisWorkbook.Worksheets("Sheet1").Cells(row, 1).Value
Call 再生ボタン作成(row, wave_file_path)
End Sub
Sub 再生ボタン作成(ByVal row As Integer, ByVal wave_file_path As String)
Dim cell_loc As String
cell_loc = ThisWorkbook.Worksheets("Sheet1").Cells(row, 3).Address
ThisWorkbook.Worksheets("Sheet1").Select
With ActiveSheet.Buttons.Add(Range(cell_loc).Left, _
Range(cell_loc).Top, _
Range(cell_loc).Width, _
Range(cell_loc).Height)
.name = "ボタン_" & cell_loc
.OnAction = "WAVE_PLAY"
.Characters.Text = "再生"
End With
End Sub
Sub WAVE_PLAY()
Dim wave_file_path As String
wave_file_path = "Z:\Document\4_Data\CD_DVD_USB\USB_20200222\REC\JBP001\JBP00101.WAV"
If Dir(wave_file_path) = "" Then
MsgBox wave_file_path & vbCrLf & "がありません。", vbExclamation
Exit Sub
End If
Shell "C:\Program Files\Windows Media Player\wmplayer.exe /play /close " & wave_file_path
End Sub
'-------------------------------------------------------------------
'-------------------コード2----------------------------------------
Sub test()
Dim row As Integer
Dim wave_file_path As String
For row = 1 To 100
wave_file_path = ThisWorkbook.Worksheets("Sheet1").Cells(row, 1).Value
Call 再生ボタン作成(row, wave_file_path)
Next row
End Sub
Sub 再生ボタン作成(ByVal row As Integer, ByVal wave_file_path As String)
Dim cell_loc As String
cell_loc = ThisWorkbook.Worksheets("Sheet1").Cells(row, 3).Address
ThisWorkbook.Worksheets("Sheet1").Select
With ActiveSheet.Buttons.Add(Range(cell_loc).Left, _
Range(cell_loc).Top, _
Range(cell_loc).Width, _
Range(cell_loc).Height)
.name = "ボタン_" & cell_loc
.OnAction = "WAVE_PLAY " & wave_file_path ' <==== ◆ここでエラーになります◆
.Characters.Text = "再生"
End With
End Sub
Sub WAVE_PLAY(ByVal wave_file_path As String)
If Dir(wave_file_path) = "" Then
MsgBox wave_file_path & vbCrLf & "がありません。", vbExclamation
Exit Sub
End If
Shell "C:\Program Files\Windows Media Player\wmplayer.exe /play /close " & wave_file_path
End Sub
'-------------------------------------------------------------------
お礼
ご回答ありがとうございました。 仰るとおり、ユーザフォームを使用すべきですが、10年以上前に作られたプログラムの改修となり、時間もない為、ダイアログシートをそのまま使用することになりました。 ダイアログシートのままで実装できればいいのですが、無理ならば、残業覚悟でユーザフォームへの転換を考えることにします。
補足
申し訳ありません。 質問内容にて、重大な欠落がありました。 こちらにて、補足させて頂きます。 ボタンを無効にしたあとに、もう一度有効にしたいのです。 Sub Auto_Open() ThisWorkbooks.Dialogsheets(シート名).Show() '…(1) End Sub Sub Button1_Click() 'ボタン押下時に呼ばれる ThisWorkbooks.Dialogsheets(シート名).Buttons(ボタン名).Enabled = False '…(2) 'この部分で処理を行う。 ThisWorkbooks.Dialogsheets(シート名).Buttons(ボタン名).Enabled = True End Sub 宜しくお願い致します。