エクセル VBA 表示範囲の簡素化

このQ&Aのポイント
  • エクセルのVBAを使用して表示範囲を簡素化する方法について教えてください。
  • CommandButtonが複数ある場合、それぞれのボタンをクリックした際に表示範囲を適切に設定する方法を教えてください。
  • 基本台紙シートで特定の範囲を表示させるためのVBAコードを簡素化したいです。
回答を見る
  • ベストアンサー

エクセル VBA 表示範囲の簡素化

よろしくお願いします。 下記構文の簡素化ができないでしょうか。 CommandButtonが30個ほどあります。 ーーーーーーーーーー Private Sub CommandButton1_Click() Dim rng As Range Application.Goto Sheets("基本台紙").Range("A1") Set rng = Range("A1:D7") Rows.Hidden = True rng.EntireRow.Hidden = False Columns.Hidden = True rng.EntireColumn.Hidden = False rng(1).Select Unload Me UserForm1.Show vbModeless End Sub ーーーーーーーーーー Private Sub CommandButton2_Click() Dim rng As Range Application.Goto Sheets("基本台紙").Range("A1") Set rng = Range("A8:B21") Rows.Hidden = True rng.EntireRow.Hidden = False Columns.Hidden = True rng.EntireColumn.Hidden = False rng(1).Select Unload Me UserForm1.Show vbModeless End Sub ーーーーーーーーーー Private Sub CommandButton3_Click() Dim rng As Range Application.Goto Sheets("基本台紙").Range("A1") Set rng = Range("C8:D21") Rows.Hidden = True rng.EntireRow.Hidden = False Columns.Hidden = True rng.EntireColumn.Hidden = False rng(1).Select Unload Me UserForm1.Show vbModeless End Sub

  • 1211M
  • お礼率54% (90/165)

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

  • ベストアンサー
  • f272
  • ベストアンサー率46% (8016/17133)
回答No.2

クラスモジュールを使うのが嫌なら,こんな感じで... Private Sub CommandButton1_Click() call CommonTask("A1:D7") End Sub Private Sub CommandButton2_Click() call CommonTask("A8:B21") End Sub Sub CommonTask(s) Dim rng As Range Application.Goto Sheets("基本台紙").Range("A1") Set rng = Range(s) Rows.Hidden = True rng.EntireRow.Hidden = False Columns.Hidden = True rng.EntireColumn.Hidden = False rng(1).Select Unload Me UserForm1.Show vbModeless End Sub

その他の回答 (3)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.4

ボタンを作るのはForNextループで30回Add繰り返せば仕舞。 変わるところ、LEFT,TOP、などは一定であるとか、何個目かで、計算して変数で指定すれば仕舞。 WIDTH、HEIGHTは同じ値の場合が多いだろう。 Rangeがボタンによって可変で出てくるようだが、計算して指定すればっできるだろう。 ーー 問題は (1)エクセルで、こんな多数のボタンを作って扱うのは設計がおかしくないか?、誰かに相談すべきだ。よくわかっていてそれしかないと結論したらやむを得ないが。 こういう設計段階が、経験やスキルが如実に出るところで、扱うニーヅや取り組みの視点がおかしくはないか。思いついてすぐ方向を決めて動いているようだ。 (2)さらに、、問題は、各ボタンをクリックしたとき、どのボタンがクリックされたかのプログラムは、似た30個のイベントプロを書かないでやる方法は、VBAでは難しいのを知っているのか? 「クラスモジュールを使う」かとか、さらにむつかしいよ。(コントロール配列がVBAで使えないとかがあって) VB.NET系のVBなどならクラスは根本だが、VBAではクラスの利用は敷居が高いと思うよ。 == シートのセルをクリックしたセルは、SelectionChangeイベントのTargetでわかるから、それでCase文で分けるとか、クリックしたセルの行や列と関連付けて処理できないか。 = ボタンを散りばめたりするには、「エクセルをあまりできない人が使う」というのが理由かもしれないが、そういうケースの対応は、経験があり技量のあるプロやプロ並みの人のやること。質問ぶりから、とてもそこまで行っていると思えない。再考したらどうか。

