てぃーだブログ › S・M・C (Simple.Macro.Create) ~エクセルマクロ日記~ › VBA › オートフィルターで可視セルを扱う(説明)

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
・・・ 終了

簡単なシートを作って、マクロを入力してみると
理解できると思います。



同じカテゴリー(VBA)の記事

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