• ベストアンサー

VBAで月末日の求め方について

Excel VBAでUserForm1で年月日を入力すると、その月の月末日を取得したいと思っています。 下のようなプログラムにすると、 「2006/3/1」と入力された場合は、lasDayに「31」が取得されるのですが、    myDate = TextBox1.Text    lasDay = Day(DateAdd("d", -1, DateAdd("m", 1, myDate))) 「2006/3/5」などと入力された場合もlasDayに「31」を取得するには どのようにしたらよいのでしょうか。 また、入力された日にちが25日以降の場合は、 翌月の月末日の値を取得したいのですが、どのようにしたらよいのでしょうか。 (例:「2006/2/25」と入力したら、lasDayは翌月(3月)の月末日「31」を取得) どのたか回答お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.5

分岐の条件のところに間違いがありました。 25日以降の条件がCase Is = 25となっています。 Case Is >= 25が正しいです。 何度も申し訳ありません。 Private Sub CommandButton1_Click()  Dim A As Integer, B As Integer, C As Integer, lasDay As Date  A = Year(TextBox1)  B = Month(TextBox1)  C = Day(TextBox1)  Select Case C   Case Is < 25    B = B + 1   Case Is >= 25    B = B + 2  End Select  lasDay = DateSerial(Year:=A, Month:=B, Day:=0)  MsgBox lasDay End Sub

piopao
質問者

お礼

何度も回答ありがとうございます。 おかげで解決することができそうです。 本当にどうもありがとうございました。

その他の回答 (7)

noname#22222
noname#22222
回答No.8

s_husky です。 蛇足ですが、実際の書くべきコードは、 lasDay =GetDate(myDate, abs(format(myDate,"dd") >= "25"), 99) です。

piopao
質問者

お礼

何度も回答ありがとうございます。 おかげで解決することができそうです。 どうもありがとうございました。

noname#22222
noname#22222
回答No.7

s_husky です。 質問を読み間違っていました。 応用例は、もっと、簡単で宜しいようです。 ? GetDate("2006/03/01", abs(format("2006/03/01","dd") >= "25"), 99) 2006/03/31 ? GetDate("2006/03/25", abs(format("2006/03/25","dd") >= "25"), 99) 2006/04/30

noname#22222
noname#22222
回答No.6

私が用いているGetDate関数です。 ? GetDate("2006/03/19", 0, 1) <--- 0=当月, 1=1日 2006/03/01 ? GetDate("2006/03/19", +1, 1) <--- +1=次月, 1=1日 2006/04/01 ? GetDate("2006/03/19", -1, 1) <--- +1=前月, 1=1日 2006/02/01 ? GetDate("2006/03/19", 0, 99)<--- 0=当月, 99=月末 2006/03/31 ? GetDate("2006/03/19", +1, 99)<--- +1=次月, 99=月末 2006/04/30 ? GetDate("2006/03/19", -1, 99) <--- +1=前月, 99=月末 2006/02/28 ? GetDate("2006/03/19", -1, 15) <--- +1=前月, 15=15日 2006/02/15 Public Function GetDate(ByVal Now As Date, _             ByVal Move As Integer, _             ByVal Hiduke As Integer) As Date                GetDate = DateSerial(DatePart("yyyy", Now), _              DatePart("m", Now) + Move - (Hiduke = 99), _              Hiduke * Abs(Hiduke <> 99)) End Function ※質問のケースでは、次のように応用します!! ****************************************** ? GetDate("2006/03/25", _ abs(format("2006/03/25","dd") >= "25"), _ iif(format("2006/03/25","dd") >= "25", 99, val(format("2006/03/01","dd")))) 2006/04/30 ******************************************

回答No.4

あ、日付による分岐がありましたね・・・ これでOKかと思います。 Private Sub CommandButton1_Click() Dim A As Integer Dim B As Integer Dim C As Integer Dim lasDay As Date A = Year(TextBox1) B = Month(TextBox1) C = Day(TextBox1) Select Case C Case Is < 25 B = B + 1 Case Is = 25 B = B + 2 End Select MsgBox DateSerial(Year:=A, Month:=B, Day:=0) End Sub 今度は確認しましたので、"自信あり"にしました。

