こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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
-------------------------------------------------------------------

投稿日時 - 2020-03-01 17:14:20

QNo.9718556

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.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になっているとマクロが実行できないというエラーになります。

投稿日時 - 2020-03-16 15:05:58

ANo.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
が実行されましたので、該当のエラーになっていないと思います。

投稿日時 - 2020-03-02 20:43:07

お礼

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

投稿日時 - 2020-03-16 10:03:19

ANo.2

> このブックでマクロが使用できないか、またはすべてのマクロが無効になっている可能性があります。

多分ボタンのマクロの所が「ファイル名!'WAVE_PLAY 引数」になっていると思いますので、標準モジュールでWAVE_PLAYを実行していないと上記のエラーになります。

私も、フォームのボタンのマクロは指定しないと標準モジュールのコードになるのを忘れてて、コードをシートモジュールに全てコピペして実行したらこのエラーが出ました。

投稿日時 - 2020-03-01 22:49:39

お礼

回答ありがとうございます。

そちらではエラーはでていないということですね。

生成されたボタンを右クリックのマクロの登録で表示されるマクロ名は、
test.xlsm!'WAVE_PLAY "C:\test\no1.WAV",1'
となっていました。

コードは標準モジュールに書いています。

また、引数を1個に戻すと正しく実行されます。
その後、2個にするとエラーになります。

何かわかりましたら、
よろしくお願いします。

投稿日時 - 2020-03-02 20:03:44

ANo.1

これにしてください。
.OnAction = "'WAVE_PLAY """ & wave_file_path & """" & "," & row & "'"

前回の回答にミスがあっのでそれが原因ですみません。前回も以下が正解です。

.OnAction = "'WAVE_PLAY """ & wave_file_path & """" & "'"

投稿日時 - 2020-03-01 18:20:40

お礼

回答ありがとうございます。

前回の
.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"'
となっています。
何かわかりますでしょうか。

よろしくお願いします。

投稿日時 - 2020-03-01 20:12:46

あなたにオススメの質問