2016-07-07 69 views
0

VBA for ExcelでFormat()関数を使用する際に問題があります。私は問題が何であるかを少なくとも考えていません。私は以前の場所のトンでFormat()関数を使用しましたが、このような問題はありませんでした。VBAのFormat()関数が日付の書式設定が正しくない

コンテキストについては、状況を簡単に説明します。私はワークシートをたくさん持っていますが、すべて「mmm-yy」形式で月と年の組み合わせが付けられています(「メインシート」シートを除く)。下の関数(関連性のために簡略化されています)では、私の目的は各シートを循環させ、その名前を "yyyy"形式で表示することです。ご覧のとおり、7行目では、Format()関数を使用してワークシート名を「yyyy」形式に変換しています。

Function populateYearsCBB() 
    Dim WS As Worksheet 
    Dim yyyyName As Integer 
    For Each WS In ThisWorkbook.Worksheets 
     If WS.name <> "Main Sheet" Then 
      'WS.name is therefore a month-year combo of "mmm-yy" format 
      yyyyName = Format(WS.name, "yyyy")  'LINE 7 
      MsgBox (yyyyName) 
     End If 
    Next 
End Function 

もう少し背景:私の最初の5枚は、2016年の最初の5ヶ月間(5月 - 16、4月-16、月 - 16 ...)と、残りの12は、(2015年の12ヶ月間されています12月15日、11月15日...)。

もちろん、この機能を実行すると、メッセージボックスの出力は「2016」、「2016」、「2016」、「2016」、「2016」(5か月間2016)、次に12倍の「2015」となります。右?

奇妙なことに、1720個のメッセージボックスがすべて「2016」と表示されます。

何らかの理由で、7行目のFormat()関数が2015年を2016年として読み込んでいるようです。

私の人生にとって、ここで何が起こっているのか理解できません。誰か助けてください?

ありがとうございます!

+1

それは '15'とを解釈し、' 16'年として2016年までの日とデフォルトとして。あなたの特定の書式 '20"&Right(WS.Name、2) 'が動作するでしょう。 – arcadeprecinct

答えて

1

これが失敗する理由は、 'May-16'が日付ではないためです。あなたができることは、それを1つにして、それをDate型に変換し、次にフォーマットすることです。 ifとendの間のコードは、次のようになります。

Dim aDate as Date 
aDate = CDate("01-" + ws.name) ' e.g. '01-May-2015' which is a real date 
yyyyName = Format$(aDate, "yyyy") 

これでいいはずです。

+0

面白いのは、私があなたが言っていることを考えました。「5月16日」は日付ではないということです。だからFormat()関数のこの使用をテストするために、私は明示的にいくつかの "mmm-yy"文字列(別々の年)を与え、それらのテストでは毎回正しく年を識別して出力しました。だから、なぜ 'WS.name'文字列が渡されたときだけ失敗するのか理解できません。 –

+0

更新:あなたの提案の一部を使用しました。私はそれを渡す前に '' WS.name'の前に '' 01- "'を接頭していました。ありがとうございました。私はこの問題が、「5月16日」は日付ではなく、「yy」を日として解釈していたという@arcadeprecinctの提案がうまくいっているという事実を思い出します。いずれにしても、それが(なぜ私が上記のコメントで説明したように)テストで働いたのか、 'WS.name'文字列が渡された時ではないのかは分かりません。あなたがそれを理解するなら、私に知らせてください。 **とにかく、あなたのおかげです。** –

0

あなたが言ったように、あなたはあなたが同じことをフォーマットしておく、と仮定:

Function populateYearsCBB() 
Dim WS As Worksheet 
Dim yyyyName As Integer 
Dim yyyySplit() As String 

For Each WS In ThisWorkbook.Worksheets 
    If WS.name <> "Main Sheet" Then 
     yyyySplit = Split(WS.name, "-") 
     yyyyName = 20 & CInt(yyyySplit(1)) 
     'WS.name is therefore a month-year combo of "mmm-yy" format 
     'yyyyName = Format(WS.name, "yyyy")  'LINE 7 
     'you can change the name here using WS.name = yyyyName 
     MsgBox (yyyyName) 
    End If 
Next 
End Function 
+0

文字列 'yyyySplit(1)'を整数に変換するだけで、文字列に変換されます。私の意見では、 'Right(WS.Name、2)'を使う方が良いでしょう。文字列配列を作る必要がないからです。また、年が右(2桁と4桁の年と異なる区切り文字)のフォーマットも処理できます。 – arcadeprecinct

関連する問題