🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Q&A

解決済

1回答

653閲覧

VBAマクロ 行と列を生成して特定のセルに値や関数を入れる方法

mioi24

総合スコア1

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

0グッド

0クリップ

投稿2024/05/11 02:57

編集2024/05/11 03:54

実現したいこと

EXCELの宿泊者名簿があります。

A B C
チェックイン日(日付) チェックアウト日(日付) 泊数(数値)

が入っています。

VBAマクロで実現したいことは、
1)泊数の数値に合わせて、直下に行を生成したい。
2)生成した行のA列に、日付を記述したい。   
3)その上で、A列とB列の間に3列追加して、それぞれに曜日や関数を入れたい。
です。

発生している問題・分からないこと

以下に詳しく書きます。


1)泊数の数値に合わせて、直下に行を生成したい。

具体的には、泊数から1を引いた行数を生成したいです。
泊数が3なら、直下に2行増えてほしいです。


2)生成した行のA列に、日付を記述したい。

具体的には、チェックイン日から1日ずつ増やした日付を記述したいです。

A B C
2024/1/1 2024/1/4 3
が、
A B C
2024/1/1 2024/1/4 3
2024/1/2         ←生成された行 
2024/1/3         ←生成された行
となって欲しいです。  


3)その上で、A列とB列の間に3列追加して、それぞれに曜日や関数を入れたい。

具体的には
追加1列目:Aの曜日(祝日も判定)
追加2列目:Aの【翌日】の曜日(祝日も判定)
追加4列目:とあるIF関数
をそれぞれ入れたいです。

A B C
2024/1/1 2024/1/4 3
が、
A B C D E F
2024/1/1 祝 火 IF関数 2024/1/4 3
2024/1/2 火 水 IF関数 (空欄) (空欄)
2024/1/3 水 木 IF関数 (空欄) (空欄)
となってほしいです。

分かりづらい説明で恐縮です。
一部だけでもご教授いただける方がいらっしゃいましたら、
ぜひよろしくお願いいたします。

該当のソースコード

特になし

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

2日かけてネットでも探したのですが、
該当しそうなソースに辿りつくことが出来ずにいます。
サポートをいただけたら嬉しいです。

補足

特になし

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2024/05/11 03:07

> ネットで調べることで、 > 1)泊数の数値に合わせて、直下に行を生成したい。 > は実現できたのですが、それ以外はうまく調べることが出来ずにいます。 1)は解決済ということですね。質問の最後に書かれても分かりにくいので、「実現したいこと」の欄で明示した方が良いと思います。 また、2)についても簡単に調べられそうですがどうやって調べましたか?何一つ情報は得られませんでしたか?
mioi24

2024/05/11 03:41

コメントをありがとうございます。 >1)は解決済ということですね。質問の最後に書かれても分かりにくいので、 > 「実現したいこと」の欄で明示した方が良いと思います。 1)~3)を一度に実現できるVBAソースをご教授いただきたいと思ったので、 実現したいことをすべて書く必要があると考えました。 ですので、 > ネットで調べることで、 > 1)泊数の数値に合わせて、直下に行を生成したい。 > は実現できたのですが、 と書いたほうを削除したいと思います。ご指摘をありがとうございました。 >また、2)についても簡単に調べられそうですがどうやって調べましたか? >何一つ情報は得られませんでしたか? 恥ずかしながら実現できそうなソースを見つけることができませんでした。
guest

回答1

0

ベストアンサー

1行目から100行目まで、データが入っているとした場合は下記のようになります
要件が明らかにされていないところはこちらで勝手に補っています。
"IF関数"のところは好みの数式を入れてください。

