08. marts 2007 - 19:37Der er
8 kommentarer og 1 løsning
VBA UserForm - Hvordan flyttes fra ListBox1 til ListBox2
Hej Eksperter Har lavet en User Form kaldet ”Selection Form” med to List Boxe. Ved at markere en linie i ListBox1 og efterfølgende tryk på knappen AddButton skal denne linie kopieres fra ListBox1 over i ListBox2. (altså en List Box transfér).
- Valgmulighederne i ListBox1 skal hentes fra et Excel Ark kaldet ”Certificates” hvori de forskellige valg er angivet i kolonne A1:A12. For nemhedens skyld regner jeg med at navngive disse celler ”AvailableCertificates”.
Idet jeg i VBA Editor ser på Properties for ListBox1 ser jeg en celle kaldet RowSource – jeg antager at det er her at man kan angive kildecellerne som jo var det navngivne område AvailableCertificates på arket Certificates.
Spørgsmål: - I cellen RowSource hvordan angiver jeg her korrekt hvorfra ListBox1 skal finde valgmulighederne ?
- Med hvilken VBA kode kan jeg få kopieret den valgte linie i ListBox1 til ListBox2 ved tryk på knappen AddButton ?
- Kilde cellerne (navngivet område AvailableCertificates) A1:A12 kan i fremtiden ske at udvide sig til A1:A20. Kan jeg i min VBA kode tage højde for dette ved at RowSource i ListBox1 properties altid søger og medtager sidste linie i det navngivne område AvailableCertificates ?
- Kan kildearket Certificates være et skjult ark i samme dokument som indeholder min SelectionForm ?
- I stedet for at angive RowSource i cellen for ListBox1 properties kunne det så være muligt At angive dette dette i alm VBA kode som feks: Sub ShowDialog() SelectionForm.ListBox1.RowSource = ??????? End Sub
Private Sub AddButton_Click() Dim X As Integer ListBox2.Clear ' tømmer boksen ' Jeg går ud far at du har multiselect på listbox1 For X = 0 To ListBox1.ListCount - 1 If ListBox1.Selected(X) Then ListBox2.AddItem ListBox1 Next End Sub
Yes - mine valgmuligheder fremkommer nu i ListBox1 når SelectionForm vises. Jeg kan samtidigt vælge en (og kun en) mulighed fra ListBox1 og når knappen Add trykkes kopiers den over i ListBox2. Perfekt. Dog er problemet nu at jeg skal kunne vælge og kopiere flere liner end blot en. Hvis jeg ønsker at kopiere endnu en linie fra ListBox1 til ListBox2 sker der det at den først kopierede i ListBox2 bare skifter navn istedet for at der i ListBox2 bliver tilføjet endnu en linie. Endnu en overvejelse er at det skal være muligt at kopiere den samme linie flere gange så den hver gang fremkommer i ListBox2.
Æv - hvis Mulitselect vælges kommer fejlmelding: Run time Error - type mismatch. Ved ikke hvad det betyder og hvad der trigger denne fejl, men den fremkommer kun hvis jeg vælger Multiselect i properties for ListBox1. Har derfor slået tilbage til SingleSelect. Hmm - der må være noget galt med min kode.. Jeg har mistanke om at det er relateret til hvorledes jeg angiver min RowSource. Se lige på neteksemplet her, hvor der i en ListBox1 angives valgbare måneder MEN med koden AddItem:
Sub ShowDialog() UserForm1.ListBox1.RowSource = "" ' Add some items to the ListBox With UserForm1.ListBox1 .RowSource = "" .AddItem "January" .AddItem "February" .AddItem "March" .AddItem "April" .AddItem "May" .AddItem "June" .AddItem "July" .AddItem "August" .AddItem "September" .AddItem "October" .AddItem "November" .AddItem "December" End With UserForm1.Show End Sub
Også i dette eksempel kan der flyttes fra ListBox1 til ListBox2 ved tryk på knappen Add. Her er koden for dette: Private Sub AddButton_Click() Dim i As Integer
If ListBox1.ListIndex = -1 Then Exit Sub If Not cbDuplicates Then ' See if item already exists For i = 0 To ListBox2.ListCount - 1 If ListBox1.Value = ListBox2.List(i) Then Beep Exit Sub End If Next i End If ListBox2.AddItem ListBox1.Value End Sub
Ovenstående kode virker som den skal, og det er også muligt at kopiere flere items, også af samme type, fra ListBox1 såfremt der er tikket af for accept af for dette med et flueben. (ListBox1 properties er desuden sat til Single)
Min kode med kildedata afviger fra neteksemplet idet jeg ikke angiver RowSource med .AddItem linier, men med flg enkelte linie: Sub ShowDialog() ' Tilføjer items til ListBox1 SelectionForm.ListBox1.RowSource = "AvailableCertificates"
End Sub
Årsagen er at jeg ønsker en navngiven Range som jeg skal have på et ark.
Samtidig har jeg flg kode for knappen Add: Private Sub AddButton_Click() Dim X As Integer ListBox2.Clear ' tømmer boksen ' Jeg går ud far at du har multiselect på listbox1 For X = 0 To ListBox1.ListCount - 1 If ListBox1.Selected(X) Then ListBox2.AddItem ListBox1 Next
End Sub
Desværre er mit problem stadigvæk at der kun kan kopieres en linie til ListBox2. Hvis der vælges en ny linie i ListBox1 og der trykkes Add knap sker der kun det at linien i ListBox2 bare skifter navn.
Har forsøgt alt muligt men kan ikke komme videre. Forslag til løsning modtages meget gerne.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.