|
▼HIRO さん:
こんにちは
とりあえずわかる範囲で。
(コードが正しいかどうかはわかりません)
★ご自身でも、ヘルプ等に目を通しておかれることをお勧めします。
For i = 1 To 3
j = WorksheetFunction.Max(j, Cells(Rows.Count, i).End(xlUp).Row)
Next i
A列からC列まで i に列番号を与えて、その列に値のある最終行を
Cells(Rows.Count, i).End(xlUp).Row で取得し、その3列の
最終行の最大値を、最終的にはjに取得しています。
j は最初 0 ですから A列の最終行とMax関数で比較すると、後者が大きいので
j には A列の最終行が入ります。次に、それとB列の最終行の大きいほうを
j に取得しているわけです。
★すこし、まだるっこしいコードのような気もします。
★以下の説明のなかで、この j を 「最終行」と呼びます。
If j >= 2 Then
・・・・・・・
End If
最終行が 2 以上のときのみ処理をします。
おそらく1行目はタイトル行でしょうか?
ですから、シート上にタイトル行しかない場合は処理をしないということです。
Range("D2:D" & j).Resize(, 48).ClearContents
D列の2行目から、「最終行」までの値をクリアします。
For Each c In Range("A2:C" & j)
・・・・・・
Next
A2からC列の「最終行」までのセルを1つずつ c に取り出し、ループの中で
処理を行います。
If IsDate(c.Value) Then
・・・・・
End If
取り出したセルの値(c の値)が日付型の場合にのみ処理を行います。
Month(c.Value2)
Day(c.Value2)
Value2は日付型が持つDouble型のシリアル値です。この場合、通常のValueでもかまいません。
で、その日付から、月や日を抽出しています。
WorksheetFunction.Match(Day(c.Value2), Array(1, 8, 16, 23), 1)
ワークシート関数のMatchを使い、取り出した日付の日が、配列(1, 8, 16, 23)の
何番目にあるかを取得します。例えば 8日であれば、2 が返ります。
k = (Month(c.Value2) - 1) * 4 + _
WorksheetFunction.Match(Day(c.Value2), Array(1, 8, 16, 23), 1)
k に 以下をいれます。これが何を意味しているのかはわかりません。
(月-1) * 4 + 配列(1, 8, 16, 23)の中での日の位置
c.EntireRow.Cells(3 + k).Value
取り出したセルが存在する行の 3 + k 列の値ということになります。
これが何かも、こちらではわかりません。
Choose(c.Column, "○", "◎", "★")
A列〜C列の範囲内で取り出したセルの列番号によって(つまり 1,2,3のいずれか)
"○", "◎", "★"から「Choose」します。列がB(列番号は2)なら2番目の"◎"を
取得します。
c.EntireRow.Cells(3 + k).Value = c.EntireRow.Cells(3 + k).Value _
& Choose(c.Column, "○", "◎", "★")
.EntireRow.Cells(3 + k).Value この値を、元々あった値 とChooseで取得した値
とを連結した文字列に置き換えます。
|
|