1211M
質問者

お礼

imogasi 様 早速のご回答ありがとうございます。 シート内には写真撮影時に添付する台紙を300枚以上作成してあります。 1枚(7行2列)工事の内容によって使用する台紙の枚数及び内容が変化します。 ユーザーフォーム内のCommandButtonを押下して、それぞれの工事内容にあった範囲にあるセル(台紙)のみ表示し内容を確認する。 設計がおかしくないか? 人には人の理由があるのではないでしょうか。 経験があり技量のあるプロやプロ並みの人のやること。 プロやプロ並みの人は、質問されないと思います。 反論してすみません。

  • eden3616
  • ベストアンサー率65% (267/405)
回答No.3

ご質問のcommandbutton1~3において以下のように参照セル範囲に規則性がありません。 ご質問の情報に誤りがあるのか、参照範囲は別の方法で取得できるのか別途一覧などがありますか? Set rng = Range("A1:D7") Set rng = Range("A8:B21") Set rng = Range("C8:D21") 数ある処理を集約するためには、数値や文字など変動する箇所を変数に入れて同じ処理を行うためにパターン化できることが前提にあります。 スマートなものはクラス定義ですが、冗長的ではありますが簡素に行うのであれば以下のような方法もあります。 1つのプロシージャに処理をまとめて、callで呼び出す際に対象のセル範囲を一緒に渡して処理しています。 Sub sample(myRng As String)     Dim rng As Range     Application.Goto Sheets("基本台紙").Range("A1")     Set rng = Range(myRng)     Rows.Hidden = True     rng.EntireRow.Hidden = False     Columns.Hidden = True     rng.EntireColumn.Hidden = False     rng(1).Select     Unload Me     UserForm1.Show vbModeless End Sub 'commandbuttonクリックイベント1~30(引数に文字列でセル範囲を指定) Private Sub CommandButton1_Click()     Call sample("A1:D7") End Sub Private Sub CommandButton2_Click()     Call sample("A8:B21") End Sub Private Sub CommandButton3_Click()     Call sample("C8:D21") End Sub     ・     ・     ・ Private Sub CommandButton30_Click()     Call sample("XX:XX") End Sub ============================== 一部のbuttonにより処理を分岐させる必要などがあれば、引数に「ActiveControl.Name」を追加することでcontrolのオブジェクト名をsampleプロシージャに渡すことができますので、上記コードを以下のように変更することで分岐することもできます。 ▼各クリックイベント内 Call sample("A1:D7")     ↓ Call sample(ActiveControl.Name,"A1:D7") ▼sampleプロシージャ内 Sub sample(myRng As String)  ~  End Sub     ↓ Sub sample(btnName As String, myRng As String)   btnName = Replace(btnName,"CommandButton","")   Select Case CInt(btnName)   '共通の処理   Case 1     'commandbutton1の処理   Case 2, 3     'commandbutton2及び3の処理   Case Else     'それ以外のcommandbuttonの処理   End Select   '共通の処理 End Sub

1211M
質問者

お礼

eden3616 様 早速のご回答ありがとうございます。

  • ushi2015
  • ベストアンサー率51% (241/468)
回答No.1