回答No.3

私が使っている月末の出し方です。 もっと簡単な方法があるかもしれませんが・・・ Private Sub CommandButton1_Click()  Dim A As Integer  Dim B As Integer  Dim lasDay As Date  A = Year(TextBox1)  B = Month(TextBox1)  lasDay = DateSerial(Year:=A, Month:=B + 1, Day:=0)  MsgBox lasDay End Sub

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.2

こんな感じ? Private Sub CommandButton1_Click()  If IsDate(TextBox1.Text) Then    myDate = TextBox1.Text    If Day(myDate) < 25 Then     MsgBox DateSerial(Year(myDate), Month(myDate) + 1, 0)     MsgBox Day(DateSerial(Year(myDate), Month(myDate) + 1, 0))    Else     MsgBox DateSerial(Year(myDate), Month(myDate) + 2, 0)     MsgBox Day(DateSerial(Year(myDate), Month(myDate) + 2, 0))    End If  End If End Sub

piopao
質問者

お礼

回答どうもありがとうございます。 おかげで解決することができそうです。 どうもありがとうございました。

noname#16474
noname#16474
回答No.1

翌月1日マイナス1日

piopao
質問者

お礼

回答どうもありがとうございました。

関連するQ&A

  • エクセルVBA、年齢計算について質問です

    失礼いたします、生年月日、基準日をテキストボックスに入力し、年齢を算出するマクロを作成してるのですが質問です。 以下のようなマクロを組んでいるのですが。 Dim 生年月日 As String Dim 開始日付 As String Dim 年齢 As String 生年月日 = "H" + UserForm1.TextBox1.Value + "/" + UserForm1.TextBox2.Value + "/" + UserForm1.TextBox3.Value 年齢基準日 = "H" + UserForm4.TextBox1.Value + "/" + UserForm1.TextBox5.Value + "/" + UserForm1.TextBox6.Value 年齢 = Application.Evaluate("=datedif(""" & Format(生年月日, "yyyy/mm/dd") _ & """,""" & Format(年齢基準日, "yyyy/mm/dd") & """,""y"")") 上記のようにそれぞれH”年”/”月”/”日”という形で取得しています。 この場合、適正な値が入力されると上手くいきますが、日付として成立しない値(例えば月に80など)を入力した場合にエラーが発生します。 エラーが発生した場合にエラー処理(例としてMsgBox+Goto処理)をしたいのですがどのようなコードを記入すればいいでしょうか?

  • SQL Server で 翌月10日を取得する

    SQL Server で 翌月10日を取得する方法を教えてください。 isnull(convert(char(10),dateadd(month,1,(dateadd(day,9,DATE))),111),'') as DATE ↑これだと、DATE(月末)の翌月の9日後で、翌月10日も可能なのですが、 当然ながら、DATEが月末とは限らないので。。。 常に10日を固定で表示するにはどうしたら、よいのでしょうか? よろしくお願いいたします。

  • Excel VBAで年度をまたぐ期間の月末日を求める方法

    タイトルの通り 03年○○月~04年○○月の間の 各月の月末日を求めるものです。 年・月とも一定でなく、TextBoxで入力したものを使います。 04年1月~04年10月のような場合 開始月<終了月で For文で簡単に出来るのですが 03年11月~04年4月と云うような場合For文も使えず 処理の仕方がわかりません。 最初に開始月の月末日を求め、DateAdd文で求めようとしたのですが、やりかたがわるかったのか正しい数字がもとめられませんでした。

  • VBA Excelのyy/mmm/ddをUserFormに入力

    また、質問させていただきます。 今、UserFormが開くと【TextBox1】【TextBox2】【TextBox3】に現在の日付が入るようになっています。   【TextBox1】(年 08)   【TextBox2】(月 03)   【TextBox3】(日 03) UserFormには、【CommandButton1】(登録)と【CommandButton2】(呼び出し)があります。 【CommandButton1】(登録)をクリックするとExcelに '08/03/03と表示されます。 ある日、データを間違えて入力してしまい【CommandButton2】(呼び出し)をクリックし修正する時にExcelに登録している日を【TextBox1】(年 08)【TextBox2】(月 03)【TextBox3】(日 03)と自動的に入力することは出来るでしょうか? 宜しくお願いいたします。

  • SpinButtonを使ったプログラム

    日めくりカレンダーのようなものを作っております。 仕様 TextBox1は月、TextBox2は日。初期値は現在月日。 SpinButton2を押すと、日が変わる。 ただし、月またぎでは月日両方が変わる。 で、以下のようなプログラムを作ると ***のところのSpinButton2_Change()が 反応してしまうらしく、上手く動きません。 対策の方を教えてください。 また、SpinButton2の上側ボタンを押すと 数が減るような方法も併せて教えて くださいましたら幸いです。 Private 月 As Variant Private Sub UserForm_Initialize() 月 = Month(now) SpinButton2.Value = Day(Now) End Sub Private Sub SpinButton2_Change() 日 = SpinButton2.Value If 日 = 0 Then 月 = 月 -1 日 = 月末日(月 - 1) ElseIf 日 = 月末日(月) + 1 Then 月 = 月 +1 日 = 1 End If UserForm1.TextBox1.Value = 月 UserForm1.TextBox2.Value = 日 SpinButton2.Value = 日 ’*** End Sub Private Function 月末日(月) MyStr1 = Format(Year(Now) & "/" & 月, "yyyy/m") MyFDate = DateValue(MyStr1 & "/1") MyLDate = DateAdd("m", 1, MyFDate) - 1 月末日 = Format(MyLDate, "d") End Function

  • 日付の表示について

    im myDate As Date myDate = TextBox1.Text Sheet1.Range("B1").Value = myDate Sheet1.Range("B1").NumberFormatLocal = "m" *********************************************** 上のようにTextBoxで入力された日付で、 1日≦myDate>25日の場合は(例:12/10)⇒ セルB1には「12月」と表示 25日≦myDate≧31日の場合は(例:12/25)⇒ セルB1には「1月」と表示 させたいのですが、どのようにしたらよいのでしょうか。

  • VBAの年月を取得したいのですが

    以下のように作成したのですが、 年:XXXX 4桁 できました。 月:XX 2桁ができません、1桁になります。   5月なら05として取得したいのですが、修正方法がわかりません A1には、2009/5/1と入力しています。 VBAに詳しい方で簡単に、どうぞお願いします。 Sub sample() Dim myDate As Date myDate = Range("A1").Value Range("B7").Value = Year(myDate) Range("C7").Value = Month(myDate) Range("D7").Value = Day(myDate) End Sub

  • VBA 値が月末の時は月に1を足して日は1とする

    よろしくお願いします。 次へのコマンドボタンを押すと下の段にカーソルが移動します。 ※1 その時に日に1を足して表示しますが、前段の値が月末の時は、 自動的に月に1を足して日は1とする。 ※2 同じように月が12の場合は年に1を足して月は1、日も1とする TextBox1⇒年 TextBox2⇒月 TextBox3⇒日 ActiveCell.offset(1, 0).Activate TextBox3.Value = TextBox3.Value + 1 ActiveCell.Value=TextBox1.Value &"/"& TextBox2.Value &"/"& TextBox3.Value

  • 月末日の求め方

    ACCESS97で作られていたアプリをWEBで再開発することに なり、開発言語はJAVAで行うことになりました。 ACCESSでのコーディングでは、ユーザー入力された年、月とDATESERIAL関数を用いて月末日を求めています。 この処理をJAVAではどのようにコーディングすれば いいのでしょうか DATESERIAL関数に相当する関数があるのでしょうか? よろしくお願いいたします。

  • エクセルで末日を表示させたい

    A1のセルに 2007/7/31と入力した場合、 B1には翌月の末日の2007/8/31、 C1のセルには翌々月の月末の2007/9/30 を表示させたいのですが、可能でしょうか? 宜しくお願いします。