『結合セルに日付を入力』(Rino) 初めまして。VBA初心者です。 VBA先達の皆様に質問です。 2×2の結合セル70行分(結合セルなので35個の結合セル)があります。メッセージボックスで指定した月日を入力し、頭の結合セルからその日とそれ以降の日付を自動で入力できるようにしたいのですが、 頭の結合セルと月が変わった時の結合セルだけ1/1のように/で月と日を入力し、 それ以外は日にちの数字だけ入力することは可能でしょうか? もし可能なのであれば、そのコードを教えていただけないでしょうか? < 使用 Excel:Microsoft365、使用 OS:unknown > ---- 作りかけでも、まずどこまでできているのかを示してみてはいかがでしょうか。 (西瓜) 2023/08/07(月) 13:00:43 ---- 過去ログです。 参考になるかもしれません。 ※マクロではありません [[20060714095031]] 『カレンダー』(みど) 今回は結合セルですので、工夫が必要です。 (MK) 2023/08/07(月) 14:07:44 ---- 西瓜さん、大変失礼しました。 まだまだ全然途中かけで拙いコードとなりますが、、、 Sub 日付() Dim i As Long Dim A As Long Dim day As Variant A = Cells(Rows.Count, 4).End(xlUp).Row For i = 9 To A   day = Application.InputBox("日付を入力してください。", _   Title:="日付入力")  If Not IsDate(day) Then MsgBox "日付の入力が間違っています。" Else Range("i,4").MergeArea = IsDate(Date)  End If Next i End Sub このように書いています。 Range("i,4").MergeArea = IsDate(Date) のところでエラーが出ます。 IsDateではなく、InputBoxで入力した日付を指定すると思っているんですが、どのように書けばいいか分かりません。 ご助力お願いできますでしょうか? (Rino) 2023/08/07(月) 14:14:19 ---- みどさんありがとうございます。 関数で行う方法ですね!難しそうですが参考にさせていただきます。 (Rino) 2023/08/07(月) 14:17:28 ---- みどさんではなく、MKさんでした。大変失礼しました。 (Rino) 2023/08/07(月) 14:18:52 ---- >Range("i,4").MergeArea = IsDate(Date) ここは Cells(i,4).Value = day でよいと思います。 CellsとRangeの値指定で戸惑うことはよくあると思います。 繰り返しで慣れていきましょう。 (西瓜) 2023/08/07(月) 14:20:06 ---- >For i = 9 To A あとここは For i = 9 To A Step 2 こうするとiの値を2ずつ増加させることができます。 (西瓜) 2023/08/07(月) 14:21:40 ---- Sub 日付() Dim i As Long Dim A As Long Dim day As Variant A = Cells(Rows.Count, 4).End(xlUp).Row day = Application.InputBox("日付を入力してください。", Title:="日付入力") If Not IsDate(day) Then MsgBox "日付の入力が間違っています。" Else Cells(9, 4).Value = day For i = 11 To A Step 2 Cells(i, 4).Value = Cells(i - 2, 4).Value + 1 Next i End If End Sub ほかにもいくつか直すとこんな感じではないかと思います。 (西瓜) 2023/08/07(月) 14:26:21 ---- 関数での方法です。 A1は日付を手入力(書式はm/d) (A1~B2)を結合しておく A3 =IF(DAY($A$1+INT((ROW()-1)/2))=1,TEXT($A$1+INT((ROW()-1)/2),"M/D"),TEXT($A$1+INT((ROW()-1)/2),"D")) でA3〜B4を結合 A3をA70までコピペ (MK) 2023/08/07(月) 14:41:49 ---- >IsDate(Date) ()の中が日付データであるか否かを判定しています。 でDateは今日の日付です。 ですので、IsDate(Date)は必ずTrueになります。 値や式を代入できるのは、単一のセルです。 結合セルの一番左上のセルに値や式を代入してください。 ※やり方は西瓜さんのコードのとおりです。 (MK) 2023/08/07(月) 14:55:57 ---- 参考まで。 https://excel-ubara.com/excelvba1/EXCELVBA385.html >MergeArea >指定されたセルがある結合セル範囲を表すRangeオブジェクトを返します。 >指定されたセルが結合セル範囲にない場合、このプロパティは指定されたセルを返します。 >値の取得のみ可能です。 (MK) 2023/08/07(月) 15:02:47 ---- MKさん、関数の方法で日付を入れることができました。(式の仕組みは馬鹿な私にはちゃんと理解できてはいませんが、、、笑) ありがとうございました。ちなみにD9:E10の結合セルが最初の日付になるのですが、A1の手入力した日付の4日後からの日付でスタートします。何故なのでしょうか? 西瓜さん、コードの添削ありがとうございました。 教えていただいたコードでエラーなく頭のセルに日付が入力されたのですが、それ以降のセルには日付が入力されず,,,といった具合だったのですが、 Cells(i, 4).Value = Cells(i - 2, 4).Value + 1 の後に、何か+αでコードが必要なのでしょうか? お二方、何度もすみません。汗) (Rino) 2023/08/07(月) 16:20:47 ---- >教えていただいたコードでエラーなく頭のセルに日付が入力されたのですが、それ以降のセルには日付が入力されず,,,といった具合だったのですが、 D列が空白セルならばそうなるコードです。 A = Cells(Rows.Count, 4).End(xlUp).Row ここでD列の最終行を取得し、その行までデータを入力するコードだからです。 Aの値を入力させたい最大の行に変更すれば、そこまでデータを入力してくれます。 (西瓜) 2023/08/07(月) 16:50:46 ---- >ちなみにD9:E10の結合セルが最初の日付になるのですが、 参照するセルをずらすだけです。 >A1は日付を手入力(書式はm/d) ↓ D9は日付を手入力(書式はm/d) > (A1~B2)を結合しておく ↓ (D9~E10)を結合しておく > A3 ↓ D11 >=IF(DAY($A$1+INT((ROW()-1)/2))=1,TEXT($A$1+INT((ROW()-1)/2),"M/D"),TEXT($A$1+INT((ROW()-1)/2),"D")) ↓ =IF(DAY($D$9+INT((ROW()-9)/2))=1,TEXT($D$9+INT((ROW()-9)/2),"M/D"),TEXT($D$9+INT((ROW()-9)/2),"D")) >でA3〜B4を結合 >A3をA70までコピペ ↓ でD11〜E12を結合 D11をD80までコピペ (MK) 2023/08/07(月) 17:25:19 ---- > D11をD80までコピペ D78までコピペ、でした。 (MK) 2023/08/07(月) 17:28:23 ---- 西瓜さん、MKさん 何度も教えていただきありがとうございました。 お陰様で無事できました! (Rino) 2023/08/07(月) 18:13:43