dポイントプレゼントキャンペーン実施中!

Windows10+Excel2013を使っています。

Excel VBAでworkday関数を使用した際の結果が期待通りにならないのですが、原因についてご教示いただけないでしょうか。

Debug.Print Date
→2019/05/11 # 期待通り

Debug.Print Format(WorksheetFunction.Workday(Date, -1), "yyyy/mm/dd")
→2011/05/07 # 2019/05/10が期待値だが異なる

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

  • 早速のご確認ありがとうございます。

    はい、上記の結果になることを期待しているのですが、2番目の関数の結果が

    2011/05/07

    になってしまう、という事象です。

    No.1の回答に寄せられた補足コメントです。 補足日時:2019/05/11 11:31
  • ご確認ありがとうございます。

    今外出中ですぐに試せないため、戻り次第確認してみます。

    No.2の回答に寄せられた補足コメントです。 補足日時:2019/05/11 11:32
  • ありがとうございます。

    マイナスの時間を表示する必要があり、チェック入れています。
    外したところ期待通りの動作となりました。

    No.4の回答に寄せられた補足コメントです。 補足日時:2019/05/11 21:52
  • HAPPY

    ありがとうございます。

    1904年から計算するのチェックは付けておく必要がありましたので、計算前後でoff/onすることでまさに私がやりたかったことが実現できました。

    No.5の回答に寄せられた補足コメントです。 補足日時:2019/05/11 22:01

A 回答 (6件)

No.3の回答者です。


No.4の回答にあるチェックの影響でずれることがあるのですね。
参考になりました。
そこで、
 ActiveWorkbook.Date1904 = False
 Debug.Print Format(WorksheetFunction.WorkDay(Date, -1), "yyyy/mm/dd")
で期待値になるのか確認してみてはいかが。
https://docs.microsoft.com/ja-jp/office/vba/api/ …
この回答への補足あり
    • good
    • 1

ご質問の通りにはしませんでしたが、確認できました。


私の記憶の範囲で、確か、日付の区切り方が、ワークシート上とVBA上では、計算の仕方が違い、VBAでは、開始日を含まない計算をするのだったと思います。それと、再帰計算が起きているように見えます。このままでは、手におえませんから、中身の分かるユーザー定義関数を作りました。祭日カウントが必要な時は、もう少し、手を加えなくてはなりません。


Sub test_Workday()
 Dim a, b, d, dif As Integer
 dif = -2 '日差
 d = Date ' #5/11/2019# '日付
 a = mWorkday(d, dif)
 b = Format(WorksheetFunction.WorkDay(d, dif), "yyyy/mm/dd")
End Sub


'ユーザー定義関数(標準モジュール)
Function mWorkday(mDate As Variant, ByVal dif As Integer)
 Dim sg As Long, cnt As Long
 If VarType(mDate) = vbString Then
  mDate = CDate(mDate)
 End If
  sg = Sgn(dif)
 Do
  mDate = mDate + sg
  If Weekday(mDate, vbMonday) < 6 Then
   cnt = cnt + sg
  End If
 Loop Until cnt = dif
 mWorkday = Format(mDate, "yyyy/mm/dd")
End Function
    • good
    • 1
この回答へのお礼

誠にありがとうございます。

すみませんが、No.5の回答が私がやりたいことを完全に満たしていましたので今回はそちらをベストアンサーとさせていただきます。

お礼日時:2019/05/11 22:07

No.1です。


添付画像の丸印のところって、どうなっていますか?
オン・オフを変えてテストしてみて下さい。
「Excel VBAのworkday関数」の回答画像4
この回答への補足あり
    • good
    • 3

同じ環境ですが、結果は期待通りでしたよ。


シート上でもworkday関数で色々と検証しても問題なく計算結果を
出しましたよ。何か別の原因があるのでは?
「Excel VBAのworkday関数」の回答画像3
    • good
    • 0

Debug.Print Date - 1 ってやっても期待通りにならないんですかね?



ちなみにOffice365のExcelでは、最初の式でも Workday(Date - 1 , 0) でも同じ結果(2019/05/11)になりました。
この回答への補足あり
    • good
    • 0

Excel2010でのテスト結果ですが、これって想定通りですよね?

「Excel VBAのworkday関数」の回答画像1
この回答への補足あり
    • good
    • 0

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