2015年01月30日
オートフィルターで可視セルを扱う(説明)
前回のコードの説明です。
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
・・・ダブルクリックした時に発生するイベントの記述です。
Application.ScreenUpdating = False
・・・画面更新をOFFにする。
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
・・・オートフィルターを設定する行を選択。(1行目とする為、セルA1を選択)
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
・・・ cは個人データの1列(A列):氏名を参照している。
氏名のセルが空白になった時点で繰り返し処理を抜ける。
※可視セルといっても、データが入力されているセルだけではない
データが入力されていなくても、空白セルは表示されているので
この処理を入れないと、最終行迄処理してしまう。
重要です。
If c.Row > 1 Then
・・・1行目はタイトル行なので、読み飛ばす
C.Rowは、可視セルの行番号が取得できる
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
・・・画面更新をONにする
End Sub
・・・ 終了
簡単なシートを作って、マクロを入力してみると
理解できると思います。
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
・・・ダブルクリックした時に発生するイベントの記述です。
Application.ScreenUpdating = False
・・・画面更新をOFFにする。
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
・・・オートフィルターを設定する行を選択。(1行目とする為、セルA1を選択)
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
・・・ cは個人データの1列(A列):氏名を参照している。
氏名のセルが空白になった時点で繰り返し処理を抜ける。
※可視セルといっても、データが入力されているセルだけではない
データが入力されていなくても、空白セルは表示されているので
この処理を入れないと、最終行迄処理してしまう。
重要です。
If c.Row > 1 Then
・・・1行目はタイトル行なので、読み飛ばす
C.Rowは、可視セルの行番号が取得できる
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
・・・画面更新をONにする
End Sub
・・・ 終了
簡単なシートを作って、マクロを入力してみると
理解できると思います。
Posted by ミール at 19:12│Comments(0)
│VBA