BUG: 形式または DatePart 関数の週の数が正しくありません先週の月曜日の年を返すことができます。

文書翻訳 文書翻訳
文書番号: 200299
すべて展開する | すべて折りたたむ

目次

現象

使用する場合は、 形式 または DatePart 次の構文を使用して日付の週数を決定する関数。
Format(AnyDate, "ww", vbMonday, vbFirstFourDays)

DatePart("ww", AnyDate, vbMonday, vbFirstFourDays)
				
第 1 週を指定すると、先週の月曜日にいくつかの年と 53 週に返されます。

原因

ISO 8601 標準に従って、日の週の数を決定するときは、Oleaut32.dll ファイルを基になる関数呼び出しは誤って週 53、先週の月曜日の第 1 週ではなく特定年で返します。

解決方法

ユーザー定義関数を使用して、ISO 8601 標準規則に基づいて週数を取得します。ここでは例が含まれています。

状況

マイクロソフトは、この問題は、Oleaut32.dll ファイルであること確認しています。

詳細

ISO 8601 標準ヨーロッパで広く使用されてしは次が含まれます。
  ISO 8601 "Data elements and interchange formats - Information interchange   - Representation of dates and times"
  ISO 8601 : 1988 (E) paragraph 3.17:
  "week, calendar: A seven day period within a calendar year, starting
  on a Monday and identified by its ordinal number within the year;
  the first calendar week of the year is the one that includes the
  first Thursday of that year. In the Gregorian calendar, this is
  equivalent to the week which includes 4 January."
				
これは、カレンダーの週のこれらの規則を適用することによって実装できます。
  • 1 年は 52 または 53 のカレンダー週に分割されています。
  • カレンダーの週 7 日間です。1 日目月曜日、7 の日は日曜日です。
  • 年の最初の週には、少なくとも 4 日間を含むです。
  • 1 年は、日曜日に完了しない場合は、次の年の最初の週に、1 〜 3 の最終日に属しているか来年の最初の 1 〜 3 日間に当年度の最後の週に属しています。
  • 開始または木曜日までは、1 年のカレンダーの 53 週間をです。
Visual Basic と Visual Basic for Applications では、すべての日付の機能以外に、 DateSerial 機能、Oleaut32.dll ファイルへの呼び出しから取得します。両方に 最大長を決定DatePart() 関数が、指定した日付のカレンダーの週の番号を返すことができますは、両方ともこの不具合の影響を受けます。この問題を回避するには、この資料で説明する代替コードを使用する必要があります。

現象の再現手順

  1. Visual Basic で、標準 EXE プロジェクトを起動します。デフォルトで Form1 が作成されます。
  2. 2 つを追加します。 コマンド ボタン Form1 にします。
  3. 次のコードを Form1 のコード ウィンドウに貼り付けます。
    Option Explicit
    
    Private Sub Command1_Click()
    ' This code tests a "problem" date and the days around it
    Dim DateValue As Date
    Dim i As Integer
    
    Debug.Print "   Format function:"
    DateValue = #12/27/2003#
    For i = 1 To 4   ' examine the last 4 days of the year
        DateValue = DateAdd("d", 1, DateValue)
        Debug.Print "Date: " & DateValue & "   Day: " & _
          Format(DateValue, "ddd") & "   Week: " & _
          Format(DateValue, "ww", vbMonday, vbFirstFourDays)
    Next i
    End Sub
    
    Private Sub Command2_Click()
    ' This code lists all "Problem" dates within a specified range
      Dim MyDate As Date
      Dim Years As Long
      Dim days As Long
      Dim woy1 As Long
      Dim woy2 As Long
      Dim ToPrint As String
    
      For Years = 1850 To 2050
        For days = 0 To 3
          MyDate = DateSerial(Years, 12, 28 + days)
          woy1 = Format(MyDate, "ww", vbMonday, vbFirstFourDays)
          woy2 = Format(MyDate, "ww", vbMonday, vbFirstFourDays)
          If woy2 > 52 Then
            If Format(MyDate + 7, "ww", vbMonday, vbFirstFourDays) = 2 Then _
              woy2 = 1
          End If
          If woy1 <> woy2 Then
            ToPrint = MyDate & String(13 - Len(CStr(MyDate)), " ")
            ToPrint = ToPrint & Format(MyDate, "dddd") & _
              String(10 - Len(Format(MyDate, "dddd")), " ")
            ToPrint = ToPrint & woy1 & String(5 - Len(CStr(woy1)), " ")
            ToPrint = ToPrint & woy2
            Debug.Print ToPrint
          End If
        Next days
      Next Years
    End Sub
    					
  4. CTRL キーを押しながら、イミディ エイト ウィンドウを開くには、G キーを押します。
  5. プロジェクトを実行し、[保存] をクリックしてください Command1、し、次の結果をイミディ エイト ウィンドウに注意してください。
       Format function:
    Date: 12/28/03   Day: Sun   Week: 52
    Date: 12/29/03   Day: Mon   Week: 53
    Date: 12/30/03   Day: Tue   Week: 1
    Date: 12/31/03   Day: Wed   Week: 1
    						
    2003/12/29 開始の第 1 週および週 53 の一部でないと見なすため、この形式では、すべての週月曜日には、開始することに注意してください。
  6. [保存] をクリックします。 Command2 この問題が発生の日付は指定した範囲の一覧を表示します。リストが含まれている月曜は常に)、週、日付番号の形式 (53)、および週番号を返す必要がありますが返される (1)たとえば。
    12/29/1851   Monday    53   1
    12/31/1855   Monday    53   1
    12/30/1867   Monday    53   1
    12/29/1879   Monday    53   1
    12/31/1883   Monday    53   1
    12/30/1895   Monday    53   1
    ...
    					

