
添付のような表があります。(実際は100行くらいあります)
例えばAさんは1/13,14,15と滞在する予定になっていますが、
日ごとに何人が滞在しているかカウントするマクロが作りたいです。
ボタンを押すと、1/13は何人、1/14は何人、、と結果が出てくるのが理想です。
また、(これはできればなのですが)BさんのようにD列に「前泊」という文字がある人については出発日の翌日から滞在としたいです。例えばBさんは1/15~17で滞在ということになります。
マクロ初心者なのですが調べようにもなんて調べたらいいのかも分からず、得意な方がいらっしゃれば教えていただきたいですm(__)m
ボタンの作り方や変数の定義など基本的な部分はネットで調べて分かるようになりました

No.10ベストアンサー
- 回答日時:
No9です。
No9は、急いで作ったので、整理されていませんでした。
整理しなおしたものを、下記のURLにアップしました。
要件を見直すと、滞在予定表を2度スキャンする必要がなくなりましたので、
1度のスキャンで終わるようにしました。
又、エラー発生時のメッセージを、エラー箇所がわかりやすくなるようにしました。集計結果は、No9と同じ内容になります。
https://ideone.com/RKWY0C
No.8
- 回答日時:
ほぼ、状況はわかりました。
当初と仕様が変わってますので、仕様の確認から行います。1.出発日と帰宅日です。
出発日 帰宅日
記入 記入 ・・・①
未記入 記入 ・・・②
記入 未記入 ・・・③
未記入 未記入 ・・・④
当初は①のみOKで、ほかのケースはNGということでしたが、
今回②のケースもOKとなりました。
③、④のケースは、どうなりますか。OKでしょうか、NGでしょうか。
②のケースの場合の人数カウントの方法ですが、どのようにしたいのでしょうか。
集計開始日 2025/1/1
集計終了日 2025/1/5
でAさんが(Aさんのみとします)
出発日 未記入
帰宅日 2015/1/2
のとき、
日付 人数
2025/1/1 1
2025/1/2 1
2025/1/3 0
2025/1/4 0
2025/1/5 0
となれば、よいのでしょうか。(D列は前泊でも、空白でも同じ結果となる)
もし、そうでないなら、例を挙げて示してください。
③、④のケースをOKとしたい場合は、人数のカウントの方法を②のケースのように提示してください。
2.集計開始日と集計終了日です。
以下のような集計開始日~集計終了日の範囲外に出発日と帰宅日があるケースの人数のカウント方法です。
集計開始日 2025/1/1
集計終了日 2025/1/5
の時、
氏名 前泊か否か 出発日 帰宅日
A 前泊 2024/12/30 2024/12/31・・・①
B 2025/1/6 2025/1/7・・・・②
C 前泊 2025/1/4 2025/1/7・・・・③
D 2024/12/30 2025/1/1・・・・④
①のケースは、2025/1/1~2025/1/5の間、人数カウントしない。
②のケースは、2025/1/1~2025/1/5の間、人数カウントしない。
③のケースは、2025/1/1~2025/1/4の間、人数カウントしない。
2025/1/5のみ1名分カウントする。
④のケースは、2024/12/30~2024/12/31の間、人数カウントしない。
2025/1/1のみ1名分カウントする。
上記のようなカウント方法で良いでしょうか。
3.最終行数を決定する列について
現在は、B列のNoが記入されている行を最終行にしています。
これで、よいのでしょうか。
それとも、C列の氏名が記入されている行を最終行にしたいのでしょうか。
4.歯抜けのある行について
現在は、歯抜けのある行は、エラーにしています。
この仕様で問題ないでしょうか。それとも、歯抜けのある行は、スキップして処理するようにしたいのでしょうか。その場合、歯抜けのある行についての定義を再確認する必要があります。
上記について、補足をお願いします。又、上記外に仕様が変わっているとこがあれば、それも提示してください。
No.7
- 回答日時:
>実際のファイルで実行したところ、↓でエラーが発生しました
>(start_date '集計開始日)
>(end_date '集計終了日)
>(sdate '滞在者の滞在開始日)
>(edate '滞在者の滞在終了日)
>For wdate = sdate To EDate
>'集計結果の行番号を算出する
>row2 = wdate - start_date + 2
>'算出した行に1加算する
>ws2.Cells(row2, "B").Value = ws2.Cells(row2, "B").Value + 1
>考えたところ、実際のファイルには過去データが存在することが原因かなと>思いました。(滞在開始日<集計開始日の行あり)
>予め伝えずに質問したのが悪いのですが、解決するのは結構おおがかりにな>りそうでしょうか
エラー発生時の、エラーメッセージの内容を提示してください。
エラー発生時、デバッグ状態になり、マクロのどこかの行で停止しますが、
上記のどの行で停止していますか。(停止した行は黄色になります)
滞在開始日<集計開始日の行あり・・・とのことですが、
滞在開始日の最も小さい値(最も古い日付)を集計開始日
にしているので、この事象は発生しないはずですが、滞在予定シートにはどのような記入をされているのでしょうか。
No.6
- 回答日時:
No4です。
添付図のように、行の歯抜けがあると、エラーが発生します。
7行目が歯抜けの行なので、その場合、E7のセルの日付が不正な日付になります。行の歯抜けは想定していません。もし、歯抜けが存在するようでしたら、その旨、補足してください。

No.5
- 回答日時:
No4です。
「滞在予定」シートの最終行は、B列の最終行で判断しています。
B列の添付図のようになっていると、9行目が最終行と判断します。
そのため、E9のセルは、空白なので日付不正になります。
もし、このような状態であれば、以下の対策を施してください。
対策案1又は対策案2の何れかを実施すればOKです。
対策案1:
8行目が実質的な最終行なので、B列の9行目以降を空白にする。
対策案2:
C列(氏名)で最終行の判断をする。
その場合は、
lastRow = ws1.Cells(Rows.count, "B").End(xlUp).Row 'B列最終行取得
を
lastRow = ws1.Cells(Rows.count, "C").End(xlUp).Row 'C列最終行取得
に変えてください。

No.4
- 回答日時:
>↓の部分で「日付不正」と出てきてしまいます。
表の位置など変えておりません。考えられる対策はありますでしょうかこの日付不正のメッセージが表示されると、その不正なセルを選択して、マクロが止まります。
その選択されたセルの内容は、どうなっていますか?
そのセルの内容が日付としておかしい場合に、エラーが発生します。
その選択されたセルには、何が表示されていますでしょうか。
No.3
- 回答日時:
こんばんは
マクロは多分No1様が作成してくれるでしょうから、別の方法での例です。
スピル機能が使えるバージョンでの例ですが・・
添付図では、I3セルに
=MAP(H3:H99,LAMBDA(d,IF(d="","",SUMPRODUCT(((E3:E99+(D3:D99="前泊"))<=d)*(d<=F3:F99)))))
の関数式を入力してあります。
これによって、H列に任意の日付を入力すると、その日付に応じた滞在人数がI列に表示されるようになります。
※ マクロの場合は、毎回計算を実行させる必要がありますが、関数の
場合は即時に反映してくれます。
※ シート内の「日付」は全てシリアル値(=エクセルの日付型の数値)
であるものと仮定しています。
ご参考にでもなれば。

No.2
- 回答日時:
下記にアップしました。
標準モジュールに登録してください。
https://ideone.com/CR1YW2
「滞在予定」シートは提示されたレイアウト通りであることが前提です。
空の「集計結果」のシートをあらかじめ作成しておいてください。
集計結果のA列に日付、B列に人数を出力します。
「滞在予定」シートのD列は、空白か前泊となります。(前泊以外の文字があるとエラーとなります)
No.1
- 回答日時:
1.日ごとに何人が滞在しているかをどのような表に出力したいのでしょうか。
そのレイアウトを提示していただけませんでしょうか。2.日ごとに何人が滞在しているかを出力するシートと、客の滞在予定の表が、異なるシートなら、それぞれのシート名も提示してください。
3.出発日と帰宅日は、ともに日付が必ず設定されてますでしょうか。
(どちらかの日付が空欄のようなケースはない。)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
VBAの「To」という語句について
Visual Basic(VBA)
-
不要項目の行削除方法について
Visual Basic(VBA)
-
vbaマクロについて
Visual Basic(VBA)
-
-
4
VBA 同じフォルダ内のすべてのファイルに同じセルをペーストしたい
Visual Basic(VBA)
-
5
VBAから書き込んだ条件付き初期の挙動について
Visual Basic(VBA)
-
6
(EXCEL超初心者)EXCELの関数(またはマクロ)で質問です。
Visual Basic(VBA)
-
7
VBA 最終行の取得がうまくいかず上書きされてしまいます。
Visual Basic(VBA)
-
8
VBAでユーザーフォームを指定回数繰り返して入力を行う方法
Visual Basic(VBA)
-
9
以下のプログラムの実行結果はどうなると思いますか? その理由も教えてください。
Visual Basic(VBA)
-
10
ExcelのVBAコードについて教えてください。
Visual Basic(VBA)
-
11
質問58753 このコードでうまく動作しません。どうしたら良いですか Private Sub Wor
Visual Basic(VBA)
-
12
Excelの条件付き書式のコピーと参照セルを自動で変えるようにする方法
Excel(エクセル)
-
13
算術演算子「¥」の意味について
Visual Basic(VBA)
-
14
VB.net 文字列から日付型へ変更したい
Visual Basic(VBA)
-
15
VBAでFOR NEXT分を Application.OnTimeを使って
Visual Basic(VBA)
-
16
改行文字「vbCrLf」とは
Visual Basic(VBA)
-
17
エクセルの改行について
Visual Basic(VBA)
-
18
エクセルのセンス 参照するシートが多いときのファイルの作り方
Excel(エクセル)
-
19
エクセルのブック名の付け方
Excel(エクセル)
-
20
PC Excel マクロ
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA セル間のリンク修正につい...
-
vba textboxへの入力について教...
-
複数のExcelファイルをマージす...
-
【マクロ】並び替えの範囲が、...
-
VBA ユーザーフォーム ボタンク...
-
Vba Array関数について教えてく...
-
【マクロ】シートの変数へ入れ...
-
【マクロ】売上一覧YYYYMMDDHHS...
-
【マクロ】開いているブックの...
-
ワードの図形にマクロを登録で...
-
えくせるのVBAコードについて教...
-
エクエルのVBAコードについて教...
-
Excel VBA 選択範囲の罫線色の...
-
[VB.net] ボタン(Flat)のEnable...
-
VBAでCOPYを繰り返すと、処理が...
-
vbaにてseleniumを使用したedge...
-
Vba セルの4辺について罫線が有...
-
vbsでのwebフォームへの入力制限?
-
エクセルのマクロについて教え...
-
エクセルの改行について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA セル間のリンク修正につい...
-
VBAでCOPYを繰り返すと、処理が...
-
vba textboxへの入力について教...
-
【マクロ】シートの変数へ入れ...
-
【マクロ】並び替えの範囲が、...
-
Vba Array関数について教えてく...
-
Vba セルの4辺について罫線が有...
-
【マクロ】開いているブックの...
-
複数のExcelファイルをマージす...
-
【マクロ】売上一覧YYYYMMDDHHS...
-
【ExcelVBA】5万行以上のデー...
-
vbsでのwebフォームへの入力制限?
-
[VB.net] ボタン(Flat)のEnable...
-
Excelのマクロについて教えてく...
-
【ExcelVBA】値を変更しながら...
-
改行文字「vbCrLf」とは
-
算術演算子「¥」の意味について
-
VBAでセルの書式を変えずに文字...
-
VBAの「To」という語句について
-
VB.net 文字列から日付型へ変更...
おすすめ情報
1.レイアウトは何でもいいと思っています。列が二つあって1列目が日付(今回でいうと1/13,1/14・・・)2列目が人数という表ができあがればよいかなと思っています。
2.滞在予定の表があるシートが「滞在予定」人数をカウントするシートが「集計結果」としようと思っています。
3.必ず設定されています
よろしくお願い致します・・・!
ありがとうございます、
すみません、実際に実行してみて質問なのですが、
↓の部分で「日付不正」と出てきてしまいます。表の位置など変えておりません。考えられる対策はありますでしょうか
'出発日チェック
If IsDate(ws1.Cells(row1, "E").Value) = False Then
Call err_proc(ws1, ws1.Cells(row1, "E"), "日付不正")
End If
'帰宅日チェック
If IsDate(ws1.Cells(row1, "F").Value) = False Then
Call err_proc(ws1, ws1.Cells(row1, "F"), "日付不正")
End If
親切な回答ありがとうございます。教えていただいた内容で1つ1つ解決してます
実際のファイルで実行したところ、↓でエラーが発生しました
(start_date '集計開始日)
(end_date '集計終了日)
(sdate '滞在者の滞在開始日)
(edate '滞在者の滞在終了日)
For wdate = sdate To EDate
'集計結果の行番号を算出する
row2 = wdate - start_date + 2
'算出した行に1加算する
ws2.Cells(row2, "B").Value = ws2.Cells(row2, "B").Value + 1
考えたところ、実際のファイルには過去データが存在することが原因かなと思いました。(滞在開始日<集計開始日の行あり)
予め伝えずに質問したのが悪いのですが、解決するのは結構おおがかりになりそうでしょうか
アプリケーション定義またはオブジェクト定義のエラーです、というメッセージが出て
ws2.Cells(row2, "B").Value = ws2.Cells(row2, "B").Value + 1
ここで止まりました。
sdateに過去日付が入り、start_dateが1/13なのでrow2がマイナスの値になっていたことが気になりました。
関係あるか分からないのですが出発日が未記入の行も存在したためFor分の前にIf IsDate(sdate) Thenを追加しました(最初にsdateの型の定義をしているとIsDateがすべてTRUEになってしまうと思ったので最初のDim~みたいなのはコメントアウトしました)
すみません、連続の投稿になります。
画像のようなボタンを作って↓のように集計開始日をセットしたのが原因でした。。
start_date = ws1.Cells(1, "AG").Value
end_date = ws1.Cells(2, "AG").Value
当初基本的な動きだけ教えてもらい、あとの細かい仕様は自分で考えようと思っていたのですが
全然うまくいきませんでした。
結局また仕様の確認をしていただくことになってしまいすみませんm(__)m
1.①~④、まですべてOKになります。
>②のケースの場合の人数カウントの方法ですが、どのようにしたいのでしょうか。
→➁~④のすべてのケースの場合は処理をスキップしたいです。(前泊という文字があっても0人としてよい)
2.記載いただいたカウント方法で合っています。
3.C列の名前が入っている行を最終行にしたいです。
4.歯抜けのある行はエラーになる仕様で問題ありません。
関係ないかもしれませんが、先ほど貼った画像のようなボタンはws1に作成しました。