Excel VBAでボタン作成と再生

このQ&Aのポイント
  • ExcelシートのA列にWAVEファイルのフルパス名が書かれている状態で、このWAVEファイルを再生するボタンをC列に作成するVBAを作りたいです。
  • ただし、ボタンが押されたときに実行されるプロシージャに引数がない場合は、コード1のようにすれば実現できますが、引数がある場合にはエラーになります。
  • 引数がある場合でも、正しく記述する方法があれば教えてください。
回答を見る
  • ベストアンサー

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

質問者が選んだベストアンサー

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率65% (1620/2460)
回答No.1

.OnAction = "'WAVE_PLAY """ & wave_file_path & "" & "'" でいかがですか。 参考にしたサイト エクセルVBAのボタン設置で引数を渡してマクロを呼び出す方法 https://tonari-it.com/excel-vba-button-augument/

ID_20150222
質問者

お礼

教えていただきました方法でできました。 ありがとうございました。

関連するQ&A

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

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

    下は複数のエクセルファイルを一つにするマクロですが、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のVBAについてです。シート1と2を作成

    ExcelのVBAについてです。シート1と2を作成し、シート1にバーコードまたはキーボードで入力します。シート1は入力専用かつ入力した分の早見表で、実際にはシート2に転記仕訳して、シート3以降に表を作成したいです。使い方はシート1に入力またはシート2をタップまたはクリックすると入力(画面)になります。以前の質問の回答を参考に必要最低限に改良しています。パッと見で構いません、何か不具合は見付からないでしょうか? '///Sheet1/// Private Sub Worksheet_Change(ByVal Target As Excel.Range) Dim time7 As Range For Each time7 In Target If time7.Column = 1 Then time7.Offset(0, 4).Value = Format(Now, "Short Time") & vbCrLf & _ Format(Now, "yyyy/mm/dd hh:nn:ss AM/PM") End If Application.EnableEvents = False Application.EnableEvents = True Next time7 '(1)シートを変数にセット Dim ws1 As Worksheet Dim ws2 As Worksheet Set ws1 = Worksheets("Sheet1") Set ws2 = Worksheets("Sheet2") '(2)シートを指定してデータを転記 ws2.Range("A3:H3").Value = ws1.Range("A3:H3 ").Value End Sub Private Sub Worksheet_Activate() ' ' 新規行挿入 ' ' Worksheets("Sheet2").Range("3:3").Insert Sheets("Sheet1").Range("H3").Select ActiveCell.FormulaR1C1 = "5" Sheets("Sheet1").Range("E3").Select Selection.ClearContents Dim str_Left As String 'セルE4に文字列、セルH4に数字を予め入れておくこと。 str_Left = Left(Cells(4, 5), Cells(4, 8)) MsgBox str_Left & vbCrLf & " " & "OKボタンを押してください!" Sheets("Sheet1").Range("A3").Select Dim se_r As String se_r = Application.InputBox("バーコードを入力してください") Select Case se_r Case "False" MsgBox "キャンセルされました" Case "" MsgBox "空欄が入力されました" Case Else Range("A3").Value = se_r End Select End Sub ' ///Sheet2/// Private Sub Worksheet_Activate() Dim Emp(1 To 300) As String Dim msg As String Dim i, i2, Cnt As Integer Dim N_In As Variant For i = 3 To 3 If IsEmpty(Cells(i, 1).Value) = False Then 'ここで空欄判定 Worksheets("Sheet1").Range("3:3").Insert '対象セルアドレスを改行処理 End If '(1)シートを変数にセット Dim ws1 As Worksheet Dim ws2 As Worksheet Dim st1, s, i3 As Long Dim Bst As Range Set ws1 = Worksheets("Sheet1") Set ws2 = Worksheets("Sheet2") '(2)シートを指定してデータを転記 st1 = ws1.Cells(Rows.Count, "E").End(xlUp).Row 'A列の最終行を設定する s = 3 For i3 = 3 To st1 Set Bst = ws2.Columns("E").Find(What:=ws1.Cells(i3, "E"), LookIn:=xlFormulas, _ LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False) シート間のE列を比較 If Bst Is Nothing Then '比較して無い場合は、下記を実行 ws1.Cells(s, "A") = ws1.Cells(i3, "A") '追加する文字を転記する。(コード) s = s + 1 End If Next i3 Next i '(1)シートを変数にセット Dim ws1_ As Worksheet Set ws1_ = Worksheets("Sheet1") ws1_.Activate End Sub

  • 新たに作成したシートでunion関数が使えないのですが。

    困っています 例えば Option Explicit Sub sss() Dim allrange As Range Dim cell As Range Set allrange = Union(Range("A1"), Range("A3")) For Each cell In allrange cell = 123 Next cell End Sub '---------------------------------------------------------- Sub ssscr() Dim exlapp As Excel.Application Dim exlwb As Object Dim exlsh As Object Set exlapp = CreateObject("Excel.Application") exlapp.Visible = True Set exlwb = exlapp.Workbooks.Add Set exlsh = exlwb.Worksheets(1) Dim allrange As Range Dim cell As Range Dim rngA1 As Range Dim rngA3 As Range Set rngA1 = exlsh.Range("A1") Set rngA3 = exlsh.Range("A3") Set allrange = Union(rngA1, rngA3) For Each cell In allrange cell = 123 Next cell End Sub 最初のコードだとA1,A3に値が入力されるんですけど 二番目のコードだと新たに出来きたbookに入力されません。 unionのところでエラー起こります。 作成したブックのシートをセレクトしても入力できません。 作成したブックにunion関数を指定したときどうしたらよろしいでしょうか?

  • エクセルVBA 1つのシートで出来ますか?

    説明が下手で申し訳ございませんが、宜しくお願い致します。 sheet(1)に20個のボタンがあります。 ボタンをクリックすると、別のシートが開きます。 開いたシートにも複数のボタンがあり、そのうちの任意のボタンをクリックすると、そのボタンの値がsheet(1)のそれぞれのボタンに対応したセルに入力される、という動作を実現したいと思っています。 現状、下記のようなコードで目的の動作は実現できてはいるのですが、各ボタンそれぞれにシートを作っているような状況です。(データ自体は全く同じ内容のものが、計20シート) たぶん、もの凄く頭の悪い事をやっているんだろうと思います。 sheet(1)を除いた各シートの入力データ自体は全く同じなので、シート一枚で出来るんじゃないのかなと思い、ネットや本で調べながら色々試してみたのですが、どうも上手く行きません。データが同じでも、sheet(1)のクリックしたボタンによって入力するセルを変えなければならないのが問題です。 sheet(1)のボタンとセルの関連付けや、sheet(1)のどのボタンを押したのかの判別ができればいいのかなと思って調べてみても、初心者にはよく理解できず、もう何週間もチャレンジしているのですがお手上げです。 上級者の方の知恵をお借りできれば幸いです。 Sub sheet2を開く() Worksheets(2).Select End Sub Sub 入力1() Worksheets(1).Range("F8") = "データ1" Worksheets(1).Select End Sub Sub 入力2() Worksheets(1).Range("F8") = "データ2" Worksheets(1).Select End Sub Sub 入力3() Worksheets(1).Range("F8") = "データ3" Worksheets(1).Select End Sub Sub sheet3を開く() Worksheets(3).Select End Sub Sub 入力1() Worksheets(1).Range("H8") = "データ1" Worksheets(1).Select End Sub Sub 入力2() Worksheets(1).Range("H8") = "データ2" Worksheets(1).Select End Sub Sub 入力3() Worksheets(1).Range("H8") = "データ3" Worksheets(1).Select End Sub Sub sheet4を開く() Worksheets(3).Select End Sub Sub 入力1() Worksheets(1).Range("M8") = "データ1" Worksheets(1).Select End Sub Sub 入力2() Worksheets(1).Range("M8") = "データ2" Worksheets(1).Select End Sub Sub 入力3() Worksheets(1).Range("M8") = "データ3" Worksheets(1).Select End Sub    ・    ・    ・    ・    ・

  • エクセルのVBAに関する質問です。

    エクセルのVBAに関する質問です。 「指定フォルダ(ここではXXXX)内の全てのエクセルファイルを開き、内容を転記していく」 というマクロについての質問です。 ネットを参照し、以下のマクロを見つけました。 -------------------------------------------------------------------------- Sub Macro1() Dim theName As String Dim theDir As String Dim theBook As Workbook Dim flg As Boolean flg = True Application.ScreenUpdating = False theDir = ThisWorkbook.Path & "\XXXX" theName = Dir(theDir & "\*.xls") Do While theName <> "" Set theBook = Workbooks.Open(theDir & "\" & theName) Call subA(theBook, flg) flg = False theBook.Close theName = Dir Loop End Sub Sub subA(theBook As Workbook, flg As Boolean) Dim thetbl As Range, LRow As Long Set thetbl = theBook.Sheets(1).Range("A1").CurrentRegion thetbl.Copy With ThisWorkbook.ActiveSheet LRow = .Range("A65536").End(xlUp).Row If LRow = 1 Then .Range("A" & LRow).PasteSpecial xlPasteValues Else .Range("A" & LRow + 1).PasteSpecial xlPasteValues End If End With Application.CutCopyMode = False End Sub -------------------------------------------------------------------------- 実際にはこのマクロは上手く動作していますが、1つ疑問があります。 「一度開いたファイルは開かない」というのはどの部分のおかげか、ということです。 当方初心者で、分かりづらい質問かもしれませんが、どうぞご教授お願いいたします。

  • VBA シート指定とファイル名入力

    部署ごとに分割し、ブックで保存するコードです。 sheet名は「部署」です。 Sub macro1() Dim w As Worksheet Dim n As Long Dim r As Long Dim s As String Dim WSH As Variant Dim myPath As String Set w = ActiveSheet n = Worksheets.Count Application.ScreenUpdating = False On Error GoTo errhandle For r = 5 To w.Range("B65536").End(xlUp).Row s = w.Cells(r, "B") w.Rows(r).Copy Worksheets(s).Range("B65536").End(xlUp).Offset(1, -1) Next r On Error GoTo 0 Set WSH = CreateObject("Wscript.Shell") myPath = ActiveWorkbook.Path & "\1\" For r = Worksheets.Count To n + 1 Step -1 Worksheets(Worksheets.Count).Copy ActiveSheet.Columns.AutoFit ActiveWorkbook.SaveAs Filename:=myPath & ActiveSheet.Name ActiveWorkbook.Close False Application.DisplayAlerts = False Worksheets(Worksheets.Count).Delete Application.DisplayAlerts = True Next r w.Select Exit Sub errhandle: Worksheets.Add after:=Worksheets(Worksheets.Count) ActiveSheet.Name = s w.Rows(1).Copy Range("A1") w.Rows(2).Copy Range("A2") w.Rows(3).Copy Range("A3") w.Rows(4).Copy Range("A4") Resume Application.ScreenUpdating = True End Sub (1)sheet1にマクロ実行ボタンを配置し、部署seedにマクロ実行命令をする。 (2)sheet1のB2セルにファイル名を入力して、そのファイルに保存する。(例部署ファイル) (1)Dim w As Worksheets("部署")と変更したのですが、エラーが出ました。 (2)myPath = ActiveWorkbook.Path & "\部署ファイル\"   ↑ これをsheet1のB2セルから指定できるようにしたいです。 宜しくお願いします。

  • エクセル VBA シートの選択 

    windows XP でエクセル2000を使っています。 Sub aaa() Sheets("Sheet1").Select Dim a As String a = Cells(2, 4) Sheets(a).Select Range("A1").Select End Sub というマクロだと セルに入っている値のシート名を探してくれます。 ですが Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range) If Intersect(Target, Range("B11:b683")) Is Nothing Then Exit Sub Worksheets("Sheet1").Range("C2").Value = Target.Value Dim b As String b = Range("C2).value (←ここをcellsにしてもダメ) Sheets(b).Select Range("A1").Select End Sub これだとsheets(b)を選びません。Sheets(b).Selectのところが黄色くなります。 何処が間違えているのでしょうか。 全くの素人ですが、仕事で必要に迫られています。 わかりやすく回答・解説くれると助かります。

  • ExcelシートをCSVファイルにする

    Excel2000を使用してます。 Excelブックに3つのシートがあります。 シート1はメインシートとして「ボタン1」「ボタン2」が存在してます シート2はインプットデータ用シート シート3はアウトプットデータ用シートです シート1の「ボタン1」を押すとVBAが実行されシート2の情報を読み、 シート3に算出結果を出力する仕組みです。 次にシート1の「ボタン2」を押すとシート3の内容をCSVに出力したいのですが、 下記のロッジクではうまくいきません。 どこを修正すればよいのでしょうか? Sub CSV出力() Dim ONAME As String Dim しーと As Worksheet Dim 新しーと As Worksheet Dim PAS As String 'OUTパス名 PAS = ThisWorkbook.Path ONAME = PAS & "\" & "出力.CSV" '出力しーと Sheets("出力").Select Set しーと = ActiveSheet Set 新しーと = Worksheets.Add With 新しーと しーと.Copy .Move End With With ActiveWorkbook .SaveAs Filename:=ONAME, FileFormat:=xlCSV .Close False End With End Sub

  • エクセルVBAを教えて下さい

    エクセルの表で -AB C D E F 1年月--1801 2------ 3------ 4------ (-)は空欄でセルE1=18、F1=1とします。 コントロールボックスをつかって Private Sub Command登録_Click() Dim d1 As Long Dim d2 As Long Dim ret As Variant Dim FindValue As String Dim TotalAddress As String If Range("E1").Value = "" Or Range("F1").Value = "" Then MsgBox "該当する場所にデータが入っていません。", vbCritical Exit Sub End If d1 = Range("A65536").End(xlUp).Offset(1).Row d2 = Range("B65536").End(xlUp).Offset(1).Row FindValue = """" & Range("E1").Value & Range("F1").Value & """" TotalAddress = Range("A1").Resize(d1).Address & "&" & Range("B1").Resize(d1).Address ret = Evaluate("MATCH(" & FindValue & "," & TotalAddress & ",0)") If IsError(ret) Then Cells(d1, 1) = Range("E1").Value Cells(d2, 2) = Range("F1").Value Else MsgBox "既に同じ組み合せがあります。", vbInformation End If End Sub というものを作ったのですが、E1=18、F1=1及びコマンドボタンを別シートに作成し、上記の表への登録をできるようにしたいのですが、なにかいい方法はありませんか?

専門家に質問してみよう