【Excel/VBA のこと 18】
前回作成したオートフィルタ設置ツールを少し改良しました。
RefEdit がうまく使えればすごく便利になったと思うのですが、
私のやりたいことができませんでした・・・
いや、できるのですが、ユーザー目線で見るとひと手間かかってしまい、
「便利」から少し遠ざかってしまいました。
なので、どうせひと手間かかってしまうのであれば、
シンプルな改造にしました。
メンテもしやすいので。
外観
ラベル x 3
テキストボックス x 3
コマンドボタン x 2
部品は変更ありません。
列番号の入力を数字からアルファベットに変更です。
普通の人はアルファベットの方が慣れていますからね。
あと、各テキストボックスの「IME Mode」を、
「fmIMEModeOff」に変更しました。
こうしておけば、入力モードが半角英数になるので、
いちいち切り替えなくてもいいですよね。
全角での入力ミスもなくなります。
フォーム名も「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
こんな風になっています。
でもエラー出ない・・・
不思議だ。
**********************************************************
個人用マクロブックについてはこちら
リボンに登録についてはこちら
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/