• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:エクセル VBA 表示範囲の簡素化)

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

eden3616の回答

  • 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 様 早速のご回答ありがとうございます。

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