アプリ版:「スタンプのみでお礼する」機能のリリースについて

会計の出納帳をユーザーフォームを作っています。
コンボボックスの月と日を連動させて、4月を選択したら30日まで選択可能になる、5月を選択したら31日まで選択可能になるとしたいのです。
色々と検索して、1月から12月なら見つけられて、正常に動いています。これを年度開始の4月から翌年の3月としたいのです。
https://www.moug.net/tech/exvba/0090007.html
ここを参考にして、1月開始は出来ました。
ーーーーーここからーーーーー
Option Explicit
’変数に入れる
Private m_ArrayMonth(1 To 12) As Long
'====================================
Private Sub UserForm_Initialize()
'月別の日数を配列m_ArrayMonthに設定
For m = 1 To 12
Select Case m
Case 2 '2月
m_ArrayMonth(m) = 28
Case 4, 6, 9,11 '30日の月
m_ArrayMonth(m) = 30
Case Else '31日の月
m_ArrayMonth(m) = 31
End Select
Next m
'[月]コンボボックスの表示処理
With Me.cmb月
'1月~12月までをリストに設定
For m = 1 To 12
.AddItem m
Next m
'[月]コンボボックスを現在の月に設定
.Value = Month(Now) '---(1)
End With

'=========[月]コンボボックス変更時の処理 =========
Private Sub cmb月_Change()
Dim m As Long, d As Long
'[月]コンボボックスで選択された月を取得
m = Me.cmb月.ListIndex + 1
'[日]コンボボックスをいったんクリア
Me.cmb日.Clear
'[日]コンボボックスに日にちのリストを設定
With Me.cmb日
For d = 1 To m_ArrayMonth(m)
.AddItem d
Next d
'1日を選択
.Value = "1"
End With
End Sub
ーーーーーここまでーーーーー

この変更を考えるまでは、月のコンボボックスのソースを4から3のセルを参照させていました。
できるでしょうか?

質問者からの補足コメント

  • うれしい

    早速のアドバイス、ありがとうございました。
    普段、単に数字を入力したつもりが、変な日時が表示され、シリアル値はわかっているので「また、面倒だぁ」と思い、シリアル値は避けるような感じでしたが、こんな使い方が出来るんですね(^^;)

    追加コードは、1回やってみたら、前の表記が残っていたので、自前で追加していました。
    ちゃんと表示されるようになりました。

    No.3の回答に寄せられた補足コメントです。 補足日時:2019/10/20 15:25
  • うーん・・・

    早速のアドバイスありがとうございます。
    「その手が有るか?」と思い、やってみたのですが、エラーメッセージが出て、ダメでした。

    No.1の回答に寄せられた補足コメントです。 補足日時:2019/10/20 15:27
  • どう思う?

    まだまだ配列が理解できていないので、こちらの方が理解しやすいかなと思って、やってみたのですが、
    エラーメッセージ:381
    「Columnプロパティの値を取得できません。プロパティの配列のインデックスが無効です」と表示されます。
    デバッグすると、「For d = 1 To cmb月.Column(1)」の行が指摘されてしまいます。
    ちゃんと入力自体は、されるのですが???

    No.4の回答に寄せられた補足コメントです。 補足日時:2019/10/20 15:34
  • どう思う?

    Excelのバージョンは、2013です。
    はじめに書くべきでしたね、すみません。

    で、「ME.」を加筆しましたが、同じエラーでした。
    ちゃんと入力されるので、別のところに何かあるのでしょうか?

    No.5の回答に寄せられた補足コメントです。 補足日時:2019/10/21 17:59

A 回答 (6件)

こんばんは!



コンボボックス1には1~12月の月を!
コンボボックス2にはその月の月末までの日付を!それぞれ表示すれば良いのですね。
お示しのコードを拝見するとうるう年の考慮がなされていませんね。
(さっそく来年がうるう年になるはずです)

シリアル値で操作してみてはどうでしょうか?
こちらで勝手に考えてみました。

Private Sub UserForm_Initialize()
 Dim k As Long
 Dim myAry
  myAry = Array(4, 5, 6, 7, 8, 9, 10, 11, 12, 1, 2, 3)
   With ComboBox1
    For k = 0 To UBound(myAry)
     .AddItem myAry(k) & "月"
    Next k
    .Value = Format(Date, "m月")
   End With
  ComboBox2 = Format(Date, "d日")
