Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


2378 / 13645 ツリー ←次へ | 前へ→

【68372】日付を記号で HIRO 11/2/28(月) 13:52 質問[未読]
【68373】Re:日付を記号で とおりすがり 11/2/28(月) 14:38 回答[未読]
【68374】Re:日付を記号で UO3 11/2/28(月) 14:43 発言[未読]
【68375】Re:日付を記号で UO3 11/2/28(月) 14:46 発言[未読]
【68383】Re:日付を記号で HIRO 11/3/1(火) 16:22 質問[未読]
【68384】Re:日付を記号で UO3 11/3/1(火) 21:04 回答[未読]
【68385】Re:日付を記号で とおりすがり 11/3/1(火) 21:33 回答[未読]
【68386】Re:日付を記号で UO3 11/3/1(火) 21:53 回答[未読]
【68387】Re:日付を記号で UO3 11/3/1(火) 22:04 発言[未読]

【68372】日付を記号で
質問  HIRO  - 11/2/28(月) 13:52 -

引用なし
パスワード
   下記コードを詳しく説明してもらえないでしょうか?
お願いします。

Sub Test_2()
  Dim i As Long, j As Long, k As Long
  Dim c As Range
  
  For i = 1 To 3
    j = WorksheetFunction.Max(j, Cells(Rows.Count, i).End(xlUp).Row)
  Next i
  If j >= 2 Then
    Range("D2:D" & j).Resize(, 48).ClearContents
    For Each c In Range("A2:C" & j)
      If IsDate(c.Value) Then
        k = (Month(c.Value2) - 1) * 4 + _
          WorksheetFunction.Match(Day(c.Value2), Array(1, 8, 16, 23), 1)
        c.EntireRow.Cells(3 + k).Value = c.EntireRow.Cells(3 + k).Value _
          & Choose(c.Column, "○", "◎", "★")
      End If
    Next
  End If
End Sub

【68373】Re:日付を記号で
回答  とおりすがり  - 11/2/28(月) 14:38 -

引用なし
パスワード
   ▼HIRO さん:


「A2」に入力した日付を1ヶ月を4分割している「B2:E2」の該当する箇所に
自動で「○」を入力することは出来るでしょうか?

下図は「1月10日」なので1月を4分割した「C2」に○が入ります。

   A   B C D E
1  納品日    1月
2  1/10    ○


1.右にも続いています。
2.今のところは1年分で考えています。
3・表示形式でm/dになっています
4.1ヶ月の4分割は
1日〜7日、8日〜15日、16日〜22日、23日〜30日で考えていますが
絶対にコレという訳ではありません。

欲を言えば、実際日付を入力する欄は3箇所(A:C)にあり
○、◎、★をそれぞれ付けようと思っています。

といったことをやっている。

【68374】Re:日付を記号で
発言  UO3  - 11/2/28(月) 14:43 -

引用なし
パスワード
   ▼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で取得した値
とを連結した文字列に置き換えます。

【68375】Re:日付を記号で
発言  UO3  - 11/2/28(月) 14:46 -

引用なし
パスワード
  
Range("D2:D" & j).Resize(, 48).ClearContents

D列の2行目から、「最終行」までの値をクリアします。


Resize(,48)を見落としていました。

正しくは

D列の2行目から、AY列の「最終行」までの値をクリアします。

【68383】Re:日付を記号で
質問  HIRO  - 11/3/1(火) 16:22 -

引用なし
パスワード
   UO3 さん
解説ありがとうございます。

またさらに質問なんですが

同じケースで
・日付は(A2:C2)の3箇所ではなく(G2,H2,I2)
・期間は2010/9〜2012/3まで

という場合にはどうしたらいいでしょうか?

日付の欄が飛んでいたり、年は違うけど日付が同じだった場合の
ケースがよくわからなかったので・・・。

宜しくお願いいたします。

【68384】Re:日付を記号で
回答  UO3  - 11/3/1(火) 21:04 -

引用なし
パスワード
   ▼HIRO さん:

オリジナルのトピ、私もちょっとだけ参加したような記憶があるんですが
物忘れが激しく、どれだったかがみあたりません。
URLを記載いただけませんか。
そこで、要件をじっくり読ませていただいて考えてみます。

【68385】Re:日付を記号で
回答  とおりすがり  - 11/3/1(火) 21:33 -

引用なし
パスワード
   ▼UO3 さん:
//excelfactory.net/excelboard/excelvba/excel.cgi?mode=all&namber=143505&rev=0

よそ。

【68386】Re:日付を記号で
回答  UO3  - 11/3/1(火) 21:53 -

引用なし
パスワード
   ▼HIRO さん:

とおりすがりさんが示唆されているように、あちらでは、複数の回答者さんたちから
今回アップされたコードも含め、コード案がでているわけです。
それにたいしてHIROさん(MEGUMIさん?)からのレスが一切ないままに
また、トピをクローズしないままに、こちらで要件変更によるコード対応を
質問されるのは、いかがなものかと思います。
こちらはクローズし、あちらで、皆さんへのコメントとともに再質問されるべきかと。

また、コードをアップされた回答者さんたちの方が要件変更対応も早いはずです。

【68387】Re:日付を記号で
発言  UO3  - 11/3/1(火) 22:04 -

引用なし
パスワード
   ▼HIRO さん:

追伸です。
元スレで追加質問される場合、"○", "◎", "★"を、どの列に表示したいのか
出力要件を明確にされることが必要です。今は12ヶ月分しか設定がないはずですので
2010/9だったらどこの列なのか、2011/9だったらどこの列なのか、
そもそも最初の1月の列は何年の1月なのか、そのあたりも明確にしないと
コードがかけませんので。

2378 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free