Sub x() Dim s(100, 6) '祝日 l = Split("2024/1/1,2024/1/8,2024/2/11,2024/2/12,2024/2/23,2024/3/20,2024/4/29,2024/5/3,2024/5/4,2024/5/5,2024/5/6,2024/7/15,2024/8/11,2024/8/12,2024/9/16,2024/9/22,2024/9/23,2024/10/14,2024/11/3,2024/11/4,2024/11/23", ",") n = ActiveSheet.Range("A1:C100").Value k = 0 For i = 1 To 100 For j = 1 To n(i, 3) '開始日行特有の処理 If (j = 1) Then s(k, 4) = n(i, 2): s(k, 5) = n(i, 3) s(k, 0) = n(i, 1) + j - 1 s(k, 1) = y(s(k, 0), l) s(k, 2) = y(s(k, 0) + 1, l) s(k, 3) = "IF関数" k = k + 1 Next Next ActiveSheet.Range("A1:F100") = s End Sub Private Function y(a, l) For Each m In l If DateValue(m) = DateValue(a) Then y = "祝": Exit Function Next y = "=text(datevalue(""" & a & """),""aaa"")" End Function

コメント内の要件変更に対応した追記

(2024/05/12 08:29のコメント)

施設名 予約サイト名は、2行目と3行目にも入れたいです。
下記のようになることを希望しております。
A B C D E F G H
施設名 予約サイト名 2024/1/1 祝 火 IF関数 2024/1/4 3
施設名 予約サイト名 2024/1/2 火 水 IF関数
施設名 予約サイト名 2024/1/3 水 木 

Sub x() Dim s(100, 8) l = Split("2024/1/1,2024/1/8,2024/2/11,2024/2/12,2024/2/23,2024/3/20,2024/4/29,2024/5/3,2024/5/4,2024/5/5,2024/5/6,2024/7/15,2024/8/11,2024/8/12,2024/9/16,2024/9/22,2024/9/23,2024/10/14,2024/11/3,2024/11/4,2024/11/23", ",") n = ActiveSheet.Range("A1:H100").Value k = 0 For i = 1 To 100 For j = 1 To n(i, 5) '開始日の行特有の処理 If (j = 1) Then s(k, 6) = n(i, 4): s(k, 7) = n(i, 5) s(k, 0) = n(i, 1) s(k, 1) = n(i, 2) s(k, 2) = n(i, 3) + j - 1 s(k, 3) = y(s(k, 2), l) s(k, 4) = y(s(k, 2) + 1, l) s(k, 5) = "IF関数" k = k + 1 Next Next ActiveSheet.Range("A1:H100") = s End Sub Provate Function y(a, l) For Each m In l If DateValue(m) = DateValue(a) Then y = "祝": Exit Function Next y = "=text(datevalue(""" & a & """),""aaa"")" End Function

投稿2024/05/11 04:49

編集2024/05/12 01:32
patapi

総合スコア810

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mioi24

2024/05/11 11:30

kotori_aさま 大変ぶしつけな丸投げ質問だったにも関わらず、 要件情報が足りていないにも関わらず、 コードを書いてくださってありがとうございました!! 本当に感謝いたします。 実際にはチェックイン日と泊数が、 AとCではなくCとEにあるので、 書いてくださったコードをアレンジしてみようと試みております。 でも下記では動作せずエラーが出てしまいます。 非常にとんちんかんなアレンジをしていると思うので たいへんお恥ずかしいのですが CとEにある場合のアレンジをご教授いただけたら大変助かります💦 Sub x() Dim s(100, 8) '祝日 l = Split("2024/1/1,2024/1/8,2024/2/11,2024/2/12,2024/2/23,2024/3/20,2024/4/29,2024/5/3,2024/5/4,2024/5/5,2024/5/6,2024/7/15,2024/8/11,2024/8/12,2024/9/16,2024/9/22,2024/9/23,2024/10/14,2024/11/3,2024/11/4,2024/11/23", ",") n = ActiveSheet.Range("A1:E100").Value k = 0 For i = 1 To 100 For j = 1 To n(i, 5) '開始日の行特有の処理 If (j = 1) Then s(k, 6) = n(i, 2): s(k, 7) = n(i, 5) s(k, 2) = n(i, 1) + j - 1 s(k, 3) = y(s(k, 0), l) s(k, 4) = y(s(k, 0) + 1, l) s(k, 5) = "IF関数" k = k + 1 Next Next ActiveSheet.Range("A1:H100") = s End Sub
patapi

2024/05/11 14:43 編集

あ、そうなんですね。 3つ、まだわからないことがあるので教えてください↓ (1)「 実際にはチェックイン日と泊数が、AとCではなくCとEにある」とのことですが、チェックアウト日は変わらずB列にあるという理解でよいですか? それともチェックアウト日も質問とは違い、B列ではなくD列にあるのでしょうか? (2)同様に祝日はどの列に記録すべきですか? (3)「エラーが出る」とのことですが、コードのどこで、どのようなエラーが出ていますか? 質問の編集ボタンを押してエラー画面のスクリーンショットを追加で貼るか、エラーの発生箇所とエラー内容を省略せず1字1句違わずそのまま書いてください。 --------
mioi24

2024/05/11 15:02 編集

ご多忙の中こんな拙い相談にお付き合いいただき、 本当にありがとうございます…! お言葉に甘えて下記書かせていたただきます! (1) おたずねありがとうございます。 チェックアウト日はD列にあります。 A B C D E 施設名 予約サイト名 チェックイン日 チェックアウト日 泊数 となっております。 (2) 「(祝日などの)曜日」と「翌日の曜日」は、マクロ実行後のD列・E列に表示されて欲しいです。 ↓こうなると嬉しいです。 A B C D E F G H 施設名 予約サイト名 2024/1/1 祝 火 IF関数 2024/1/4 3 (3) こちらもありがとうございます! あれからさらに下記(★★★以下)のようにアレンジして実行したところ、エラーは出なくなり、おかげさまで実現したかったことが出来るようになったのですが、A列・B列のデータが消えてしまいます。 つまり、 A B C D E 施設名 予約サイト名 2024/1/1 2024/1/4 3 が、 A B C D E F G H (空欄) (空欄) 2024/1/1 祝 火 IF関数 2024/1/4 3 (空欄) (空欄) 2024/1/2 火 水 IF関数 (空欄) (空欄) 2024/1/3 水 木 IF関数 となるようになりました。 何度も甘えてしまい恐縮なのですが、 A列・B列は、元の行の値がそのままコピーされると大変ありがたいです💦 ★★★ Sub STEP1() Dim s(100, 8) '祝日 l = Split("2024/1/1,2024/1/8,2024/2/11,2024/2/12,2024/2/23,2024/3/20,2024/4/29,2024/5/3,2024/5/4,2024/5/5,2024/5/6,2024/7/15,2024/8/11,2024/8/12,2024/9/16,2024/9/22,2024/9/23,2024/10/14,2024/11/3,2024/11/4,2024/11/23", ",") n = ActiveSheet.Range("A1:E100").Value k = 0 For i = 1 To 100 For j = 1 To n(i, 5) '開始日の行特有の処理 If (j = 1) Then s(k, 6) = n(i, 4): s(k, 7) = n(i, 5) s(k, 2) = n(i, 3) + j - 1 s(k, 3) = y(s(k, 2), l) s(k, 4) = y(s(k, 2) + 1, l) s(k, 5) = "IF関数" k = k + 1 Next Next ActiveSheet.Range("A1:H100") = s End Sub Private Function y(a, l) For Each m In l If DateValue(m) = DateValue(a) Then y = "祝": Exit Function Next y = "=text(datevalue(""" & a & """),""aaa"")" End Function
mioi24

2024/05/11 15:04

↑回答に追記いたしました、よろしくお願いいたしますm(__)m
patapi

2024/05/11 16:05

う~ん、まだ不明な点があります。 A B C D E 施設名 予約サイト名 2024/1/1 2024/1/4 3 のとき、 A列とB列の「施設名 予約サイト名」をは1行目だけあればよいのでしょうか? 具体的には、 A B C D E F G H 施設名 予約サイト名 2024/1/1 祝 火 IF関数 2024/1/4 3 (空欄) (空欄) 2024/1/2 火 水 IF関数 (空欄) (空欄) 2024/1/3 水 木 IF関数 とするのでしょうか? それとも2行目と3行目にも施設名 予約サイト名 を入れて A B C D E F G H 施設名 予約サイト名 2024/1/1 祝 火 IF関数 2024/1/4 3 施設名 予約サイト名 2024/1/2 火 水 IF関数 施設名 予約サイト名 2024/1/3 水 木 IF関数 としなければなりませんか?
mioi24

2024/05/11 23:29

お返事ありがとうございます! >何度も甘えてしまい恐縮なのですが、 >A列・B列は、元の行の値がそのままコピーされると大変ありがたいです💦 ↑この書き方がわかりにくくてすみませんでした。 施設名 予約サイト名は、2行目と3行目にも入れたいです。 下記のようになることを希望しております。 >それとも2行目と3行目にも施設名 予約サイト名 を入れて >A B C D E F G H >施設名 予約サイト名 2024/1/1 祝 火 IF関数 2024/1/4 3 >施設名 予約サイト名 2024/1/2 火 水 IF関数 >施設名 予約サイト名 2024/1/3 水 木 IF関数 何度も本当にありがとうございます。
patapi

2024/05/12 01:31 編集

後半にコートを追加しました。うまくうごいたらベストアンサーをつけて質問をクローズしてください(これ以上の要件追加は勘弁してくださいな。追加で質問場合は質問をあたらしくつくってください)
mioi24

2024/05/12 01:48

ぶしつけな質問にも関わらず、 何度もご対応いただき、 助けていただき本当にありがとうございました! おかげさまで無事に動きまして、 さらにいろいろなアレンジを進めることができました。 本当に感謝いたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問