Thema Datum  Von Nutzer Rating
Antwort
24.07.2023 14:50:19 AD
NotSolved
24.07.2023 17:27:47 Trägheit
Solved
Rot Kann Windows API-Funktion GetNumberFormatEx() nicht aufrufen – was mache ich falsch?
24.07.2023 22:39:41 AD
NotSolved

Ansicht des Beitrags:
Von:
AD
Datum:
24.07.2023 22:39:41
Views:
271
Rating: Antwort:
  Ja
Thema:
Kann Windows API-Funktion GetNumberFormatEx() nicht aufrufen – was mache ich falsch?

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!


Ihre Antwort
  • Bitte beschreiben Sie Ihr Problem möglichst ausführlich. (Wichtige Info z.B.: Office Version, Betriebssystem, Wo genau kommen Sie nicht weiter)
  • Bitte helfen Sie ebenfalls wenn Ihnen geholfen werden konnte und markieren Sie Ihre Anfrage als erledigt (Klick auf Häckchen)
  • Bei Crossposting, entsprechende Links auf andere Forenbeiträge beifügen / nachtragen
  • Codeschnipsel am besten über den Code-Button im Text-Editor einfügen
  • Die Angabe der Emailadresse ist freiwillig und wird nur verwendet, um Sie bei Antworten auf Ihren Beitrag zu benachrichtigen
Thema: Name: Email:



  • Bitte beschreiben Sie Ihr Problem möglichst ausführlich. (Wichtige Info z.B.: Office Version, Betriebssystem, Wo genau kommen Sie nicht weiter)
  • Bitte helfen Sie ebenfalls wenn Ihnen geholfen werden konnte und markieren Sie Ihre Anfrage als erledigt (Klick auf Häckchen)
  • Bei Crossposting, entsprechende Links auf andere Forenbeiträge beifügen / nachtragen
  • Codeschnipsel am besten über den Code-Button im Text-Editor einfügen
  • Die Angabe der Emailadresse ist freiwillig und wird nur verwendet, um Sie bei Antworten auf Ihren Beitrag zu benachrichtigen

Thema Datum  Von Nutzer Rating
Antwort
24.07.2023 14:50:19 AD
NotSolved
24.07.2023 17:27:47 Trägheit
Solved
Rot Kann Windows API-Funktion GetNumberFormatEx() nicht aufrufen – was mache ich falsch?
24.07.2023 22:39:41 AD
NotSolved