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