2016-07-07 264 views
0

我在使用Excel中的VBA中的Format()函數時遇到問題。我不知道問題是什麼。我之前在多個地方使用了Format()函數,並且從來沒有像這樣給出過麻煩。VBA中格式化()函數無法正確格式化日期

對於上下文,讓我簡單解釋一下情況。我有一堆工作表,都以「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月 - 16年4月 - 16月16 ...),其餘12是12個月的2015年( 12月15日,11月15日...)。

當然,當我運行這個函數時,我希望我的消息框的輸出爲:「2016」,「2016」,「2016」,「2016」,「2016」(五個月2016年),然後是「2015年」的12倍。對?

奇怪的是,我收到了17個消息框,都說「2016」。

出於某種原因,第7行上的Format()函數似乎也將2016年的月份讀爲2016年。

我不能爲我的生活找出這裏發生了什麼。有人請幫忙?

在此先感謝!

+1

它解釋了'15'和'16'如天,默認爲2016年一年。對於你的特定格式'「20」&Right(WS.Name,2)'會起作用。 – arcadeprecinct

回答

1

這個失敗的原因是'May-16'不是日期。你可以做的是把它合併爲一個,將它轉換爲Date類型,然後格式爲。您的代碼之間的if和結束,如果然後將是:

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-」',現在看起來很完美。感謝那。我認爲這個問題是因爲「May-16」不是約會的事實,這可能是@arcadeprecinct的建議,即它將「yy」解釋爲日子,進入遊戲。無論哪種方式,它仍然沒有道理爲什麼它在測試中工作(正如我在上面的註釋中解釋的),而不是當傳遞'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)'是更好的選擇,因爲不需要創建一個字符串數組。它也可以處理任何格式的年份在右側(兩位數和四位數年份以及不同的分隔符)。 – arcadeprecinct