peterleb
Goto Top

Word VBA Arrays

Hallo Leute,

ich brauche Euch mal zur Code-Berichtigung (es geht um ein Calendar Control)

Den Code:

cmbMonth.AddItem Choose(lngIndex, "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December")  

hatte ich (wegen der lokalen Sprache) geändert auf:

cmbMonth.AddItem Choose(lngIndex, VBA.MonthName(1), VBA.MonthName(2), VBA.MonthName(3), VBA.MonthName(4), VBA.MonthName(5), VBA.MonthName(6), _
               VBA.MonthName(7), VBA.MonthName(8), VBA.MonthName(9), VBA.MonthName(10), VBA.MonthName(11), VBA.MonthName(12))

Das funktioniert auch.
Um es noch einfacher zu machen, ist daraus entstanden:

cmbMonth.AddItem VBA.MonthName(lngIndex)

Jetzt stoppt es mit dem Fehler "Ungültiger Prozeduraufruf oder ungültiges Argument".
Warum klappt das nicht?

Vielen Dank für einen Tipp.
Peter

Content-ID: 1750485182

Url: https://administrator.de/contentid/1750485182

Ausgedruckt am: 19.12.2024 um 14:12 Uhr

colinardo
colinardo 22.01.2022 aktualisiert um 19:03:28 Uhr
Goto Top
Servus.
Da wir hier den Inhalt von lngIndex nicht sehen können, benutze ich mal meine Glaskugel und tippe darauf das der Index 0-basiert ist, und dann kommt es verständlicherweise zum Fehler weil 0 kein definierter Wert der MonthName Funktion ist die ja bei 1 beginnt und nicht bei 0.
Hast du also einen 0-basierten Index dann rechne einfach +1 zum Index hinzu und dein Problem lost sich in Luft auf.
cmbMonth.AddItem MonthName((lngIndex+1))
Grüße Uwe
PeterleB
PeterleB 22.01.2022 aktualisiert um 23:30:03 Uhr
Goto Top
Danke erstmal, ich poste morgen mal den ganzen Code.
(Gefunden - nicht mein "geistiges Eigentum")
PeterleB
PeterleB 23.01.2022 um 11:33:52 Uhr
Goto Top
So Ihr Lieben, hier ist der ganze Text. Leider finde ich den originalen Verfasser nicht mehr.
Der gesamte Code hat 1600 Zeilen.
Ich versuche mal den kompletten Abschnitt rauszuziehen und die Datei als Link.

cmbMonth ist eine ComboBox auf dem Formular.
Private Sub SetMonthCombobox(lngYearIn As Long, lngMonthIn As Long)
'Clears and sets value in month combobox.  
'Ensures months displayed in the combobox don't violate bounds set by the minimum or maximum date.  
Dim lgnYearMinDate As Long    'Year of the minimum date  
Dim lngYearMaxDate As Long    'Year of the maximum date  
Dim lngMonthMinDate As Long   'Month of the minimum date  
Dim lngMonthMaxDate As Long   'Month of the maximum date  
Dim lngIndex As Long          'Used for looping  
   
  'Get month and year of minimum and maximum dates and clear combobox  
  lgnYearMinDate = Year(m_varMinDate)
  lngYearMaxDate = Year(m_varMaxDate)
  lngMonthMinDate = Month(m_varMinDate)
  lngMonthMaxDate = Month(m_varMaxDate)
  cmbMonth.Clear
  'Evaluate and populate month combobox.  
  Select Case True
    Case lngYearIn = lgnYearMinDate And lngYearIn = lngYearMaxDate 'Both minimum and maximum dates occur in selected year.  
      For lngIndex = lngMonthMinDate To lngMonthMaxDate
        If Not m_bAbbreviateMonths Then
          'cmbMonth.AddItem Choose(lngIndex, "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December")  
'          cmbMonth.AddItem Choose(lngIndex, VBA.MonthName(1), VBA.MonthName(2), VBA.MonthName(3), VBA.MonthName(4), VBA.MonthName(5), VBA.MonthName(6), _  
'                VBA.MonthName(7), VBA.MonthName(8), VBA.MonthName(9), VBA.MonthName(10), VBA.MonthName(11), VBA.MonthName(12))  
          cmbMonth.AddItem VBA.MonthName(lngIndex)
        Else
          'cmbMonth.AddItem Choose(lngIndex, "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec")  
'          cmbMonth.AddItem Choose(lngIndex, VBA.MonthName(1, True), VBA.MonthName(2, True), VBA.MonthName(3, True), VBA.MonthName(4, True), VBA.MonthName(5, True), VBA.MonthName(6, True), _  
'                VBA.MonthName(7, True), VBA.MonthName(8, True), VBA.MonthName(9, True), VBA.MonthName(10, True), VBA.MonthName(11, True), VBA.MonthName(12, True))  
          cmbMonth.AddItem VBA.MonthName(lngIndex, True)
        End If
      Next lngIndex
      If lngMonthIn < lngMonthMinDate Then lngMonthIn = lngMonthMinDate
      If lngMonthIn > lngMonthMaxDate Then lngMonthIn = lngMonthMaxDate
      cmbMonth.ListIndex = lngMonthIn - lngMonthMinDate
    Case lngYearIn = lgnYearMinDate 'Only minimum date occurs in selected year.  
      For lngIndex = lngMonthMinDate To 12
        If Not m_bAbbreviateMonths Then
          'cmbMonth.AddItem Choose(lngIndex, "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December")  
