Wow...! Du hast mir super geholfen!!
Was mir bislang überhaupt nicht bekannt war, ist dieser var-Datentyp und dass man in der Argumentliste ByVal übergeben kann. Davon habe ich in all meinen Jahren noch nirgendwo gelesen oder das offiziell dokumentiert gesehen. Ergooglen lässt sich das, wegen der allgemeingültigen Bezeichungen, auch nicht.
Zwei Dinge sind vielleicht noch interessant zu wissen:
- Ich hatte mir ein Helferfunktion geschrieben, der ich einen Double-Wert übergebe. Vorhin hat es eine kleine Ewigkeit gedauert, bis ich erkannt habe, dass Str$(dblValue) ein Leerzeichen vor der Zahl ausgibt. Dieses Leerzeichen hatte den Aufruf von GetNumberFormatEx() ebenfalls zum Scheitern gebracht.
- In meiner Implementierung war ich dem Vorschlag von https://codekabinett.com/rdumps.php?Lang=2&targetDoc=format-date-language-country-vba-access gefolgt. Philipp Stiefel meinte darin, dass man sich die Konvertierung nach Unicode sparen kann, wenn man die Funktionsparameter als LongPtr deklariert und einen Zeiger auf den VBA-intern gespeicherten Unicode-String übergibt.
Nun habe ich, deinem Ratschlag folgend, auch die Funktion GetDateFormatEx() (die im o. g. Hyperlink von Phillip Stiefel dargestellt wurde) umgeschrieben. Aber diese funktioniert nach dem neuen Schema nicht. Dort liefert lngResult immer "1". Das ist kein Fehler, aber immer ein leerer String. — Hast du eine Idee, woran das liegen kann?
Private Declare PtrSafe Function GetDateFormatEx& Lib "Kernel32" ( _
ByVal lpLocaleName As String, _
ByVal dwFlags As Long, _
ByRef lpDate As SystemTime, _
ByVal lpFormat As String, _
ByVal lpDateStr As String, _
ByVal cchDate As Long, _
ByVal lpCalendar As String _
)
Private Type SystemTime
wYear As Integer
wMonth As Integer
wDayOfWeek As Integer
wDay As Integer
wHour As Integer
wMinute As Integer
wSecond As Integer
wMilliseconds As Integer
End Type
Private Function DateToSystemTime(ByVal srcDate As Date) As SystemTime
With DateToSystemTime
.wDay = Day(srcDate)
.wMonth = Month(srcDate)
.wYear = Year(srcDate)
.wHour = Hour(srcDate)
.wMinute = Minute(srcDate)
.wSecond = Second(srcDate)
.wDayOfWeek = Weekday(srcDate, vbSunday)
End With
End Function
Public Function FormatDateLocale$(srcDate As Date, lcid$, Optional flags& = 0, Optional customFormat$ = vbNullString)
Dim buffer$
Dim charCount&
Dim sTime As SystemTime
lcid = StrConv(lcid, vbUnicode)
customFormat = StrConv(customFormat, vbUnicode)
sTime = DateToSystemTime(srcDate)
charCount = GetDateFormatEx(lcid, flags, sTime, customFormat, vbNullString, 0, vbNullString)
If charCount = 0 Then Err.Raise 1024, "FormatDateLocale", "Cannot format date value. Error code: " & Err.LastDllError
charCount = charCount * 2
buffer = String(charCount, vbNullChar)
charCount = GetDateFormatEx(lcid, flags, sTime, customFormat, buffer, charCount, vbNullString)
If charCount > 0 Then FormatDateLocale = Left$(StrConv(buffer, vbFromUnicode), charCount - 1)
End Function
Vielen Dank für deine erneute Hilfe im Voraus!
|