Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 11 Home : Excel 2019)
excel vbaの「date関数」の答えが違って出る
投稿日時: 25/03/16 20:32:33
投稿者: はぎさん

かなり大きなVBA内で「DATE関数、NOW関数」で得れる答えが「日付+曜日」になり、得た日付で範囲指定等で利用出来ないでエラーとなっている。下記例で日付の後に曜日が付加される。
Sub 日付取得()
    Dim i As Date
    Dim k As Date
    i = Date '得られる答え Date=2025/03/11 火
    k = Now '得られる答え Now=2025/03/11 火 9:14:36
End Sub
このVBAはwindos7、excel2010の環境で作成して、この環境では正常に動いています。
Windows11のexcel2019の再インストールをしても変わらずです。
よろしくご指導をお願いします。

回答
投稿日時: 25/03/16 20:49:23
投稿者: 半平太

ちょっと何か勘違いがないですか?
 
Date型の変数に「曜日」の要素が含まれる余地は全くないですよ。
※曜日なんてものは、シリアル値から曜日を割り出すプロセスを経てから得られる情報です。
 シリアル値自体が持っている情報ではないです。
 
そのエラーを認識できるだけの情報をアップしてもらえませんか?
(こんなことすると、こんなエラーになる)とか
(こんなことすると、こんな風に曜日が入って見える)とか

投稿日時: 25/03/17 06:56:11
投稿者: はぎさん

返答が遅くなって済みません。Windows11、Excel2019の環境ではすべてのExcelVBAで同じ現象なので、Excel2019の再インストール、Excel2010に切り替えても同様の現象です。次はWindowsの再インストールを行ってみます。

回答
投稿日時: 25/03/17 08:22:24
投稿者: simple

ちょっと想像ができないですね、物理的な障害なんでしょうか。
 
念のため、以下のマクロを実行して、その結果を教えていただけますか?

Sub test()
    Dim d As Date
    d = Date
    
    Columns("A").ColumnWidth = 12.5
  
    Debug.Print d
    Debug.Print "-----------"
    Debug.Print [A1].NumberFormatLocal
    [A1] = d
    Debug.Print [A1].Text
    Debug.Print "-----------"
    
    [A1].NumberFormatLocal = "G/標準"
    Debug.Print [A1].NumberFormatLocal
    [A1] = d
    Debug.Print [A1].Text
    Debug.Print "-----------"
End Sub

回答
投稿日時: 25/03/17 08:48:41
投稿者: sk

VBA における Date 型の値の既定の表示形式は、基本的には
システムの地域オプションにおける日付と時刻の形式の設定に依存します。
 

引用:
Date=2025/03/11

引用:
Now=2025/03/11 9:14:36

もし[日付 (短い形式)]プロパティが yyyy/MM/dd ではなく
yyyy/MM/dd ddd に設定されているのであれば、それは仕様通りの動作です。

回答
投稿日時: 25/03/17 09:20:28
投稿者: Suzu

引用:
下記例で日付の後に曜日が付加される。

 
曜日が付加されている事を、『どこ』でどの様に確認しているのでしょうか?
 
 
例えば、ローカルウィンドにて確認したのであれば
 
引用:
式 値          型
------------------------------
i #2025/03/11#     Date
k #2025/03/11 9:14:36# Date

 
の様になっているハズなのです。
 
 
別の方法で確認しているのであれば、その方法を提示ください。
 

 例示のプロシージャの後、記載していないが、続けて
 
   Range("A1").VAlue = i
 
  を実行して、セルA1 の表示値を確認している
 
  の様に。
  (この場合、セルA1 の書式設定において、曜日を表示する様になっていると推測します)
 
 
 Date 型 は 内部的に 数値型なのです。
 
 日付 2025/3/11 が入っているセルをコピーして、
 標準書式の別セルに値の貼付けを行うと 45727 となります。
 逆に、1 が入力されたセルに、日付書式を適用すると 1900/1/1 になります。
 
 1900/1/1 を 1として、一日を 1として 数えていったとき 2025/3/11 が 45726日後 を表しています。
 同じように、小数点以下で、時刻を表しています。
 
 2025/3/11 9:14:36 は、45727.3851388889、0.3851388889 が、9:14:36 という事です。
 
 内部的には、数値のデータを、セルの表示の仕方 セルの書式設定で
 日付として判り易い様に見せているに過ぎません。
 
 
 45727.3851388889 をセルに入力。
 書式設定として、『yyyy/m/d aaa h:mm:ss』を設定すれば 【2025/3/11 火 9:14:36】と表示されます。
 
 これが、内部的に数値型と言っている意味です。
 
 という事で、数値型のデータに「火」というデータを持たせる事はできません。
 書式等の見せ方として、曜日を付加して表示させているに過ぎません。
 
 
新規シートを用意し そのシートをアクティブにして
 
Sub TEST1()
  Dim i As Date
  i = "2025/03/11 火 9:14:36"
  Range("A1") = i
End Sub
 
Sub TEST2()
  Dim i As Date
  i = 45727.3851388889
  Range("B1") = i
End Sub
 
を実行してみましょう。
 
TEST1 は 型が一致しませんエラーが発生
TEST2 は セルB1 の表示 2025/3/11 9:14 となっており、
     数式バーでは『2025/03/11 9:14:36』である事が確認できます。
 
     (TEST2 実行には、セルB1 の書式設定は標準ですが、
      値代入時にExcelが 書式 yyyy/m/d h:mm を自動的に適用します
       手入力でも、 2025/3/11 を入力すると
        Excelが自動的に 書式 yyyy/m/dd を適用するのと同じです)
 
 
