Visual Basic for Applications:
Analiza składniowa daty z ciągu znaków

Jak to zrobić:

VBA oferuje prosty sposób na przekształcenie ciągu znaków na datę za pomocą funkcji CDate lub funkcji DateValue. Jednak kluczowe jest, aby ciąg znaków był w rozpoznawalnym formacie daty.

Oto podstawowy przykład użycia CDate:

Sub ParseDateUsingCDate()
    Dim dateString As String
    Dim parsedDate As Date
    
    dateString = "2023-04-01"
    parsedDate = CDate(dateString)
    
    Debug.Print "Przetworzona Data: "; parsedDate
End Sub

Jeśli uruchomisz ten kod, wynik w oknie Immediate (dostępnym za pomocą Ctrl+G w edytorze VBA) będzie wyglądał tak:

Przetworzona Data: 4/1/2023 

Alternatywnie, możesz użyć funkcji DateValue, która jest bardziej specyficzna dla dat (ignorując część czasu):

Sub ParseDateUsingDateValue()
    Dim dateString As String
    Dim parsedDate As Date
    
    dateString = "April 1, 2023"
    parsedDate = DateValue(dateString)
    
    Debug.Print "Przetworzona Data za pomocą DateValue: "; parsedDate
End Sub

Przykładowy wynik dla tego również pokazałby się w oknie Immediate:

Przetworzona Data za pomocą DateValue: 4/1/2023

Pamiętaj, że sukces parsowania zależy od tego, czy format daty w ciągu znaków odpowiada ustawieniom systemowym lub aplikacji.

Szczegółowa analiza

Wewnętrznie, gdy VBA parsuje ciąg znaków na datę, korzysta z regionalnych ustawień systemu operacyjnego Windows, aby zinterpretować format daty. Jest to kluczowe do zrozumienia, ponieważ ciąg znaków reprezentujący datę, który bez problemu zostanie przetworzony na jednym systemie, może spowodować błąd na innym, jeśli używają one różnych ustawień daty/czasu.

Historycznie, obsługa dat była częstym źródłem błędów w aplikacjach, szczególnie tych, które są używane międzynarodowo. Ta zależność od regionalnych ustawień w VBA jest powodem, dla którego niektórzy mogą rozważać alternatywy, takie jak format ISO 8601 (np. “RRRR-MM-DD”) dla jednoznacznej reprezentacji i parsowania daty na różnych systemach. Niestety, VBA nie obsługuje rodzimie formatu ISO 8601, a manualne parsowanie byłoby wymagane dla ścisłego przestrzegania.

W przypadku złożonego parsowania daty, wykraczającego poza to, co mogą obsłużyć CDate lub DateValue, lub w celu zapewnienia spójnego parsowania niezależnie od ustawień regionalnych systemu, programiści mogą sięgać po funkcje parsowania dostosowane. Mogą one obejmować dzielenie ciągu znaków reprezentującego datę na składowe (rok, miesiąc, dzień) i konstruowanie daty przy użyciu funkcji DateSerial. Inni mogą wybierać potężniejsze języki lub biblioteki zaprojektowane z myślą o internacjonalizacji do takich zadań.