• 締切済み

エクセルVBA:全部のコマンドボタンに反映させる方法。

エクセルVBA:全部のコマンドボタンに反映させる方法。 コマンドボタンにVBAを記述してフォルダを開いたり、 ブラウザを立ち上げたりしています。 現在の状態ですと、 そのコマンドボタン毎にwithの記述をしています。 ボタンが十個ある場合、↓の文を10回書いています。 Dim ooo as worksheet set ooo = Thisworkbook.worksheets("test") with ooo ***中身の記述 end with これを10回かかずに、1回どこかに記述するだけで 全てのボタンに反映させる方法はありませんか? public sub で記入して callで呼び出しても end with で終わってしまうため、 .cell(*.*)が使えなくて困っています・・・ 宜しくお願いします。

みんなの回答

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.6

あくまでも、一般論ですが、最近、OkWaveで同じパターンの質問が増えてきたようですが、それで、質問が成立するのか、私には分からなくなってきました。何か典型的な質問パターンなので、少し様子を見させていただいています。 >Dim ooo as worksheet >set ooo = Thisworkbook.worksheets("test") >with ooo > >***中身の記述 end with >.cell(*.*)が使えなくて困っています・・・  カッコの中は、,(カンマ)であるのはいいとしても、実際の問題は何なのか良く分からないのです。使えないって、 With Worksheets("Test")  MsgBox .Cells(1,1).Value End With で問題があるわけないし、まさか、こんなことで、Public じゃなくて、グローバル変数や変数をモジュールスコープにしてやる必要なんて、よほど凝ったコード(または、バカの一つ覚え)でなくてはしませんね。 Public objSh As Worksheet Sub Test1() Set objSh = ThisWorkbook.Worksheets("Test")  Call Test2 Set objSh = Nothing End Sub Sub Test2()  MsgBox objSh.Cells(1,1).Value End Sub こういうのは、間が抜けています。人にもよりますが、通常、こうしたオブジェクトをグローバル化しないはずです。 Sub Test1R()  Worksheets("Test").Select  Call Test2 End Sub Sub Test2R()  MsgBox Cells(1,1).Value End Sub 単に、こうすればよいだけです。 そもそも、こんなコードなら、Call するか、ということを突っ込まれてしまいます。 Test2Rは、エラーが発生するというのは、少し、認識不足で、それは、モジュールの問題です。標準モジュールを使うということで良いわけです。 おそらく、ここの質問者の質問パターンとしては、自分が認めるコード以上は内容をみせないだろうから、こんな所しか言えません。OkWaveの回答者をみれば、半分以上は、素人コードを出しているのだから、必要以上に隠す必要はないとは思うのです。中には、他人のコードでエラー回避さえ、気に入らないという人たちもいるのですから、その回答者の実力は何をかいわんやというところです。 しかしながら、よかったら、全体の見せられるところ、エラーが出る所ぐらいは見せてほしいものです。 でも、本質的に、こんな問題ではないと思うのです。 >これを10回かかずに、1回どこかに記述するだけで >全てのボタンに反映させる方法はありませんか? たぶん、コード全体を見れば、教えることは出来るだろうと思います。しかし、それは、ご質問者さんからしたら、遥か上の技術という可能性があるということだと思うのです。それさえも、ちょっとした技術の応用で、簡単にクリアする可能性もあります。とはいえ、たかだか、数十行を省略したところで、この場合は、全体には変化ないだろうから、現状の技術で可能なら、それはそれとして使う方法もアリだと思うのです。高望みしても、高値の花ということもありますしね。

全文を見る
すると、全ての回答が全文表示されます。
  • myRange
  • ベストアンサー率71% (339/472)
回答No.5

