Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Home : Excel 2019)
利用予定表をデータ化したい
投稿日時: 22/12/21 11:30:33
投稿者: カールおじさん

下図のような利用予定表が、4月〜翌年3月まであります(シート名は4月〜3月)
予定表の説明
C1:西暦年(表示形式で[0”年”])
C2:月数(表示形式で[0”月”] C2〜E2を結合)
D1:施設名(表示形式で[@利用予定表])
日付:西暦年月日(表示形式で[d])
利用時間帯:
午前:開始時間 8:30 終了時間 12:00
午後:開始時間 13:00 終了時間 17:00
夜間:開始時間 17:30 終了時間21:30
午前〜午後:開始時間 8:30 終了時間 17:00 (午前午後のセルを結合 下表2日)
午後〜夜間:開始時間13:00 終了時間 21:30 (午後夜間のセルを結合 下表3日)
午前〜夜間:開始時間 8:30 終了時間 17:00 (午前午後夜間のセルを結合 下表8日)
[/code]
    A    B      C          D          E
1            2022年    剣道場利用予定表    
2            12 月        
3    日    曜日    午   前    午   後    夜   間
4    1    木    剣道同好会    昭和太極拳    空手道悠心会
5    2    金       居合道同好会大会        
6    3    土    山田 太郎       空手道連盟大会    
7    4    日            
8    5    月    剣道同好会        
9    6    火            昭和太極拳    
10    7    水    山田 太郎            棒術愛好会
11    8    木           市民剣道大会        
12    9    金            


この表から下表のように4月〜3月をデータベース化したいです

     A       B     C     D     E
1     使用日     開始時間 終了時間 施設名    予約者名・行事名
2    2022/12/1    9:00    12:00    剣道場    剣道同好会
3    2022/12/1    13:00    17:00    剣道場    昭和太極拳
4    2022/12/1    18:00    21:00    剣道場    空手道悠心会
5    2022/12/2    9:00    17:00    剣道場    居合道同好会大会
6    2022/12/3    9:00    12:00    剣道場    山田 太郎
7    2022/12/3    13:00    21:00    剣道場    空手道連盟大会
8    2022/12/5    9:00    12:00    剣道場    剣道同好会
9    2022/12/6    13:00    17:00    剣道場    昭和太極拳
10    2022/12/7    9:00    12:00    剣道場    山田 太郎
11    2022/12/7    18:00    21:00    剣道場    棒術愛好会
12    2022/12/8    9:00    21:00    剣道場    市民剣道大会
13                    
ここで質問ですが
1日のように全時間帯がそれぞれ異なる団体で埋まっているいるのなら
For i=4 to 月末日行番号
	For j=3 to 5
		Cells(i,j)
		以下略
	Next J
Next i
でデータを取得できますが、空欄時間帯が有ったり全日利用がなかったり午前・午後や
午後・夜間や午前〜夜間のようにセルが結合されている場合の処理手順がわかりません。
どの様な手順・コードでやったらよいかご指導いただければと思います。

回答
投稿日時: 22/12/21 13:12:20
投稿者: simple

> 午前〜夜間:開始時間 8:30 終了時間 17:00 (午前午後夜間のセルを結合 下表8日)
終了時間は17:00ですか?
 
下表の
> 2 2022/12/1 9:00 12:00 剣道場 剣道同好会
9:00はどこから読み取るのですか?
前提を再度見直されたらいかがですか?
 
質問のポイントですが、

引用:
午後・夜間や午前〜夜間のようにセルが結合されている場合の処理手順がわかりません。

これについては、
午前、午後、夜間の各セルごとに、以下の方針で順次処理を行えばよいと思います。
・MergeAreaで結合セルを取得
・実施済みの結合セルのアドレスをdictionaryに登録することとし、
・もしMergeAreaのアドレスが辞書になければ(未処理なら)、
      ・データベースへの登録処理を行い、
      ・結合セルのアドレスをdictionaryに登録
・もしMergeAreaのアドレスが辞書にあれば  (処理済みなら)、
      何もせずにスキップ

回答
投稿日時: 22/12/21 15:09:11
投稿者: Suzu

セルが結合しているかどうかは、
 
 
MerageArea で取得できるのは、結合範囲のRangeオブジェクトです。
 
その中で、
 先頭セルは、Cells(i, j).MergeArea.Cells(1)
 終端セルは、Cells(i, j).MergeArea.Cells(Cells(i, j).MergeArea.Cells.Count)
で取得できます。
 
その辺りを使えば 良いでしょう。
 
 
If Cells(i, j).MergeCells Then
 With Cells(i, j).MergeArea
  If .Cells(1).Address = Cells(i, j).Address Then
   If Cells(1).Value <> "" Then
    wst1.Cells(k, 1) = DateSerial(y, m, Day(Cells(i, 1).Value))
    wst1.Cells(k, 2) = Switch( .Cells(1).Column = 3, #8:30:00 AM#, _
                                  .Cells(1).Column = 4, #1:00:00 PM#, _
                                  .Cells(1).Column = 5, #5:30:00 PM#)
    wst1.Cells(k, 3) = Switch( .Cells(.Cells.Count).Column = 3, #12:00:00 PM#, _
                                 .Cells(.Cells.Count).Column = 4, #5:00:00 PM#, _
                                 .Cells(.Cells.Count).Column = 5, #9:30:00 PM#)
     k=k+1
  :

投稿日時: 22/12/21 23:27:09
投稿者: カールおじさん

simple様
> 午前〜夜間:開始時間 8:30 終了時間 17:00 (午前午後夜間のセルを結合 下表8日)
>終了時間は17:00ですか?
21:30の間違いでした。
 
> 2 2022/12/1 9:00 12:00 剣道場 剣道同好会
>9:00はどこから読み取るのですか?
下表の午前の部の開始時間はすべて、8:30 です。
下表の夜間の部の終了時間はすべて、21:30 です。
お願をしておきながらミスが沢山あり申し訳ございません。

回答
投稿日時: 22/12/22 16:30:31
投稿者: simple

回答ありがとうございました。
 
Suzuさんから適切な回答をいただいていますので、そちらを参考になさってください。
私のは没ということで。

投稿日時: 22/12/22 22:10:15
投稿者: カールおじさん

Suzuさん
MergeAreaなんてあるんですね。
ご指導いただいた内容でっやってみます。
ありがとうございます。