| 
    
     |  | ▼ema さん: 
 Sheet4(入力シート)ですが、ぼくはテストのために
 入力補助を設定しておきました。
 
 [B1]セルには[データ]-[入力規則]で 1,2,3,4,...10,11,12
 のリストをセットしておきました。
 [B2]セルにも、Sheet2のA列(CD)リストから選べるよう、範囲に
 「顧客コード」と名前定義をしておいて、この範囲を入力規則の
 リスト範囲にセットしておきました。
 
 また、
 上のコードですが、何をしているか、以下に、少しコメント付けてみました。
 
 > '--------------------------------------------------------- Sheet4
 「このModule内で使用する変数は必ず宣言してから使う」ことを宣言
 > Option Explicit
 >
 このワークシートのセル範囲に変更があったとき
 > Private Sub Worksheet_Change(ByVal Target As Range)
 使用する変数を宣言します
 まず注目するセル範囲[B1,B2,B4]の3つのセル範囲用変数
 >   Dim myRange As Range
 もうひとつRangeオブジェクト変数(使用法はすぐあと)
 >   Dim c As Range
 
 注目するセル範囲[B1,B2,B4]の3つのセル範囲をmyRangeに
 セットします。
 >   Set myRange = [B1,B2,B4]
 つぎに、変化のあったセルが[B1,B2,B4]のセルかを調べます
 Intersectメソッドは重なるセル範囲を返します
 >   Set c = Intersect(Target, myRange)
 変化のあったセルTargetが[B1,B2,B4]のどれかのセルと
 重なっていれば 変数c にはセルが歳入されます。
 ↓逆に myRange[B1,B2,B4] のどのセルとも一致しないときは
 c は Nothing(セルなし)となりますので、すぐ処理を抜けます
 >   If c Is Nothing Then Exit Sub
 
 また、myRange(すなわち[B1,B2,B4])の3つとも値が入力
 されていなければ、以下の処理は無駄なので しません。
 >   If WorksheetFunction.CountA(myRange) < 3 Then Exit Sub
 
 ここまで来たときは、変化のあったセルは[B1,B2,B4]のどれかであり、
 かつ[B1,B2,B4]のどのセルにも値が入力されています。
 
 >   Dim mon As Long
 >   Dim m
 [Sheet2]のA列(顧客コード)データ範囲を参照するための変数
 >   Dim RefRange As Range
 
 [B1]セルを見て、何月分の値かを取得します
 >   mon = Val([B1].Value)
 [B1]セルの数値が 1〜12であれば有効な月数ですので、
 このときだけ処理を続けます。
 >   Select Case mon
 >    Case 1 To 12
 
 [Sheet2]のA列(顧客コード)データ範囲を変数にセット
 >      With Worksheets("Sheet2")
 >        Set RefRange = .Range("A2", _
 >             .Cells(.Rows.Count, 1).End(xlUp))
 >      End With
 [B2]セルの値が RefRangeの何番目(何行目)にあるか
 調べます
 m = Application.Match([B2].Value2, RefRange, 0)
 MATCHワークシート関数は検索して見つかった時
 検索範囲の上から何番目かを数値で返します
 (見つからなかったときはエラー値が返ります)
 数値が返ってきたときだけ [B4]セルの値を
 >      If IsNumeric(m) Then
 Sheet2のRefRange(A列)のm行目の (2+mon)列目の
 セルに転記します
 >        RefRange(m, 2 + mon).Value = [B4].Value
 >      End If
 >   End Select
 > End Sub
 
 |  |