ちょと分かりにくい質問であることは確かです。。。(^^;;; >全てのプロシージャに > Dim ooo as worksheet > set ooo = Thisworkbook.worksheets("test") > with ooo > end with >を反映させたいです。 これは、10個のボタンにはそれぞれの機能があるが、 上記の部分は共通しているのでひとつにしたい ということですか? ですね? であれば、質問者の試した、 >public sub で記入して、callで呼び出し でいいと思うのですが、 >end with で終わってしまうため、 >.cell(*.*)が使えなくて困っています・・・ これ、具体例が挙げてないのでよく分かりません。 この部分をも少し具体的に補足してみたらどうでしょう。 共通部分を共通部分というプロシージャにして。。。 下記は全てボタンの配置してあるシートのシートモジュールに書く。 '-------------------------------- Private Sub 共通部分()   Dim ooo As Worksheet   Set ooo = ThisWorkbook.Worksheets("test")   With ooo     *************   End With End Sub '---------------------------------------- '---------------------------------------- Private Sub CommandButton1_Click()   Call 共通部分   ボタン【1】の固有コード End Sub '--------------------------------- Private Sub CommandButton2_Click()   Call 共通部分   ボタン【2】の固有コード End Sub '---------------------------------    ●以下同様。。。。 '--------------------------------- 但し、共有する変数はモジュール変数にするか、 Callするときの引数にすること。 以上です。  

全文を見る
すると、全ての回答が全文表示されます。
  • nag0720
  • ベストアンサー率58% (1093/1860)
回答No.4

Dim ooo as worksheet set ooo = Thisworkbook.worksheets("test") with ooo end with この4行をコマンドボタン毎に書いているのでなんとかしたいということでしょうか。 たった4行ぐらい全部のコマンドボタンに書いてもたいしたことはないと思うのですが。 どうしてもまとめたいのであれば、 プロシージャを1つにまとめて、各コマンドボタンからそれを呼ぶという方法ではどうですか。 ただ、各ボタンの処理が長いとかえって分かりにくくなります。 こんなことするよりは、ボタンごとに記述したほうが分かりやすいでしょう。 ステップ数の多さよりも読みやすさを重視したほうがいいですよ。 Sub ボタン1_Click() Call ボタン処理(1) End Sub Sub ボタン2_Click() Call ボタン処理(2) End Sub Sub ボタン処理(n As Integer) Dim ooo as worksheet set ooo = Thisworkbook.worksheets("test") with ooo  Select Case n  Case 1   ボタン1の処理  Case 2   ボタン2の処理  Case 3   ・・・・  End Select end with End Sub

全文を見る
すると、全ての回答が全文表示されます。
  • aloha886i
  • ベストアンサー率19% (22/113)
回答No.3

ナニをやっているのかよくわかりません 各コマンドボタンで実行するコードに シートを指定してやる処理があるという事でしょうか? シート名を変数に格納する動作はたとえばBookOPENイベントで行うとか、 対象となるシート名が確定した時点でそれを行えばいいのです End Withでひっかかるとありますが エラーメッセージには何とありますか? With ~ End With 無いのコードでIf文を使っていませんか? End Ifを忘れるとそうなりますよ!

全文を見る
すると、全ての回答が全文表示されます。
  • aloha886i
  • ベストアンサー率19% (22/113)
回答No.2

Public変数にしやればいいんでないの?

noname#115914
質問者

補足

具体的にはどうすればいいのですか? どうしても end with でひっかかってしまいます・・・

全文を見る
すると、全ての回答が全文表示されます。
  • aloha886i
  • ベストアンサー率19% (22/113)
回答No.1

?? 言っている意味がよくわかりません

noname#115914
質問者

お礼

もう一つ補足をさせてください。 言葉の使い方が間違ってるかもしれませんが、 全てのプロシージャに Dim ooo as worksheet set ooo = Thisworkbook.worksheets("test") with ooo end with を反映させたいです。 宜しくお願いします。

noname#115914
質問者

補足

Dim ooo as worksheet set ooo = Thisworkbook.worksheets("test") with ooo end with の記述を現状はコマンドボタン毎に記述しています。 これを簡略化したいのですが方法はありませんか?

全文を見る
すると、全ての回答が全文表示されます。

関連する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 '-------------------------------------------------------------------

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

  • EXCELのVBAについて教えてください。

    演習1というシートの(1,1)のセルの値と(1,2)のセルの値を入れ替えるプログラムを作成したいので すがエラーが出て出来ません。コードは下記の様に書きました。 Sub 演習1() Dim sheetobj As Worksheet Dim a As Integer Set sheetobj = ThisWorkbook.Worksheets("演習1") With sheetobj a = .Cells(1, 1) .Cells(1, 1) = .Cells(1, 2) .Cells(1, 2) = a End With End Sub プログラミング自体が本を読んでも分かりません。 宜しければ小学生に教えるように文を訳してくれませんか?

  • エクセルのVBAの記述について

    VBAの記述についてなのですが、 Sub filter() Dim gyo As Long Dim ws1 As Worksheet Dim ws2 As Worksheet Dim ws3 As Worksheet Set ws1 = Worksheets("データ") Set ws2 = Worksheets("チーム") Application.ScreenUpdating = False ws2.Range("A4:BH30").Clear gyo = ws1.Range("A65536").End(xlUp).Row ws1.Activate With ws1.Range(Cells(4, 1), Cells(gyo, 6)) .AutoFilter Field:=1, Criteria1:="A" .SpecialCells(xlCellTypeVisible).Copy ws2.Range("A4") Selection.AutoFilter End With Application.ScreenUpdating = True End Sub ならプログラムははしるのですが、 14行目を .SpecialCells(xlCellTypeVisible).Copy ws2.Range(Cells(4, 1)) だと 「実行時エラー 1004 Rangeメソッドは失敗しました Worksheet オブジェクト」 とでるのですが、出来ないのでしょうか? Cells(4, 1)の1のところを変数にして変えていきたいのですが、よい方法はありますか。 よろしくお願いいたします。

  • Excel VBA コマンドボタン

    質問させて頂きます。 現在コマンドボタンを作成したいと考えているのですがツールボックスからでは無く、コーディングで作ろうと考えています。 現在は下記のコードでコマンドボタンの作成までは出来たのですが + コマンドボタンの背景色/フォントカラー/フォントサイズの調整も加えたいと思っています。 下記のコードに上記要望を可能にする為にはどのようなコードを記述すれば宜しいでしょうか? よろしくお願いします。 With ActiveSheet.Buttons.Add(省略しました) .Name = "" .Caption = "" .OnAction = "" End With

  • エクセルVBAでFor each文

    下記のようなコードを書きたいのですが「オブジェクトが必要です」というエラーが 出力されてしまいできないようです。何か代替案はありますでしょうか。 --- dim ws as worksheet with thisworkbook for each ws in array(.worksheets(1),.worksheets(2),.worksheets(3)) with ws 'ここに処理を書く end with next ws end with --- ちなみにこのbookにある全てワークシートで処理を回したいわけではなく 特定のシートのみで処理をしたいです。 エクセル2003です。 よろしくお願いします。

  • Excel VBA With ~ End With

    Excel VBA With ~ End Withを使わずに記述するには Sheet1シートのセルA1,A2,B1,B2にA,B,75,25の値を入力して、 Sub test1()  With ThisWorkbook.Worksheets("Sheet1").Shapes.AddChart.Chart   .ChartType = xlBarStacked100   .SetSourceData Source:=Sheets("Sheet1").Range("A1:B2"), PlotBy:=xlRows  End With End Sub を実行すると横棒グラフが1個表示されますが、 これを、With ~ End Withを使わずに記述すると Sub test2()  ThisWorkbook.Worksheets("Sheet1").Shapes.AddChart.Chart.ChartType = xlBarStacked100  ThisWorkbook.Worksheets("Sheet1").Shapes.AddChart.Chart.SetSourceData Source:=Sheets("Sheet1").Range("A1:B2"), PlotBy:=xlRows End Sub というようになると思いますが、 実行すると縦棒が2個表示されてしまって同じ結果になりません。 なぜなのでしょうか。 test1を、With ~ End Withを使わずに記述するには、 どのように記述すればよいのでしょうか。 よろしくお願いします。(Windows10,Excel2016)

  • エクセルVBA・リストボックスに関する質問です。

    エクセルVBA初心者です。 作成したワークシート名をVBAにてリストボックス内に表示し、それを選択するとそのシートに飛ぶようにしています。 ------------------- Private Sub ListBox1_Change() With ListBox1 Worksheets(.ListIndex + 1).Activate End With End Sub ------------------- Private Sub UserForm_Initialize() Dim wsSheet As Worksheet For Each wsSheet In Worksheets ListBox1.AddItem wsSheet.Name Next wsSheet End Sub ------------------- これではすべてのシートがリストボックス内に反映される為、反映させたくないシート(3シートあるのですが)も一緒に表示されてしまいます。 この表示させたくないシートをリストボックス内に表示させない事は可能でしょうか? 又、できるとしたら、どんな言語を使用すれば良いのでしょうか? ご教授お願い致します。

  • VBAで、エクセルからワードへの変換について

    VBAは、全くの初心者で、テキスト等のサンプルコードを参照して書いているのですが 期待通りの動きをしないので、教えてください。 やりたい事は、Excelファイル(A-Fカラム、400行程度)を 1行ページのワードに変換し、400枚のワードファイルを作成します。 その際に、添付画面のように、各カラムを、タイトル、連番、内容などと区分けをして フォントも変えたいです。 下のコードでは、転送は、出来るのですが、1行1ページにならず、また、 エクセルの枠も転送されてしまいます。 ワードVBAも試したのですが、特定文字での検索が難しく、各ページでの 改行位置が異なるため、自分の理解では出来ませんでした。 ワードでテンプレートを作って、Excel VBAから差込になるのでしょうか? よろしくお願い致します。 Sub CopyExcelDataToWord() Dim wsSource As Excel.Worksheet Dim cell As Excel.Range Dim collUniqueHeadings As Collection Dim lngLastRow As Long Dim i As Long Dim appWord As Word.Application Dim docWordTarget As Word.Document Set wsSource = ThisWorkbook.Worksheets(1) With wsSource lngLastRow = .Range("A" & Rows.Count).End(xlUp).Row Set collUniqueHeadings = New Collection For Each cell In .Range("A2:A" & lngLastRow) On Error Resume Next collUniqueHeadings.Add Item:=cell.Value, Key:=cell.Value On Error GoTo 0 Next cell End With Set appWord = CreateObject("Word.Application") With appWord .Visible = True Set docWordTarget = .Documents.Add .ActiveDocument.Select End With For i = 1 To collUniqueHeadings.Count With wsSource .Range("A1").AutoFilter Field:=1, Criteria1:=collUniqueHeadings(i) .Range("A1:D" & lngLastRow).Copy End With With appWord.Selection .PasteExcelTable linkedtoexcel:=False, wordformatting:=True, RTF:=False .TypeParagraph End With Next i For i = 1 To collUniqueHeadings.Count collUniqueHeadings.Remove 1 Next i Set docWordTarget = Nothing Set appWord = Nothing End Sub

  • エクセルVBA【ワークシートのコピー】について

    以下のVBA記述で、とあるエクセルファイルのシートをCSV化しようとしております。記述の場合、すべてのワークシートが対象となっていますが、10個くらいあるWorkSheetの【sheets(8)】のみを対象としたいのですが、どのようにしたら良いのでしょうか? お手数ですがご教授下さい。 Sub test() Dim sh As Worksheet Dim fname As String Application.ScreenUpdating = False For Each sh In ActiveWorkbook.Worksheets fname = "C:\temp\" & sh.Name & ".csv" sh.Copy With ActiveWorkbook .SaveAs Filename:=fname, FileFormat:=xlCSV .Close savechanges:=False End With Next sh Application.ScreenUpdating = True End Sub