2015年01月28日

オートフイルターで可視セルを扱う

約10カ月ぶりの更新となります。

今年も、エクセルマクロ(VBA)講座を開催予定です。
お楽しみに!

久しぶりですが、最近質問が多い、
オートフイルターを使った条件抽出と、可視セルの扱い方に
ついて、書いてみたいと思います。

事例:
住所等が記録された個人データから、
「世帯主」と「住所」が一致するデータを抽出し、
家族構成として別画面に編集する処理を作っていきます。

オートフイルターで可視セルを扱う
 (個人データ)


     ↓  家族構成を編集する

オートフイルターで可視セルを扱う
(家族構成)

検索命令(Find)で条件に合うデータを絞り込んでいく方法もありますが
エクセルの便利な機能を使う事もプログラムのわかりやすさにつながります。

今回は、わかりやすくオートフィルターを使って作ってみます。

処理の動きとしては、
個人データのシートから対象者をダブルクリックすると、条件にあうデータを
抽出し、家族構成の画面へ編集する。
という動きにします。 

ダブルクリックすると動く仕組みは、ワークシートイベントの
“セルがダブルクリックされた時に発生する”
BeforeDoubleClickイベントプロシジャーを使います。

下記コードを個人データのシートモジュールに入力します。

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

Application.ScreenUpdating = False

Dim c As Range


Sheets("家族構成").Range("g5") = ""
Sheets("家族構成").Range("o5") = ""
Sheets("家族構成").Range("g6") = ""
Sheets("家族構成").Range("j5") = ""
Sheets("家族構成").Range("n6") = ""
Sheets("家族構成").Range("e9:y20") = ""


x = Target.Row

世帯主 = Sheets("個人データ").Range("e" & x)
現住所1 = Sheets("個人データ").Range("f" & x)
現住所2 = Sheets("個人データ").Range("g" & x)


Range("A1").Select

Selection.AutoFilter

Range("A1").AutoFilter Field:=5, Criteria1:=世帯主
Range("A1").AutoFilter Field:=6, Criteria1:=現住所1
Range("A1").AutoFilter Field:=7, Criteria1:=現住所2

r = 9

For Each c In Worksheets("個人データ").Columns(1).SpecialCells(xlCellTypeVisible)

If c = "" Then
Exit For
End If

If c.Row > 1 Then

Sheets("家族構成").Range("g5") = Sheets("個人データ").Range("f" & c.Row)
Sheets("家族構成").Range("o5") = Sheets("個人データ").Range("g" & c.Row)
Sheets("家族構成").Range("g6") = Sheets("個人データ").Range("h" & c.Row)
Sheets("家族構成").Range("j6") = Sheets("個人データ").Range("i" & c.Row)
Sheets("家族構成").Range("n6") = Sheets("個人データ").Range("j" & c.Row)
Sheets("家族構成").Range("e" & r) = Sheets("個人データ").Range("d" & c.Row)
Sheets("家族構成").Range("g" & r) = Sheets("個人データ").Range("a" & c.Row)
Sheets("家族構成").Range("k" & r) = Sheets("個人データ").Range("b" & c.Row)

If Sheets("個人データ").Range("b" & c.Row) <> "" Then

生年月日 = Sheets("個人データ").Range("b" & c.Row)
本日年月日 = Date
年齢 = DateDiff("yyyy", 生年月日, 本日年月日) _
+ (Format(生年月日, "mmdd") > Format(本日年月日, "mmdd"))
End If

Sheets("家族構成").Range("q" & r) = 年齢
Sheets("家族構成").Range("s" & r) = Sheets("個人データ").Range("c" & c.Row)
Sheets("家族構成").Range("u" & r) = Sheets("個人データ").Range("k" & c.Row)

r = r + 1
End If

Next c

Selection.AutoFilter

Sheets("家族構成").Select

Application.ScreenUpdating = True


End Sub

今日は、ここまで!
次回、コードの説明をしていきます。
それでは。



Posted by ミール at 21:52│Comments(0)
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。