・Date型 に 曜日 は 含まれない。
・確認方法が提示されていないが、確認方法に問題がある。
 
上記を踏まえ、確認してみましょう。
 
どうしても分からないのであれば、どのように確認しているのかを提示ください。

回答
投稿日時: 25/03/17 09:27:11
投稿者: Suzu

skさん Wrote

引用:
システムの地域オプションにおける日付と時刻の形式の設定に依存します。

 
はっ!!
 
引用:
例えば、ローカルウィンドにて確認したのであれば
  
引用:
式 値          型
------------------------------
i #2025/03/11#     Date
k #2025/03/11 9:14:36# Date
 
  
の様になっているハズなのです。

 
そうですね。
 
それだと、ローカルウィンド でも
式 値          型
------------------------------
i #2025/03/11 月#     Date
k #2025/03/11 月 9:14:36# Date
 
となります。失礼しました。

回答
投稿日時: 25/03/17 10:15:43
投稿者: hatena
投稿者のウェブサイトに移動

すでにskさんが指摘があるOSのシステム設定が原因でしょうね。
下記にあるような方法で既定の設定から変更したのでしょう。
 
【Windows11】タスクバーの日付に曜日を表示する方法 - Steganom
https://steganom.co.jp/windows11-show-week-taskbar/
 

はぎさん さんの引用:
かなり大きなVBA内で「DATE関数、NOW関数」で得れる答えが「日付+曜日」になり、得た日付で範囲指定等で利用出来ないでエラーとなっている。

 
対応としては、下記のどちらかになりますね。
システム設定を勝手に変更しないように徹底する。
システム設定に依存しないコードに修正する。
 
前者はなかなか難しいと思いますので、後者がいいでしょう。
 
どのように範囲指定しているか不明ですが、Date型のまま大小比較するか、Format関数で書式を指定して比較するか、などの対応をすることになります。
 
対応がわからないのであれば、そのエラーで出るコードを提示すれば適切な回答が付くでしょう。

投稿日時: 25/03/17 10:25:10
投稿者: はぎさん

送付されたコードでA1に今日の日付のみが入りました。
yyyy/MM/dd ddd に設定されいるか確認します。

回答
投稿日時: 25/03/17 13:46:02
投稿者: Suzu

はぎさん さんの引用:
送付されたコードでA1に今日の日付のみが入りました。
yyyy/MM/dd ddd に設定されいるか確認します。

 
当方の提示したコードに対してのレスポンスでしょうか?
 
であれば、当方が知りたいのは それではなく
引用:
i = Date '得られる答え Date=2025/03/11 火
    k = Now '得られる答え Now=2025/03/11 火 9:14:36
この日付の確認をどうやって行っているの?という事です。
 
Dim i As Date
としていますから、i は あくまで 数値データ。
 
それが、書式の設定 で、曜日が表示されているに過ぎないのか
 
それとも、提示されていないコードがあり、その中で 本当に 文字列を含むデータに置き換わっていて
それを、i の データである とおっしゃっているのかが 回答者には判断がつかないのです。
 
 
提示のコードは
引用:
得た日付で範囲指定等で利用出来ないでエラーとなっている

の部分は含まれておらず、
また、提示コード自体では、エラーにならないはずですから
どんなコードでエラーになっているのか判りません。
 
回答者側は、「書式として 曜日が表示される様になっている のではないか?」 と推測をしていますが
 
表示に左右されないコードの組み方をすれば回避できのか
そうではなく、別のアプローチをしなければならないのか
 
・実データの確認方法
・エラー部分のコード
を 提示する様にしてください。

回答
投稿日時: 25/03/17 16:19:37
投稿者: MMYS

なにか勘違いされてるように思うのですが、日付データに「曜日」というデータ。考えがありません。
 
なぜなら、グレゴリオ暦では、一週間は7日と決まっており、過去・未来とも、7日で変わることはありません。つまり、基準の日が何曜日が分かってれば、あとは「年・月・日」を指定すれば、曜日は計算で求めることが出来ます。
 
つまり、日付関数は
・Date は現在日付 (だけを返す関数)
・Now は現在日時 (だけを返す関数)
です。
曜日は返しません。
 
たとえば、2025年3月17日は、日本・アメリカ・ヨーロッパであろうと、必ず「月曜日」ですよね。
で、日付の表記ですが、その国によって表記方法が違います。
 
日本語では「2024年4月3日」と、「年」「月」「日」と表記しますが、地域・各国で違います。
イギリス英語の日付の書き方は、日・月・年の順番
アメリカ英語の日付の書き方は、月・日・年の順番
 
地域・各国で、表記か違うため、Windowsには表示設定があります。そして、他の方が、おっしゃっているように、カーソルを近づけたり、Debug.Print で表示される日付は、このWindows表示設定に準じます。
 
ご質問の曜日は、計算で求めた曜日を参考値で表示しているに過ぎません。
 
なお、エラーの原因は別にあるので、エラーが発生するコードを開示されないと、誰も指摘出来ないと思います。
 

投稿日時: 25/03/17 19:36:28
投稿者: はぎさん

タスクバーに表示されている日付がVBAのdate関数に反映されている事がわかりました。タスクバーに表示されているのが日付+曜日であればこれがdate関数で呼び出されているのを確認出来ました。
コントロールパネル→地域→追加の設定→日付→短い形式→@yyyy/mm/dd ddd→Ayyyy/mm/dd ddd
@は2025/03/17 Aは2025/03/17 月 がタスクバーに表示されます。VBAのdate関数はタスクバーに表示されているものが呼び込まれています。再現も出来ました。
皆様には色々とご指導をいただきありがとうございました。原因が判明したので次の対応が出来ます。