• 締切済み

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
  • ベストアンサー率65% (1597/2433)
回答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
  • ベストアンサー率65% (1597/2433)
回答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
  • ベストアンサー率65% (1597/2433)
回答No.2

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

ID_20150222
質問者

お礼

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

  • kkkkkm
  • ベストアンサー率65% (1597/2433)
回答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"' となっています。 何かわかりますでしょうか。 よろしくお願いします。

関連するQ&A

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

  • エクセルVBA イベントプロシージャに引数を渡せま

    お世話になります。 エクセル2003/XP 使用です。 イベントプロシージャに引数を渡せまるかどうか教えていただけますでしょうか? 下記のコード中の変数mysheetnameを ユーザーフォーム、→ CommandButton1のプロシージャに 引数として渡して行きたいのですが、 実行すると、一番最初のWorkbook_SheetBeforeRightClickの時点で、 コンパイルエラー:  プロシージャの宣言が、イベントまたはプロシージャの定義と一致していません。 とエラー表示されます。 イベントプロシージャに引数を渡すことはできますでしょうか? ---------- ThisWorkBook内 ---------- Public mysheetname As String Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean) mysheetname = ActiveSheet.Name UserForm1.Show (mysheetname)     '←変数mysheetnameの値をユーザーフォームに渡したい。 End Sub ---------- ユーザーフォーム ---------- Private Sub UserForm_Initialize(ByVal mysheetname As String ) 処理 End Sub Private Sub CommandButton1_Click(ByVal mysheetname As String ) 処理 End Sub ’--------- ここまで 引数について少し理解し始めたばかりの者です。 よろしくお願いします。

  • Excelでシート名と最終更新日を自動表示したい

    Excelを使って (1)セルA1に入れた名目をシート名にし (2)セルH1には、最終更新日を自動で入れたいです。 調べた結果、 シート名を右クリックして「コードの表示」から (1)は Private Sub Worksheet_Change(ByVal Target As Range) Sheets(1).Name = Range("B1") End Sub を入れてうまくいきましたが、 (2)は Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)  If ThisWorkbook.Saved = False Then   Worksheets("Sheet1").Range("H1").Value = Date  End If End Sub を入れてみましたが(←調べましたもの) うまくいきませんでした。 単純に、 Private Sub Worksheet_Change(ByVal Target As Range) Sheets(1).Name = Range("B1") End Sub Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)  If ThisWorkbook.Saved = False Then   Worksheets("Sheet1").Range("H1").Value = Date  End If End Sub とつなげて入れるのではだめなんでしょうか? それとも、(2)の何かが間違っていますか? ご教授願います。

  • Excel  VBAのマクロについて

    以下のようなマクロを作りました。 P4に開始番号P6に終わりの番号があるのですが、P4=P6、つまり、一つだけのシートを作成する分には問題なく動きます。しかしP4に1、P6に5と範囲を増やすとエラーが出て動きません。どこをなおしたらよろしいでしょうか? Option Explicit Sub 一括() Dim I As Worksheet Dim SheetName As String Dim Prompt As String Dim Col As Integer Dim Cell As Range Dim Row As Long Dim hani As Long For hani = Range("P4").Value To Range("P6").Value Set I = ActiveSheet SheetName = Cells(hani + 4, "K").Value & "(" & Cells(hani + 4, "B") & ")" Prompt = SheetName & "が存在します。" Sheets("基本シート").Copy After:=Sheets("基本シート") On Error GoTo 100 ActiveSheet.Name = SheetName On Error GoTo 0 Range("X3") = I.Cells(hani + 4, "B") Range("E8") = I.Cells(hani + 4, "C") Range("A13") = I.Cells(hani + 4, "D") For Col = 0 To 8 Step 4 Set Cell = I.Cells(hani + 4, "D").Offset(, Col) If Cell > 0 Then Prompt = "該当する日付がありません。" & Cell.Address On Error GoTo 100 Row = WorksheetFunction.Match(Cell, [A:A], 0) On Error GoTo 0 Cells(Row, "E") = I.Cells(hani + 4, "E").Offset(, Col) Cells(Row, "H") = I.Cells(hani + 4, "F").Offset(, Col) If Col < 8 Then Cells(Row, "Y") = I.Cells(hani + 4, "G").Offset(, Col) End If End If Next Col Next hani End 100 If Err <> 1004 Then Error Err End End If MsgBox Prompt, vbCritical Application.DisplayAlerts = False ActiveSheet.Delete Application.DisplayAlerts = True Sheets(1).Select End Sub

  • EXCEL マクロ につきまして

    お世話になっております。 以前、同様の質問をさせていただきまして、 その拡張バージョンをつくりたいと考えております。 Sub macro1() Dim myPath As String Dim myFile As String Dim c As Long Dim LastRowr As Long Application.ScreenUpdating = False myPath = ThisWorkbook.Path & "\" myFile = Dir(myPath & "*.xls") c = 6 Do Until myFile = "" If myFile <> ThisWorkbook.Name Then Workbooks.Open Filename:=myPath & myFile lastrow = Worksheets("特定のシート").Range("A65536").Row ThisWorkbook.Worksheets(2).Cells(1, c).Resize(lastrow, 1).Value = Worksheets("特定のシート").Range("H1").Resize(lastrow, 1).Value Workbooks(myFile).Close False c = c + 1 End If myFile = Dir() Loop Application.ScreenUpdating = True On Error Resume Next ActiveSheet.Name = Format(Date, "mmdd") On Error GoTo 0 End Sub こちらは"特定のシート"の特定の列(H)のみをひたすらフォーマットに 貼り付けていくものですが、コピペしたい列が増えた場合(数は一定ではない) のバージョンができればと思っております。 正直まったくわかりません。 1)データが何列あるかは不定 2)行1~3には自動的に何らかのデータが振られてしまっており(連番等)  データの終わりとして使えそうなのは、行4に「0」が入っていること  (但し0は非表示にしております) "特定のシート"名・データがH列から始まる等は変わりません。 現状の記述を改修、もしくは全とっかえでも構いません。 なにとぞよろしくお願い致します。

  • エクセルVBAでConsolidate

    以下は、ネット検索で見つけたサンプルコードです。 同じフォルダ内の全ブックのSheet1のA1:B10をThisWorkbookのSheet1に統合しています。 Sub test2() Dim MyFile As String, MyPath As String Dim SumFile() As Variant, i As Long MyPath = ThisWorkbook.Path & "\" MyFile = Dir(MyPath, vbNormal) Do Until MyFile = "" If MyFile <> ThisWorkbook.Name Then ReDim Preserve SumFile(i) 'A1からB10の値を変数に代入 SumFile(i) = "'" & MyPath & "[" & MyFile & "]Sheet1'!R1C1:R10C2" i = i + 1 End If MyFile = Dir Loop If i = 0 Then MsgBox "データが有りません": Exit Sub Worksheets("Sheet1").Range("A1").Consolidate Sources:=SumFile() End Sub 質問1 Sheet1だけでなく全シートのA1:B10をThisWorkbookのSheet1に統合するためにはどう書き換えればよいのでしょうか? 質問2 上記コードではなぜ、ブックを開かずにデータがとれるのでしょうか?

  • 複数のエクセルシートをまとめるマクロ

    下は複数のエクセルファイルを一つにするマクロですが、100万件を超えるためcsvで保存するようにするにはどこを変更したらよいでしょうか。 よろしくお願いします。 Sub Sample() Dim t As Single Dim strPath As String Dim strFileName As String Dim WB1 As Workbook Dim WS1 As Worksheet Dim WS2 As Worksheet Dim lngRowCount As Long 'A列に値が入っているデータ数 t = Timer 'まとめたいシート Set WS2 = ThisWorkbook.Worksheets(1) strPath = ThisWorkbook.Path strFileName = Dir(strPath & "\*.xls*") Do While strFileName <> "" If strFileName <> ThisWorkbook.Name Then Set WB1 = Workbooks.Open(strPath & "\" & strFileName) Set WS1 = WB1.Worksheets(1) With WS1.Range("A1") lngRowCount = .Worksheet.Cells(.Worksheet.Rows.Count, .Column).End(xlUp).Row - .Row If lngRowCount >= 1 Then With .Resize(lngRowCount, 14).Offset(1) .Copy WS2.Range("A" & WS2.Rows.Count).End(xlUp).Offset(1) End With End If End With WB1.Close False End If strFileName = Dir Loop MsgBox "まとめ処理をしました。処理時間 " & Format((Timer - t) / 60 / 60 / 24, "h:mm:ss") End Sub

  • excelのifステートメントのテストで…

    御観覧ありがとうございます。 スパテクという本を買って、excelを勉強しようと、 サンプルを打ち込んでいて、何度かエラーになったりしましたが、 調べることや、入力ミスの確認で回避出来ていたのですが、 本通りに打っているのに、 「エラー438、オブジェクトは、このプロパティまたはメソッドをサポートしてません。」 と出ます。 エクセル2007です。入力したプロシージャは、 Option Explicit Dim nSample1_12 As Integer Sub Sample1_12() nSample1_12 = nSample1_12 + 1 ThisWorkbook.Worksheets("sheet1").Range("A1") = nSample1_12 End Sub Sub Sample1_13() Dim sA2 As String sA2 = ThisWorkbook.Worksheets("sheet1").Range("A2") If sA2 = "" Then ThisWorkbook.Worksheets("sheet1").Renge("A2") = "Sample1_13" ElseIf sA2 = "Sample1_13" Then ThisWorkbook.Worksheets("sheet1").Range("A2") = "基本の文法 ifステートメント" Else ThisWorkbook.Worksheets("sheet1").Range("A2") = "" End If End Sub このサンプル13を実行すると、A2にsample1_13と出るはずなそうなんですが…エラーになります。

  • VBAマクロがうまく動きません

    こんにちは。いつもお世話になっております。 掲題の通りなのですが、下記のマクロを作り、 あるブック(毎回異なります)の全シート(毎回名前も数も異なります) に対して、同じ作業をしてほしいのですが、 1シート目で止まってしまいます。 特にエラー表示も出ないので、何が違っているのか わからず、どのように修正をしたらよいか、ご教示いただければ 幸いです。 エクセル2010を使用、パーソナルブックにマクロ登録しています。 Sub Test() Dim i As Integer ' 現在のブックのシート数を取得 For i = 1 To ThisWorkbook.Worksheets.Count '保護解除 Worksheets(i).Unprotect Password:="" '非表示列を表示 Worksheets(i).Columns.Hidden = False 'A列挿入数式コピー、オートフィル Worksheets(i).Columns(1).Insert Range("A12") = "=B12&C12" Range("A12").AutoFill Destination:=Range("A12:A" & Range("D" & Cells.Rows.Count).End(xlUp).Row), Type:=xlFillCopy Next i End Sub よろしくお願い致します。

  • EXCELマクロでのシート間のデータ同期方法

    質問させていただきます。 EXCELにて、"シート1"のA1~C3と"シート2"のD4~F6を 同期化したく考えております。 ・いわゆる一方のシートが「読み取り専用」になってしまうリンク貼り付けではなく、シート1、シート2相互が書き換え可能の同期化です。 ・A1とD4、B3とE6、のように互いに照合箇所のセル同士を同期反映させたいと考えております。 なお、他の質問を参照したところ、 シート1のA1とシート2のD4の単一セルを同期かする方法は確認できました。(以下参照) ***************************************************************** シート1のコードは Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$A$1" Then Worksheets("シート2").Range("D4") = Target End If End Sub シート2のコードは Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$D$4" Then Worksheets("シート1").Range("A1") = Target End If End Sub *************************************************************** これを参考にVBAの シート1のコードエディターに Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$A$2" Then Worksheets("シート2").Range("D5") = Target End If End Sub シート2のコードエディターに Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$D$5" Then Worksheets("シート2").Range("A2") = Target End If End Sub というように追記していったのですが、エラーとなってしまいます。 お詳しい方がおられましたらお願いいたします。

専門家に質問してみよう