'          cmbMonth.AddItem Choose(lngIndex, VBA.MonthName(1), VBA.MonthName(2), VBA.MonthName(3), VBA.MonthName(4), VBA.MonthName(5), VBA.MonthName(6), _  
'                VBA.MonthName(7), VBA.MonthName(8), VBA.MonthName(9), VBA.MonthName(10), VBA.MonthName(11), VBA.MonthName(12))  
          cmbMonth.AddItem VBA.MonthName(lngIndex)
        Else
          'cmbMonth.AddItem Choose(lngIndex, "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec")  
'          cmbMonth.AddItem Choose(lngIndex, VBA.MonthName(1, True), VBA.MonthName(2, True), VBA.MonthName(3, True), VBA.MonthName(4, True), VBA.MonthName(5, True), VBA.MonthName(6, True), _  
'                VBA.MonthName(7, True), VBA.MonthName(8, True), VBA.MonthName(9, True), VBA.MonthName(10, True), VBA.MonthName(11, True), VBA.MonthName(12, True))  
          cmbMonth.AddItem VBA.MonthName(lngIndex, True)
        End If
      Next lngIndex
      If lngMonthIn < lngMonthMinDate Then lngMonthIn = lngMonthMinDate
      cmbMonth.ListIndex = lngMonthIn - lngMonthMinDate
    Case lngYearIn = lgnYearMinDate 'Only maximum date occurs in selected year.  
      For lngIndex = 1 To lngMonthMaxDate
        If Not m_bAbbreviateMonths Then
          'cmbMonth.AddItem Choose(lngIndex, "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December")  
'          cmbMonth.AddItem Choose(lngIndex, VBA.MonthName(1), VBA.MonthName(2), VBA.MonthName(3), VBA.MonthName(4), VBA.MonthName(5), VBA.MonthName(6), _  
'                VBA.MonthName(7), VBA.MonthName(8), VBA.MonthName(9), VBA.MonthName(10), VBA.MonthName(11), VBA.MonthName(12))  
          cmbMonth.AddItem VBA.MonthName(lngIndex)
        Else
          'cmbMonth.AddItem Choose(lngIndex, "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec")  
'          cmbMonth.AddItem Choose(lngIndex, VBA.MonthName(1, True), VBA.MonthName(2, True), VBA.MonthName(3, True), VBA.MonthName(4, True), VBA.MonthName(5, True), VBA.MonthName(6, True), _  
'                VBA.MonthName(7, True), VBA.MonthName(8, True), VBA.MonthName(9, True), VBA.MonthName(10, True), VBA.MonthName(11, True), VBA.MonthName(12, True))  
          cmbMonth.AddItem VBA.MonthName(lngIndex, True)
        End If
      Next lngIndex
      If lngMonthIn > lngMonthMaxDate Then lngMonthIn = lngMonthMaxDate
      cmbMonth.ListIndex = lngMonthIn - 1
    Case Else 'No minimum or maximum date in selected year. Add all months to combobox.  
       If Not m_bAbbreviateMonths Then
          'cmbMonth.List = Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December")  
'          cmbMonth.List = Array(VBA.MonthName(1), VBA.MonthName(2), VBA.MonthName(3), VBA.MonthName(4), VBA.MonthName(5), VBA.MonthName(6), _  
'                VBA.MonthName(7), VBA.MonthName(8), VBA.MonthName(9), VBA.MonthName(10), VBA.MonthName(11), VBA.MonthName(12))  
          cmbMonth.AddItem VBA.MonthName(lngIndex)
       Else
          'cmbMonth.AddItem Choose(lngIndex, "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec")  
'          cmbMonth.List = Array(VBA.MonthName(1, True), VBA.MonthName(2, True), VBA.MonthName(3, True), VBA.MonthName(4, True), VBA.MonthName(5, True), VBA.MonthName(6, True), _  
'                VBA.MonthName(7, True), VBA.MonthName(8, True), VBA.MonthName(9, True), VBA.MonthName(10, True), VBA.MonthName(11, True), VBA.MonthName(12, True))  
          cmbMonth.AddItem VBA.MonthName(lngIndex)
       End If
      cmbMonth.ListIndex = lngMonthIn - 1
  End Select
lbl_Exit:
  Exit Sub
End Sub

Gruß
Peter
PeterleB
PeterleB 23.01.2022 aktualisiert um 11:45:59 Uhr
Goto Top
Und hier die Datei.
frmDatePicker.frm

