Excelのこととか色々

マクロをどんな Excel ファイルにも実行できるように設定して、3秒かかる操作も1秒で完了。あといろいろ書いてみます・・・

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

【Excel/VBA のこと 18】

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

 

前回作成したオートフィルタ設置ツールを少し改良しました。

RefEdit がうまく使えればすごく便利になったと思うのですが、

私のやりたいことができませんでした・・・

 

いや、できるのですが、ユーザー目線で見るとひと手間かかってしまい、

「便利」から少し遠ざかってしまいました。

 

なので、どうせひと手間かかってしまうのであれば、

シンプルな改造にしました。

メンテもしやすいので。

 

 

外観

  オートフィルタ設置ツール改

ラベル x 3

テキストボックス x 3

コマンドボタン x 2

 

部品は変更ありません。

列番号の入力を数字からアルファベットに変更です。

普通の人はアルファベットの方が慣れていますからね。

 

あと、各テキストボックスの「IME Mode」を、

「fmIMEModeOff」に変更しました。

 

 

こうしておけば、入力モードが半角英数になるので、

いちいち切り替えなくてもいいですよね。

全角での入力ミスもなくなります。 

  テキストボックスのIME Mode 変更

 

フォーム名も「Kai」(改)を追加して、前回作成したものと

区別できるようにしました。

 

マクロ

 

追加した部分は赤字にしました。

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

Option Explicit

’モジュールレベル変数 
'ここで宣言された変数は同一モジュール内で使用できる
Dim FirstC As String 'Long から String に変更しました。
Dim
FirstC2 As String
Dim LastC As String
Dim LastC2 As String
Dim FilterR As Long

Dim FirstC As Long
Dim LastC As Long

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

フォーム初期化

Private Sub UserForm_Initialize()

 '選択したセルの行、列を基準に既定値を入力する
 FilterR = Selection.Row '選択セルの行
 FirstC = 1 '列Aを先頭行として入力する

 '先頭行の取得方法を変更
 '選択セルから左に行って止まったところの Address を取得して、
 'Split 関数でアルファベットの列番号を取得します。
 FirstC = Selection.End(xlToLeft).Address  
 FirstC2 = Split(FirstC, "$")(1)

 

 '最終列も先頭行と同じようにアルファベット表示に変更
 LastC = Cells(FilterR, Columns.Count).End(xlToLeft).Address
 LastC2 = Split(LastC, "$")(1)

 txtFilterR.Text = FilterR
 txtFirstC.Text = FirstC2
 txtLastC.Text = LastC2

 LastC = Cells(FilterR, Columns.Count).End(xlToLeft).Column '選択セルの最終行

 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

                  

 

「個人用マクロブック」に記述したフォームを表示させるマクロに、

一文追記です。

vbModeless

 

これが機能することで、フォーム表示中でも Excel のシートを操作できます。

つまり、ユーザーがスクロールして最終列がどこかを確認してから、

入力してもらう という方法にしました。


Sub任意行にFilter設置()

 frmSetFilterToolKai.Show vbModeless
End Sub

                  

 

列番号を数字からアルファベットに変更したので、

「設置」ボタンの記述も変更しないと と思っていたのですが、

そのままでもエラー無く実行できました。

 

Range(Cells(FilterR, FirstC), Cells(LastR, LastC)).AutoFilter

この箇所に実際に値が入ると・・・

Range(Cells(1, A), Cells(10, H)).AutoFilter

 

こんな風になっています。

でもエラー出ない・・・

 

不思議だ。

 

**********************************************************

 

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

www.tuna-kichi.com

 

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

www.tuna-kichi.com

 

 

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

にほんブログ村 子育てブログ 幼稚園児育児へ
にほんブログ村
にほんブログ村 英語ブログ 初心者英語へ
にほんブログ村
にほんブログ村 IT技術ブログ VBAへ
にほんブログ村

==================================

  Graspyで無料プログラミング講座を受講する