• 締切済み

Excel VBA 引数が2個のマクロの呼び出し方

ExcelのVBAで、 シート上のボタンがクリックされた時に呼び出す マクロ(プロシージャ)の引数が1個の時は、 コード1のようにできましたが、 引数が2個ある時は、コード2のように記述しても、 ボタンをクリックするとエラーになりますが、 【?】の部分をどのように記述すればよいのでしょうか。 (Windows10,Excel2010) -------------------コード1---------------------------------------- Sub test1()  Dim row As Integer  Dim wave_file_path As String  For row = 1 To 2   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 ------------------------------------------------------------------- -------------------コード2---------------------------------------- Sub test2()  Dim row As Integer  Dim wave_file_path As String  For row = 1 To 2   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 & "" & "," & row & "'" <==【?】   .Characters.Text = "再生"  End With End Sub Sub WAVE_PLAY(ByVal wave_file_path As String, ByVal row As Integer)  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  ThisWorkbook.Worksheets("Sheet1").Cells(row, 4).Value = "再生済" End Sub -------------------------------------------------------------------

みんなの回答

  • kkkkkm
  • ベストアンサー率66% (1719/2589)
回答No.4

> こちらでなぜエラーになるのか原因が分からないので いま思ったのですが、 引数が1個の時は Sub WAVE_PLAY(ByVal wave_file_path As String) で実行 引数が2個の時には Sub WAVE_PLAY(ByVal wave_file_path As String, ByVal row As Integer) で実行 のように切り替えていますよね。 2個の時に1個のWAVE_PLAYになっているとマクロが実行できないというエラーになります。

  • kkkkkm
  • ベストアンサー率66% (1719/2589)
回答No.3

WAVE_PLAYが標準モジュールに複数あるとそのエラーが出ますが、引数を1個にしたら出ないのであれば該当しないみたいですね。 こちらでは、Windows Media Playerでの再生も含め最後の"再生済"の記載まで実行できます。 マクロの登録で表示されるのは 音楽を鳴らすボタン.xlsm!'WAVE_PLAY "C:\Ok\uui.wma",1' 'WAVE_PLAY "C:\test\no1.WAV",1' をそのままコピペして 音楽を鳴らすボタン.xlsm!'WAVE_PLAY "C:\test\no1.WAV",1' としたボタンで実行したら(上記のファイルはありません) WAVE_PLAY内の MsgBox wave_file_path & vbCrLf & "がありません。", vbExclamation が実行されましたので、該当のエラーになっていないと思います。

ID_20150222
質問者

お礼

そちらでは正しく動作しているということですね。 こちらでなぜエラーになるのか原因が分からないので 別の方法で検討してみます。 ありがとうございました。

  • kkkkkm
  • ベストアンサー率66% (1719/2589)
回答No.2

> このブックでマクロが使用できないか、またはすべてのマクロが無効になっている可能性があります。 多分ボタンのマクロの所が「ファイル名!'WAVE_PLAY 引数」になっていると思いますので、標準モジュールでWAVE_PLAYを実行していないと上記のエラーになります。 私も、フォームのボタンのマクロは指定しないと標準モジュールのコードになるのを忘れてて、コードをシートモジュールに全てコピペして実行したらこのエラーが出ました。

ID_20150222
質問者

お礼

回答ありがとうございます。 そちらではエラーはでていないということですね。 生成されたボタンを右クリックのマクロの登録で表示されるマクロ名は、 test.xlsm!'WAVE_PLAY "C:\test\no1.WAV",1' となっていました。 コードは標準モジュールに書いています。 また、引数を1個に戻すと正しく実行されます。 その後、2個にするとエラーになります。 何かわかりましたら、 よろしくお願いします。

  • kkkkkm
  • ベストアンサー率66% (1719/2589)
回答No.1

これにしてください。 .OnAction = "'WAVE_PLAY """ & wave_file_path & """" & "," & row & "'" 前回の回答にミスがあっのでそれが原因ですみません。前回も以下が正解です。 .OnAction = "'WAVE_PLAY """ & wave_file_path & """" & "'"

ID_20150222
質問者

お礼

回答ありがとうございます。 前回の .OnAction = "'WAVE_PLAY """ & wave_file_path & "" & "'" でも正しく動いていましたので気付きませんでした。 Debug.Printで出力すると 'WAVE_PLAY "C:\test\no1.WAV' となっています。 .OnAction = "'WAVE_PLAY """ & wave_file_path & """" & "'" とすると、 'WAVE_PLAY "C:\test\no1.WAV"' となりましたので後者の方が正しいことが確認できました。 今回の .OnAction = "'WAVE_PLAY """ & wave_file_path & """" & "," & row & "'" ですが、うまくいきませんでした。 Debug.Printで出力すると 'WAVE_PLAY "C:\test\no1.WAV",1' となっています。 ボタンをクリックしたときに出るエラーは最初の時と同じ内容のエラーで、 マクロ 'test.xlsm!'WAVE_PLAY "WAVE_PLAY "C:\test\no1.WAV",1''を実行できません。 このブックでマクロが使用できないか、またはすべてのマクロが無効になっている可能性があります。 というダイアログが表示されます。 そちらでは正しくWindows Media Playerが起動されるのでしょうか。 .OnAction = "'WAVE_PLAY """ & wave_file_path & """" & ",""" & row & """'" でもやってみましたが同じ結果になります。 Debug.Printは、 'WAVE_PLAY "C:\test\no1.WAV","1"' となっています。 何かわかりますでしょうか。 よろしくお願いします。