| 
    
     |  | ▼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で取得した値
 とを連結した文字列に置き換えます。
 
 |  |