Excelのこととか色々

Excel のこととか楽天とか いろいろ書いてみます・・・

【Excel/VBAのこと17】ツールをつくる(任意の行にフィルタを設置するツール)

【Excel/VBA のこと 17】

   f:id:tuna-kichi:20200223230814p:plain

 

こんな表を扱うことはあるでしょうか?

タイトル行が複数分類されている表です。

  サンプル 表

 

この表にフィルタ設置すると1行目に設置されてしまい、

非常に使いづらくなってしまいます。

  1行目にフィルタボタン

 

でも、設置したいのは3行目です。

このような表にも対応できる、ツールを作りました。

 

 

外観

  フィルタ設置ツール外観

ラベル x 3

テキストボックス x 3

コマンドボタン x 2

 

シンプルでしょ。

 

マクロ

私は、マクロを実行させたい行 or 列を含むセルを選択して、

そのセルのアドレスを基準にして記述するマクロを良く作ります。

 

マクロ使用手順として、まず正しいセルを選択しておく 

としています。(個人使用の場合のみ)

 

以下のマクロはフォームと、各部品に記述してください。

----------------------------------------

Option Explicit

’モジュールレベル変数 
'ここで宣言された変数は同一モジュール内で使用できる
Dim FirstC As Long
Dim FilterR As Long
Dim LastC As Long

----------------------------------------

フォーム初期化

Private Sub UserForm_Initialize()

 '選択したセルの行、列を基準に既定値を入力する
 FilterR = Selection.Row '選択セルの行
 FirstC = 1 '列Aを先頭行として入力する
 LastC = Cells(FilterR, Columns.Count).End(xlToLeft).Column '選択セルの最終行

 txtFilterR.Text = FilterR
 txtFirstC.Text = FirstC
 txtLastC.Text = LastC

 '列表示をアルファベットから数字に変更して、
 最終列を数字で入力してもらうよう促す

 Application.ReferenceStyle = xlR1C1
End Sub

----------------------------------------

閉じるボタン

Private Sub cmdClose_Click()
 End
End Sub

----------------------------------------

設置ボタン

Private Sub cmdGo_Click()
 Dim LastR As Long

 'ここの変数は「モジュールレベル変数」として定義しているので、
 '個別のプロシージャ内で定義する必要がない
 FilterR = txtFilterR.Text
 FirstC = txtFirstC.Text
 LastC = txtLastC.Text

 '最終行を列Aで取得する
 LastR = Cells(Rows.Count, 1).End(xlUp).Row
 Range(Cells(FilterR, FirstC), Cells(LastR, LastC)).AutoFilter

 '列表示を数字からアルファベットに変更(表示をもとに戻す)
 Application.ReferenceStyle = xlA1

End Sub

                  

 

フォームを表示させるマクロを「個人用マクロブック」の

標準モジュールに記述してください。


Sub任意行にFilter設置()

 frmSetFilterTool.Show
End Sub

                  

 これで、指定行の必要な列にのみフィルタを設置できます。

 フィルタ設置結果

 

後は、 リボンに登録していつでも、どんなファイルにも使えるようにします。

 

 

個人用マクロブックについてはこちら

www.tuna-kichi.com

 

リボンに登録についてはこちら

www.tuna-kichi.com

 

_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/