oder die ganze Word-Datei:
DatePicker Custom Calendar Form Rev 1.5.dotm
colinardo
Lösung colinardo 23.01.2022 aktualisiert um 14:59:56 Uhr
Goto Top
Fixed. Du hast vergessen im letzten Select Vergleich die Schleife über die Monate um das Konstrukt hinzuzufügen, deswegen war lngIndex nicht definiert und verständlicherweise meckert er das dann an. Des weiteren war eine unbenutzte nicht deklarierte Variable strTemp in dem Wust vorhanden, die er bei Option Strict natürlich ebenfalls anmeckert.
Download der gefixten Vorlage

Grüße Uwe
PeterleB
PeterleB 23.01.2022 aktualisiert um 14:14:05 Uhr
Goto Top
Hallo colinardo,

vielen Dank.
Habe jetzt auch den Urheber wiedergefunden.
Trevor Eyre

Das Control ist recht gut einsetzbar.
Ich muß jedoch auch mehrere Tage (wenigstens hintereinanderliegende) markieren / selektieren können.
Kann man das dem DatePicker noch beibringen?

Noch eine Frage:
Wenn ich die Demo teste und den Button "Insert in Document" drücke, gibt's einen Laufzeitfehler.

Gruß
Peter
colinardo
colinardo 23.01.2022 aktualisiert um 15:00:46 Uhr
Goto Top
Zitat von @PeterleB:
Das Control ist recht gut einsetzbar.
Btw. es gibt bereits ein Microsoft-Calendar-Picker-Control, da braucht man sich nicht zwingend ein eigenes bauen ...
screenshot

Ich muß jedoch auch mehrere Tage (wenigstens hintereinanderliegende) markieren / selektieren können.
Kann man das dem DatePicker noch beibringen?
Realisieren kann man alles, alles eine Frage des Preises. Durch den Code arbeite ich mich jetzt aber ehrlich gesagt nicht für lau durch. Frage halt mal den Urheber.
Noch eine Frage:
Wenn ich die Demo teste und den Button "Insert in Document" drücke, gibt's einen Laufzeitfehler.
Lies mal den Hinweistext zu "E", der übergibt der Funktion ein Control als Parameter, welches es in der Demo verständlicherweise nicht gibt ... Peng (hat er nicht bedacht). Schon mal was vom VBA-Debugger Breakpoints und F8 gehört? Vermutlich nicht face-smile.
PeterleB
PeterleB 23.01.2022 um 15:30:40 Uhr
Goto Top
Sorry.
Bin leider kein Profi.

Aber das Microsoft Date and Time Picker Control funktioniert in den 64bit Officeversionen nicht mehr.

Deswegen versuche ich diese Lösung hier anzupassen.

Nochmals vielen Dank und noch
einen schönen Sonntag.

Gruß
Peter
colinardo
colinardo 23.01.2022 aktualisiert um 19:44:47 Uhr
Goto Top
Aber das Microsoft Date and Time Picker Control funktioniert in den 64bit Officeversionen nicht mehr.
Dann baut man sich mit Visual Studio ein eigenes, mit dem .NET DatePicker gibt es ja schon ein fertiges, das zieht man in sein custom control rein exposed den Wert des DateTimePickers als Custom Property und macht das ganze COM-Visible face-smile. Man erhält eine DLL die keine 7KB groß ist und die man mit
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\RegAsm.exe /codebase DatePickerControl.dll
in einer elevated Shell für das 64Bit Office registriert.

Schon hat man dort auch ein Control zur Verfügung face-smile

screenshot

An den Wert des Controls kommt man dann über die Property DateTimeValue
strDatum =  Format(dtControl1.DateTimeValue,"dd.MM.yyyy")  

Feedich.

Grüße Uwe
PeterleB
PeterleB 23.01.2022 aktualisiert um 20:36:18 Uhr
Goto Top
Lieber Freund,

das übersteigt meine Kenntnisse und Erfahrungen.
Ich bin doch nur ein kleiner Hobby-Bastler.

Aber Danke für Deinen Tipp.

Gruß
Peter.

PS: Warum macht das MS nicht endlich selbst?
colinardo
colinardo 24.01.2022 aktualisiert um 08:03:12 Uhr
Goto Top
Zitat von @PeterleB:
Ich bin doch nur ein kleiner Hobby-Bastler
Sollte nur die Möglichkeiten aufzeigen 🙂
PS: Warum macht das MS nicht endlich selbst?
Weil VBA ehrlich gesagt eine Technik von gestern ist, es gibt inzwischen bessere Lösungen die auch Geräteubergreifend funktionieren. Man denke nur an Smartphone Tablet & Co. die damit nichts anfangen können. Formulare auf Word/Excel Basis sind eben veraltet, da steckt man keine Manpower mehr rein.
Für sowas entwickelt man heutzutage Web-Anwendungen/Formulare die dann von überall nutzbar sind.