こんにちは CommandButton1からCommandButton30が有るとすると、 クラスモジュールを挿入して、(名前はClass1のまま) Private WithEvents Btn As MSForms.CommandButton Private Index As Integer Public Sub NewClass(ByVal c As MSForms.CommandButton, ByVal i As Integer)   Set Btn = c   Index = i End Sub Private Sub Btn_Click()   Dim rng As Range   Application.Goto Sheets("基本台紙").Range("A1")   Set rng = Range("A1:D7").Offset(Index)   Rows.Hidden = True   rng.EntireRow.Hidden = False   Columns.Hidden = True   rng.EntireColumn.Hidden = False   rng(1).Select End Sub ユーザーフォームのコードに、 Private NumCmd(0 To 29) As New Class1 Private Sub UserForm_Initialize()   Dim i As Integer   For i = 0 To 29     NumCmd(i).NewClass Controls("CommandButton" & i + 1), i   Next End Sub のようにしてみるとどうですか? '  Unload Me '  UserForm1.Show vbModeless は、ちょっとなんの為か良く分かりません。 UserForm1上のコマンドボタンの話ですよね?

1211M
質問者

お礼

ushi2015 様 早速のご回答ありがとうございます。 '  Unload Me '  UserForm1.Show vbModeless は、UserForm2を閉じてシートを表示します。 そのシート上にUserForm1を表示して、クリックすると 再度UserForm2を表示させるためです。