End Sub

Private Sub ComboBox1_Change()
 Dim cnt As Long
 Dim myYear As Long
 Dim myMonth As Long
  myMonth = Val(Replace(ComboBox1.Value, "月", ""))
   If myMonth < 4 Then
    If Month(Date) >= 4 Then
     myYear = Year(Date) + 1
    Else
     myYear = Year(Date)
    End If
   Else
    myYear = Year(Date)
   End If
    Do
     cnt = cnt + 1
     ComboBox2.AddItem Format(DateSerial(myYear, myMonth, cnt), "d日")
     If DateSerial(myYear, myMonth, cnt) = WorksheetFunction.EoMonth(DateSerial(myYear, myMonth, 1), 0) Then Exit Do
    Loop
End Sub

こんな感じではどうでしょうか?m(_ _)m
    • good
    • 0

No.5 です。



Excel 2016 ですが、再現できません。

Access の場合だと、フォームでこういう訳のわからないエラーが発生する場合、
全然関係ないところのコンパイルエラー、参照不可などによることがありますが、
一応確認してください。

> 別のところに何かあるのでしょうか

確認するには

・新規ブックを作成し
・ユーザーフォームを作成
・コンボボックス2個を配置、名前をそれぞれ「cmb月」「cmb日」とする。
・No.4 のコードを 一切修正を加えず 貼り付けて実行。
・これで OK なら コードの他の部分の影響、
 NG なら バージョンによる不具合、あるいは マシンスペックの差によるものかもしれません。

他の回答者さんの回答で動作するなら、無理せずそちらを利用なさっても。
    • good
    • 0

No.4 です。



Excel のバージョンは?

とりあえず
For d = 1 To Me.cmb月.Column(1)
としてみてください。
この回答への補足あり
    • good
    • 0

コンボボックスには複数列の設定ができるので、


それを利用し、配列は使いません。
うるう年に対応しています。

Option Explicit

Private Sub UserForm_Initialize()
  '月と日数をコンボボックスのリストに設定
  Dim y  As Integer
  Dim m  As Integer
  Dim ymd As Date
  
  '今日が3月以前なら 前年4月から(※ ここは要求仕様により変更)
  y = Year(Date) + (Month(Date) < 4)
  
  '[月]コンボボックスの表示処理
  With Me.cmb月
    .Clear
    .ColumnCount = 2
    .ColumnWidths = ",0"  ' 2列目を非表示
    '4月~3月までとその日数をリストに設定
    For m = 5 To 16
      ymd = DateSerial(y, m, 0)
      .AddItem Month(ymd)
      .List(.ListCount - 1, 1) = Day(ymd)
    Next
    
    '[月]コンボボックスを現在の月に設定
    .Value = Month(Now) '---(1)
  End With
End Sub

'=========[月]コンボボックス変更時の処理 =========
Private Sub cmb月_Change()
  Dim d As Long
  With Me.cmb日
    '[日]コンボボックスをいったんクリア
    .Clear
    '[日]コンボボックスに日にちのリストを設定
    For d = 1 To cmb月.Column(1) ' 月コンボボックスの2列目の数値まで繰り返す
      .AddItem d
    Next d
    '1日を選択
    .Value = "1"
  End With
End Sub
この回答への補足あり
    • good
    • 0

No.2です。



細かい検証をしていませんでした。
コンボボックス2を一旦消去しなければコンボボックス1を変更するたびに
下にどんどん日付が追加されてしまいますね。

前回のコードの
>Do
の前に
>ComboBox2.Clear
を追加。

>Loop
の次に
>ComboBox2 = Format(Date, "d日")
をそれぞれ追加してください。

どうも失礼しました。m(_ _)m
この回答への補足あり
    • good
    • 0

よく見てませんが以下を2つに分けるだけで良いのでは?



☆元
For m = 1 To 12
.AddItem m
Next m

☆変更後
For m = 4 To 12
.AddItem m
Next m
For m = 1 To 3
.AddItem m
Next m
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!