› S・M・C (Simple.Macro.Create) ~エクセルマクロ日記~ › オートフイルターで可視セルを扱う
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
今日は、ここまで!
次回、コードの説明をしていきます。
それでは。
今年も、エクセルマクロ(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)