回避策

使用するかどうかは、 形式 または DatePart 関数は、戻り値をチェックし、53、別のチェックを実行してに 1 のリターンを強制するには、必要に応じてします。このサンプル コードでこれを行うには、1 つの方法を示しています。
Function WOY (MyDate As Date) As Integer   ' Week Of Year
  WOY = Format(MyDate, "ww", vbMonday, vbFirstFourDays)
  If WOY > 52 Then
    If Format(MyDate + 7, "ww", vbMonday, vbFirstFourDays) = 2 Then WOY = 1
  End If
End Function
				
これらの関数を使用して上記の ISO 8601 規則を実装するコードを記述して、週の数を決定するを回避できます。交換、週番号を返す関数の例を次に示します。

ステップ バイ ステップの例

  1. Visual Basic で、標準 EXE プロジェクトを起動します。デフォルトで Form1 が作成されます。
  2. から、 プロジェクト メニューの [新しいモジュールを追加し、次のコードを貼り付けます。
    Option Explicit
    
    Function WeekNumber(InDate As Date) As Integer
      Dim DayNo As Integer
      Dim StartDays As Integer
      Dim StopDays As Integer
      Dim StartDay As Integer
      Dim StopDay As Integer
      Dim VNumber As Integer
      Dim ThurFlag As Boolean
    
      DayNo = Days(InDate)
      StartDay = Weekday(DateSerial(Year(InDate), 1, 1)) - 1
      StopDay = Weekday(DateSerial(Year(InDate), 12, 31)) - 1
      ' Number of days belonging to first calendar week
      StartDays = 7 - (StartDay - 1)
      ' Number of days belonging to last calendar week
      StopDays = 7 - (StopDay - 1)
      ' Test to see if the year will have 53 weeks or not
      If StartDay = 4 Or StopDay = 4 Then ThurFlag = True Else ThurFlag = False
      VNumber = (DayNo - StartDays - 4) / 7
      ' If first week has 4 or more days, it will be calendar week 1
      ' If first week has less than 4 days, it will belong to last year's
      ' last calendar week
      If StartDays >= 4 Then 
         WeekNumber = Fix(VNumber) + 2 
      Else 
         WeekNumber = Fix(VNumber) + 1
      End If
      ' Handle years whose last days will belong to coming year's first 
      ' calendar week
      If WeekNumber > 52 And ThurFlag = False Then WeekNumber = 1
      ' Handle years whose first days will belong to the last year's 
      ' last calendar week
      If WeekNumber = 0 Then
         WeekNumber = WeekNumber(DateSerial(Year(InDate) - 1, 12, 31))
      End If
    End Function
    
    Function Days(DayNo As Date) As Integer
      Days = DayNo - DateSerial(Year(DayNo), 1, 0)
    End Function
    					
  3. 追加します。 コマンド ボタン Form1 にします。
  4. 次のコードを Form1 のコード ウィンドウに貼り付けます。
    Private Sub Command1_Click()
       Dim DateValue As Date, i As Integer
       
       Debug.Print "   WeekNumber function:"
       DateValue = #12/27/2003#
       For i = 1 To 4   ' examine the last 4 days of the year
           DateValue = DateAdd("d", 1, DateValue)
           Debug.Print "Date: " & DateValue & "   Day: " & _
              Format(DateValue, "ddd") & "   Week: " & WeekNumber(DateValue)
       Next i
    End Sub
    					
  5. CTRL キーを押しながら、イミディ エイト ウィンドウを開くには、G キーを押します。
  6. プロジェクトを実行し、[保存] をクリックしてください Command1 イミディ エイト ウィンドウで次の結果を表示するには。
       WeekNumber function:
    Date: 12/28/03   Day: Sun   Week: 52
    Date: 12/29/03   Day: Mon   Week: 1
    Date: 12/30/03   Day: Tue   Week: 1
    Date: 12/31/03   Day: Wed   Week: 1
    					
    月曜日これで間違いを第 1 週と見なされることに注意してください。

プロパティ

文書番号: 200299 - 最終更新日: 2011年7月21日 - リビジョン: 5.0
キーワード:?
kbbug kbdatetime kbpending kbmt KB200299 KbMtja
機械翻訳の免責
重要: このサポート技術情報 (以下「KB」) は、翻訳者による翻訳の代わりに、マイクロソフト機械翻訳システムによって翻訳されたものです。マイクロソフトは、お客様に、マイクロソフトが提供している全ての KB を日本語でご利用いただけるように、翻訳者による翻訳 KB に加え機械翻訳 KB も提供しています。しかしながら、機械翻訳の品質は翻訳者による翻訳ほど十分ではありません。誤訳や、文法、言葉使い、その他、たとえば日本語を母国語としない方が日本語を話すときに間違えるようなミスを含んでいる可能性があります。マイクロソフトは、機械翻訳の品質、及び KB の内容の誤訳やお客様が KB を利用されたことによって生じた直接または間接的な問題や損害については、いかなる責任も負わないものとします。マイクロソフトは、機械翻訳システムの改善を継続的に行っています。
英語版 KB:200299
Microsoft Knowledge Base の免責: Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。

フィードバック

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com