Excel VBA 質問スレッド №635 (未解決)

Format関数のオーバーフローの原因

投稿者 : 西岡     投稿日時 : 2022/03/26(Sat) 17:44:55     OS : Windows 10     EXCEL : その他
Format関数で日付表記を変更しようとすると、オーバーフローをします。


テキストボックス内に記載した日付の表記形式を日本語と英語で変更するような設計を考えております。(日本語:yyyy年mm月dd日  英語:ddthmm yyyy)
具体的には、ユーザーフォーム内にはテキストボックスとコンボボックスがそれぞれひとつづつあります。
理想の動作としては以下の通りです。
1、テキストボックスに日付を入れる(例:2022年3月26日)
2、コンボボックスで”英語”を選択
3、それに応じて日付が英語表記に変更される(例:26th Mar. 2022)

ただ、今問題として挙がっているのは、テキストボックスに一文字でも入れると”オーバーフローをしました。”とアラートが出ることです。

ステップインを実行して確認すると、Format関数が恐らく悪さをしているように思われます。
下記に記しましたコードはまだ理想の動作には不足していると思いますが、とりあえずオーバーフローの原因を探りたいと考えております。

助力のほど、よろしくお願いします。


以下が該当コードです。
なお、テキストボックスとコンボボックスのオブジェクト名はそれぞれ”実験日”と”和orEn”としています。

Private Sub 実験日_Change()
    If 和orEn.Text = "日" Then
       実験日.Value = Format(Date, yyyy / mm / dd)
    ElseIf 和orEn.Text = "米" Then
        実験日.Value = Format(Date, dd / mm / yy)
    ElseIf 和orEn.Text = "英" Then
        実験日.Value = Format(Date, mm / mm / yy)
    End If
End Sub

Private Sub 和orEn_DropButtonClick()
With 和orEn
    .AddItem "日"
    .AddItem "米"
    .AddItem "英"
End With
End Sub

- 以上 -

スポンサーリンク
[返信 1] Re : Format関数のオーバーフローの原因
投稿者 : ブブカ     投稿日時 : 2022/03/26(Sat) 22:21:24
何を見て書いているのやら・・・
少なくとも勝手に書いているのだろう。

>yyyy / mm / dd

文字とそうでない物の区別もつかないの?
format(xxx,"文字")

[返信 2] Re : Format関数のオーバーフローの原因
投稿者 : ピロリ     投稿日時 : 2022/03/27(Sun) 10:31:06
Formatの文法は、[返信 1] ブブカさん のご指摘通り、見直していただくとして、
("英"の場合に「㎜」が2個あるので修正して下さいね。)

和orEn_DropButtonClick() の度に、Listが増殖(.AddItem)していきますよね。
こちらは問題ありませんか?

[返信 3] Re : Format関数のオーバーフローの原因
投稿者 : てらてら     投稿日時 : 2022/03/27(Sun) 11:23:51
こんにちわ。

いくつか問題を孕んでいます。
一つは、先に指摘があった部分ですね。ダブルクォーテーションが必要です。
>実験日.Value = Format(Date, "yyyy / mm / dd")

その他にも、実験日_Change()にコードを書くと、一文字入力されるごとに、プログラムが実行されてしまいます。
Change関数では、使い方を間違うと、オーバーフローのエラーが出ます。

対処方としては、Application.EnableEvents = False と True で括る方法もありますが、
この場合はうまくいきません。

他の方法としては、実験日_AfterUpdate()を使って、入力が終わったタイミングを拾う方法があります。
ただし、この方法では入力後の変換を確かめるタイミングを失くしてしまうという欠点もあります。

このため、日付入力では、スピンボタンを使ったり、カレンダーフォームなどを使う事が多いようです。


それと、話を戻しますが、Dateを使うのもおかしいです。
>実験日.Value = Format(Date, "yyyy / mm / dd")

これでは、何を入力しても、今日の日付しか入りません。

ダメ出しばかりで、申し訳ありませんが、コンボボックスの方も間違いがあります。
和orEn_DropButtonClick()でAddItemしてしまうと、ドロップボタンが押されるたびにリストに追加されてしまいます。

これは、Initialize()に書くのが正解で、たぶん初期値も設定しておくべきでしょう。

とりあえず、動くようなサンプルを書いてみましたので参考にしてみてください。

Private Sub UserForm_Initialize()
    With 和orEn
        .AddItem "日"
        .AddItem "米"
        .AddItem "英"
        
        .ListIndex = 0     '先頭を初期値とする。
    End With
    
    Me.実験日.Value = Date  '初期値として今日の日付を入れる
    
End Sub

Private Sub 実験日_AfterUpdate()

    If IsDate(Me.実験日.Value) Then

        If 和orEn.Text = "日" Then
            実験日.Value = Format(実験日.Value, "yyyy / mm / dd")
        ElseIf 和orEn.Text = "米" Then
            実験日.Value = Format(実験日.Value, "dd / mm / yy")
        ElseIf 和orEn.Text = "英" Then
            実験日.Value = Format(実験日.Value, "mm / mm / yy")
        End If
    Else
        MsgBox "日付を入力してください"     'エラー処理
        Me.実験日.Value = Date
    End If
    
End Sub

[返信 4] Re : Format関数のオーバーフローの原因
投稿者 : ブブカ     投稿日時 : 2022/03/28(Mon) 11:11:06
あ、説明か

>yyyy / mm / dd

これらは、

変数yyyy ÷ 変数mm ÷ 変数dd

で、各変数に何も入ってない?から。

0 ÷ 0 ÷ 0

で、オーバーフロー

当掲示板について
  • Excel VBA に関する掲示板です。Excel VBA に関する質問や疑問、それに対する解決方法など気軽に投稿してください。
  • 記事内ではHTMLのタグは使用できません。
  • 記事は一度投稿すると修正できません。内容を訂正したい場合は返信で対応してください。
  • Sub〜End Sub、Function〜End Function は自動的にプログラムコードとみなし、枠で囲って見やすくします。
  • Excel VBA とは関係ないことや、他人が不快に思うようなことなど、管理人が適当でないと判断した記事は削除する場合があります。
スポンサーリンク
返信入力フォーム
お 名 前  :
内  容   :

ステータス  :

認証コード  : キャプチャ画像 




( 処理日時 : 2025-10-26 05:38:25 )
タイトルとURLをコピーしました