挿入された行の日付に対応して別のシートに行を挿入するには

Question 80.5 Previous Next
始めまして。いろいろ調べながら我流でマクロを組んでいたのですが、どうしても行き詰ってしまいました。
どうか、ご教授ねがいたく。
今、「一覧」「2007.1」の2つのSheetがあり、
「一覧」には2007/1/1から2007/12/31まで抜け日なく日付がB列に並んでおり、1日が2,3行になるところもあります。
「2007.1」には1から31まで抜け日なく数字がA列に並んでおり、これも1日が2,3行になるところもあります。
「一覧」と「2007.1」の行数は同じではありません。

私がやりたいのは「2007.1」の10(A13セル)に行を挿入し、10(A13セル)と11(A14セル)の間に空欄の行を作った時に、「一覧」の2007/1/10(B57セル)と2007/1/11(B59セル)の間にも、空欄の行を作りたいのです。
とりあえずとっかかりとして、Worksheet_Changeで、
    If Selection.EntireRow.Insert Then
        Sheets("一覧").Select
        Range("B57").Select
    End If
としたのですが、うまくいきません。いい方法あれば教えてもらえますか? (WinXP & Excel2003)
Answer   Copyright (C) 2007.1.23 永井善王
ご質問文からワークシートを再現すると、あなたのご希望は下図のようになるのでしょうか?
少しつじつまが合わないようなところがあるので、まず、確認してください。

Q1. 「2007.1」の10(A13セル)に行を挿入とありますが、10(A13セル)と11(A14セル)の間ならば、14行目に挿入するの
  ではありませんか。
Q2. 「一覧」のB58セルのことが飛んでいますが、59行目に挿入すればよいのですね。
「2007.1」
ユーザーフォーム A














←(1) 10日と11日の間に1行挿入したら … ハンド操作
 「一覧」シート
ユーザーフォーム B



※ B列の年月日のセルの書式は[日付型]とする










←(2) 対応する日付位置へも1行挿入したい … マクロで
マクロは、あなたが思い付かれたWorksheet_Changeイベントプロシージャを、「2007.1」シートのモジュールに作成すればよいですよ。
ただ、踏まえておかなければいけないことが多いですし、処理の流れを整理しておくことも必要になります。
が、私は現在執筆中で、申し訳ありませんが詳しくご説明する時間がありませんので、下記のマクロ1行1行のポイントを参考にしてご理解ください。
Private Sub Worksheet_Change(ByVal Target As Range)
10  Dim 一覧セル As Range
20  変更セル = "A" & Target.Row
30  If Range(変更セル).Value = "" Then
40      次行セル = "A" & (Target.Row + 1)
41      日 = Range(次行セル).Value
42      月 = Right(Me.Name, Len(Me.Name) - InStr(1, Me.Name, "."))
43      年 = Left(Me.Name, 4)
44      年月日 = CDate(年 & "/" & 月 & "/" & 日)
50      下端行 = Worksheets("一覧").Range("B" & Rows.Count).End(xlUp).Row
51      Set 一覧セル = Worksheets("一覧").Range("B3:B" & 下端行).Find(what:=年月日 _
            , LookIn:=xlValues, lookat:=xlWhole, MatchCase:=False)
52      一覧行 = 一覧セル.Row & ":" & 一覧セル.Row
60      Worksheets("一覧").Rows(一覧行).Insert Shift:=xlDown
70  End If
End Sub
ポイント
20 … イベントが発生したA列のセルアドレスを変数「変更セル」に代入する(a)
30 … そのセル(a)の値が "" なら … 挿入された行とみなす *
40 … もう1行下のA列のセルアドレスを作成(b)
41 … 1行下の(b)セルの値を変数「日」に代入する
42 … シート名の中の月を変数「月」に代入する
43 … シート名の中の年を変数「年」に代入する
44 … 変数「年月日」に日付型の年月日を代入する
50 … 「一覧」シートのB列のデータの下端行を取得する
51 … 「一覧」シートのB列から変数「年月日」の値と等しいセルを見つけて(c)
52 … 変数「一覧行」に見つけたセル(c)の行番号を代入する(d)
60 … 「一覧」シートの見つけた行番号(d)の位置へ行を挿入する

*印のコードは更に検討が必要かも知れません。 根気よく頑張りましょう。

Excel VBA Macro