2016-07-07 8 views
0

Ich habe Probleme mit der Format() -Funktion in VBA für Excel. Ich habe nicht die geringste Ahnung, was das Problem ist. Ich habe die Format() -Funktion in Tonnen von Orten zuvor verwendet und nie hat es so Probleme gegeben.Format() -Funktion in VBA formatieren Daten nicht korrekt

Für den Kontext, lassen Sie mich kurz die Situation erklären. Ich habe eine Reihe von Arbeitsblättern, die alle mit einer Monat-Jahr-Kombination im Format "mmm-yy" benannt sind (mit Ausnahme des Blattes "Hauptblatt"). In der unten stehenden Funktion (vereinfacht für Relevanz) ist es mein Ziel, jeden Bogen durchzublättern und seinen Namen im Format "JJJJ" anzuzeigen. Wie Sie sehen können, verwende ich in Zeile 7 die Funktion Format(), um den Namen des Arbeitsblatts in das Format "JJJJ" zu konvertieren.

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 

Ein wenig mehr Hintergrund: Meine ersten 5 Blätter werden die ersten fünf Monate 2016 (Mai-16 Apr-16, Mar-16 ...) und die restlichen 12 sind die 12 Monate von 2015 (15. Dez., 15. Nov.).

Natürlich, wenn ich diese Funktion ausführen würde, würde ich erwarten, dass die Ausgaben meiner Nachrichtenkästen lauten: "2016", "2016", "2016", "2016", "2016" (für die fünf Monate 2016), und dann 12 Mal "2015". Recht?

Seltsamerweise bekomme ich 17 Nachrichtenfelder alle sagen "2016".

Aus irgendeinem Grunde die Funktion Format() in Zeile 7 scheint die 2015 Monate als 2016 als auch das Lesen werden.

Ich kann nicht für das Leben von mir herauszufinden, was hier vor sich geht. Jemand bitte helfen?

Vielen Dank im Voraus!

+1

Es interpretiert die '15' und' 16' als Tage und Vorgaben bis 2016 als Jahr. Für Ihr spezifisches Format würde "20" & Richtig (WS.Name, 2) 'funktionieren. – arcadeprecinct

Antwort

1

Der Grund dafür ist, dass "Mai-16" kein Datum ist. Was Sie tun können, ist es, es zu einem zu machen, es in einen Datumstyp zu konvertieren und dann zu formatieren. Ihr Code zwischen dem if und dem Ende wäre dann:

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

Das sollte es tun.

+0

Das Komische ist, ich habe daran gedacht, was du sagst - dass "Mai-16" kein Date ist. Um diese Verwendung der Funktion Format() zu testen, gab ich ihr explizit einige "mmm-yy" -Strings (von verschiedenen Jahren), und jedes Mal in diesen Tests identifizierte sie das Jahr korrekt und gab es aus. Aus diesem Grund kann ich nicht verstehen, warum es nur fehlschlägt, wenn die Zeichenfolge 'WS.name' übergeben wird. –

+0

UPDATE: Ich habe einen Teil Ihres Vorschlags benutzt. Ich habe "01-" 'vor' 'WS.name' 'vorangestellt und es scheint nun perfekt zu funktionieren. Dank dafür. Ich vermute, das Problem war dann die Tatsache, dass "Mai-16" kein Datum ist, und dies ist vielleicht, wo @arcadeprecinct Vorschlag, dass es das "yy" als Tage interpretieren würde, ins Spiel kommt. Wie auch immer, es macht immer noch keinen Sinn, warum es in den Tests funktioniert hat (wie ich im obigen Kommentar erkläre) und nicht, wenn die Zeichenfolge 'WS.name' übergeben wurde. Wenn Sie es herausfinden, lassen Sie es mich wissen. ** Jedenfalls danke euch beiden. ** –

0

Unter der Annahme, wie Sie gesagt haben, Sie halten Ihr die gleiche Formatierung:

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

Sie konvertieren den String 'yyyySplit (1)' in Integer, nur um ihn in einen String umzuwandeln. Meiner Meinung nach wäre die Verwendung von 'Right (WS.Name, 2)' eine bessere Wahl, da es nicht notwendig ist, ein String-Array zu erstellen. Es könnte auch mit jedem Format umgehen, in dem das Jahr auf der rechten Seite steht (zweistellige und vierstellige Jahreszahl sowie verschiedene Delimeter). – arcadeprecinct