関連するQ&A

  • エクセルシート:ボタン押下で特定列の表示←→非表示切り替え

    (行いたいこと) sheet1の中にコマンドボタン1があって、そのボタンが押されたとき既にC列からF列が非表示のときは表示してやり、また逆に表示のときは非表示にする。 (macroを作って実行したい) (現在の考えている状況) 後どうすればいいですか。今は何も動作しません。 今macro3というマクロの中に次のようなものが入っています。 Private Sub CommandButton1_Click() If Selection.EntireColumn.Hidden = True Then Columns("B:G").Select Range("G1").Activate Selection.EntireColumn.Hidden = False Else: Columns("C:F").Select Selection.EntireColumn.Hidden = True End Sub Sub Macro3() ' ' Macro3 Macro ' マクロ記録日 : 2006/3/24 ユーザー名 : ' Columns("C:F").Select Selection.EntireColumn.Hidden = True Columns("B:G").Select Range("G1").Activate Selection.EntireColumn.Hidden = False Range("B2").Select End Sub

  • この場合エクセルVBAでどう書けばいいでしょうか?

    あるシートのH列で、H21からH46のあいだで"False"がある行を非表示にしたいのです。 下記の冗長なマクロでもそうなりますが、For Nextというのを使うともっと簡潔に記述できると思うのですが、初心者のためよくわかりません。ご教示ください。 また、下記の式はシートが保護されていると働きませんが、保護したシートでも動く方法があればそれもあわせて教えていただけると幸いです。 エクセルは95です。 Sub 空白行非表示() G% = Sheets("見積書").Range("H48").Value With Sheets("見積書") Rows("19:47").RowHeight = G% If Range("H21") = False Then Rows("21").EntireRow.Hidden = True End If If Range("H22") = False Then Rows("22").EntireRow.Hidden = True End If If Range("H23") = False Then Rows("23").EntireRow.Hidden = True End If If Range("H24") = False Then Rows("24").EntireRow.Hidden = True End If 途中、繰り返しのため省略 If Range("H42") = False Then Rows("42").EntireRow.Hidden = True End If If Range("H43") = False Then Rows("43").EntireRow.Hidden = True End If If Range("H44") = False Then Rows("44").EntireRow.Hidden = True End If If Range("H45") = False Then Rows("45").EntireRow.Hidden = True End If If Range("H46") = False Then Rows("46").EntireRow.Hidden = True End If End With End Sub

  • 2つのユーザーフォームの表示切替(Excel2002VBA)

    Excel2002VBAを使用しています。 UserForm1 に CommandButton1 を配置したものと UserForm2 に CommandButton2 を配置したもの があります。 UserForm1が表示されている時、CommandButton1 を クリックすると、UserForm2 が表示され UserForm1 が非表示になり、 UserForm2 が表示されている時  CommandButton2 をクリックすると UserForm1 が 表示され UserForm2 が非表示になる というように 画面上にどちらか一方だけユーザーフォームを表示 させたいのですが上手くいきません。 CommandButton1 の Clickイベントに UserForm2.show vbmodeless Unload UserForm1 CommandButton2 の Clickイベントに UserForm1.show vbmodeless Unload UserForm2 と記述したのですが、実行すると、 ”このオブジェクトは、ロードまたはアンロード することはできません。”とエラー表示が出てき ます。 何とぞご教授よろしくお願いいたします。

  • 指定した範囲内が空白なら行削除するマクロ

    エクセルで指定した範囲内(A列からC列まで)で何も文字が入っていなければ(空白)、行を削除する、というマクロを教えてください。 いくつか調べて、以下を試しましたが、何も動作しませんでした。 どなたかアドバイスをいただければ助かります。 よろしくお願いします。 Sub DeleteBlankRows2() Application.ScreenUpdating = False On Error Resume Next With Columns("A:C") .SpecialCells(xlCellTypeConstants).EntireRow.Hidden = True .SpecialCells(xlCellTypeFormulas).EntireRow.Hidden = True .SpecialCells(xlCellTypeComments).EntireRow.Hidden = True .SpecialCells(xlCellTypeVisible).EntireRow.Delete .EntireRow.Hidden = False End With Application.ScreenUpdating = True End Sub

  • 複数のコマンドボタン(VBAで)を一つにまとめたい。

    複数のコマンドボタン(VBAで)を一つにまとめたい。 Private Sub CommandButton1_Click() Application.Goto Reference:=Range("A7"), Scroll:=True End Sub Private Sub CommandButton2_Click() Application.Goto Reference:=Range("A29"), Scroll:=True End Sub Private Sub CommandButton3_Click() Application.Goto Reference:=Range("A51"), Scroll:=True End Sub Private Sub CommandButton4_Click() Application.Goto Reference:=Range("A73"), Scroll:=True End Sub Private Sub CommandButton5_Click() Application.Goto Reference:=Range("A95"), Scroll:=True End Sub Private Sub CommandButton6_Click() Application.Goto Reference:=Range("A117"), Scroll:=True End Sub Private Sub CommandButton7_Click() Application.Goto Reference:=Range("A139"), Scroll:=True End Sub Private Sub CommandButton8_Click() Application.Goto Reference:=Range("A161"), Scroll:=True End Sub Private Sub CommandButton9_Click() Application.Goto Reference:=Range("A183"), Scroll:=True End Sub Private Sub CommandButton10_Click() Application.Goto Reference:=Range("A205"), Scroll:=True End Sub Private Sub CommandButton11_Click() Application.Goto Reference:=Range("A227"), Scroll:=True End Sub 上記のように複数のコマンドボタンを関数化して一つにすることは出来るでしょうか?

  • エクセルのマクロで行選択

    現在、エクセルでマクロを組んでいます。 行いたい内容としては 1.行6~1765までを選択 2. 1.で選択した行を非表示 3. 行6~"セルH2の値"までをを選択 4. 3.で選択した行を再表示 3の段階で失敗してしまいます。 Rangeメソッドに失敗しました、と出ます ソースは以下のとおりです ----- Private Sub CommandButton2_Click() Dim x As Integer Range("6:1765").EntireRow.Select Selection.EntireRow.Hidden = True x = Range("H2").Value Range("6:x").EntireRow.Select Selection.EntireRow.Hidden = False End Sub ---- 解決法がわかる方、教えてください よろしくお願いします。

  • Excel VBAで別のブックからユーザーフォームの閉じる

    Excel VBAで別のブックからユーザーフォームの閉じたいのですが うまくいきません。 教えてください。 Private Sub CommandButton2_Click() Application.Visible = False Unload Workbook.("材料リスクマップ検索Ver2.xls")UserForm3・・・・※ Workbooks.Close userform3:=ThisWorkbook.Path & "あああ.xls" Workbooks("\いいい.xls").Close savechanges:=False UserForm1.Show vbModeless End Sub ※印のところが赤字にかわります。 コマンドボタン2は、いいい.xlsにあり、フォームを閉じたいのはあああ.xlsのUserform3です。 その後、ファイル名いいい.xlsは閉じます。 コードが間違っているかと思いますが、どんな風にすればよいかわかりません。初歩的なこととは思いますがよろしくお願い致します。

  • エクセルマクロでオートフィルターを実行した際の矢印ボタンの非表示化

    データがA列~S列まで入っており、そのE列(5番目)に検索対象の文字が入っています。 1行目は見出し行で、行方向にはどんどんデータが追加されていきます。 さて、検索文字が「キャラメル」のものを抽出したい場合、次のようなコードを書くとオートフィルターの矢印が、E列以外の見出し行に表示され見にくいものになってしまいます。 オートフィルターの矢印ボタンを全て非表示にする方法はないのでしょうか? なお、下のコードでは不要な列の非表示化も行っていますが、何かスマートでないような気がしてなりません。 E列に入っている文字を検索し、必要な列だけデータを抽出して表示させるもっと良い(簡単な)方法等もあれば、御教示下さい。宜しくお願い致します。 Private Sub CommandButton1_Click()  Range("A1").AutoFilter _   Field:=5, _   Criteria1:="キャラメル", _   VisibleDropDown:=False  Columns("M:M").EntireColumn.Hidden = True  Columns("P:S").EntireColumn.Hidden = True End Sub 追伸、上記でRange("A1")としていますが、これでよいのかもわかりません。

  • EXCEL VBAで行・列の該当データ

    出荷データ一覧のマクロを作りたいのですが、抽出の仕方で苦戦してます。 A2から下方向に商品名、B1から右方向に日付の入ったシートのA3から任意のセル(変わります)に 数値のデータが入ってます。 商品の有無により出荷日は日付通りにいかずランダムになります。 例えば、数値データセルを任意で黄色に塗りつぶしたところの数値と該当する商品名を抽出するにはどうすればいいのでしょうか。 現在は以下のようなマクロを必要数値以外を削除して実行していますが、新しいものを思案中です。 Sub 行列を非表示() Rows("2:200").Hidden = True Columns("B:AO").Hidden = True Selection.SpecialCells(xlCellTypeConstants).EntireRow.Hidden = False Selection.SpecialCells(xlCellTypeConstants).EntireColumn.Hidden = False End Sub

  • VBA チェックした項目以外を非表示

    現在下記のようなコードがあります。 C列に項目が入力されており そのC列に入力されている項目と同じ文字が ユーザーフォームのチェックボックスのキャプションになっています。 今回やりたいのはチェックボックスにチェックした項目以外を 非表示にしたいというものですが 現状は、1つだけのチェックなら正常に機能します。 2つ以上チェックしてしまうとオブジェクト名が大きい方が優先されて しまい1つだけの項目しか表示されません。 どのようにコードを書き換えればよろしいでしょうか? Private Sub CommandButton1_Click() Dim i As Integer Dim d As Date Dim y As Date Dim myMSG As String Dim myFlg As Boolean Dim rng As Range Dim rng2 As Range myFlg = False For i = 1 To 14 If Me.Controls("CheckBox" & i).Value = True Then myMSG = Me.Controls("CheckBox" & i).Caption myFlg = True End If Next i If myFlg = False Then GoTo Label1 End If Set rng2 = Range("C:C").Find(what:=myMSG, lookat:=xlWhole) If rng2 Is Nothing Then MsgBox Me.ComboBox1 & "日に" & myMSG & "は使用していません。", vbInformation Exit Sub Else For x = 2 To Range("C65536").End(xlUp).Row If Range("C" & x).Value <> myMSG Then Rows(x & ":" & x).EntireRow.Hidden = True End If Next x End If End Sub

専門家に質問してみよう