RSS

Visning af datoer i en Excel VBA ComboBox eller ListBox

Det kan være en drilagtig ting at vise datoer i ComboBoxe og ListBoxe i Excel VBA, fordi VBA laver om på formateringen, så datoerne ikke vises på den måde, man vil have det.

På denne side giver jeg et par tips og tricks til, hvordan du kan styre visningen.

En kollega havde lavet en dialogboks i Excel, hvor en ComboBox indlæste nogle datoer fra celler i regnearket, men datoerne blev vist i et andet format, og det var irriterende.

Lad os sige, at han i celle A1 havde formlen "=IDAG()", i celle A2 havde han formlen "= A1 + 1" osv. nedefter - i alt 7 datoer. Cellerne havde han formateret, så datoerne blev vist som dd-mm-yyyy, altså fx "28-07-2012".

I dialogboksens Initialize procedure indlæste han celleværdierne i ComboBoxen med:


With ComboBox1
   .AddItem Range("A1").Value
   .AddItem Range("A2").Value
   .AddItem Range("A3").Value
   .AddItem Range("A4").Value
   .AddItem Range("A5").Value
   .AddItem Range("A6").Value
   .AddItem Range("A7").Value
End With

Det virkede fint nok, men det irriterede ham, at datoerne i ComboBoxen blev vist i formatet: "7/28/2012" i stedet for "28-07-2012":

Datoer i ComboBox

Jeg foreslog, at han i stedet kunne bruge ComboBoxens property RowSource. Jeg udkommenterede hans .AddItem-kode og indsatte "A1:A7" i ComboBoxens property for RowSource. (RowSource kan også sættes runtime i Initialize-proceduren), og vupti, nu så det sådan ud:

Datoer i ComboBox

Det var præcis, som han ønskede, men der var bare det problem, at når man klikkede på en dato, blev den valgte dato vist som et tal i ComboBoxens tekstfelt. Sådan:

Datoer i ComboBox

Det problem kan man løse ved at indsætte følgende procedure i dialogboksens kode:


Private Sub ComboBox1_Change()
ComboBox1.Value = Format(ComboBox1.Value, "dd-mm-yyyy")
End Sub

Så kommer det til at se ud, som man vil have det:

Datoer i ComboBox

Den løsning havde jeg imidlertid ikke lige på rede hånd, så vi klarede den i stedet med følgende i formularens Initialize-procedure (efter at have fjernet angivelsen af RowSource):


Private Sub UserForm_Initialize()

Dim rCell As Range
Dim rInput As Range

'Sætter range-variablen rInput til området A1:A7
Set rInput = Worksheets(1).Range("A1:A7")

'Nu gennemløbes området, og fidusen er
'at konvertere datoen til en tekststreng
'af datatypen String:
For Each rCell In rInput
   ComboBox1.AddItem Str(rCell.Value)
Next

Set rCell = Nothing
Set rInput = Nothing
End Sub

Det virkede helt fint, og kollegaen var tilfreds. Fidusen var altså at konvertere datoerne til tekststrenge med funktionen "Str()", og visningen bliver ganske som ovenfor, hvor vi ændrede formateringen af VBA's "taldato". Når datoværdien konverteres til en String, vil den blive vist præcis, som den vises i cellen, man indlæser fra.

Skulle man have brug for at arbejde videre med den valgte værdi som dato (fx beregne antal dage mellem to datoer), kan man konvertere tilbage fra datatypen String til datatypen Date med VBA-funktionen CDate(dato som tekststreng).

Ovenstående har drejet sig om en ComboBox, men nøjagtig det samme gør sig gældende for en ListBox.

Relateret: