|
▼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
|
|