21. januar 2012 - 21:24Der er
3 kommentarer og 1 løsning
Opslag i userform - Hjælp til VBA kode
Hej,
Jeg har et Excel ark, hvori der er indarbejdet en userform. I denne userform kan brugeren vælge nogle værdier vha. af en liste.
Arket er bygget op således: Kolonne B: Bærenr. Kolonne D: Navn
I userformen kan brugeren vælge de navne som er anført i kolonne D. Jeg kunne godt tænke mig, at det var muligt at få vist den værdi der står i kolonne B, ud for det navn som brugeren har valgt i listen.
Vil høre om det var muligt at lave en VBA kode, som kunne håndtere dette
Brug ListIndex værdien til at finde rækken for den værdi du har valgt.
Hvis værdierne i din listbox er hentet fra kol. D række 1 til 9, så vil ListIndex værdien være nogenlunde tilsvarende. Læg til eller træk fra så ListIndex værdien passer med dine rækkenr.
Så kan du efterfølgende blot referere til cellen i kol. B med ListIndex værdien +/- som rækkeværdi.
For go´ ordens skyld, så kommer her lige teksten/løsningen, som jeg har postet til dig.
-------------------
Der er en del rettelser/tilføjelser til dine koder, som jeg vil forsøge at liste op herunder. Tilføjelser er markeret med fed skrift.
I modulet: Vis_Userform har jeg slettet en del linier, så koden under cmdÅbenUserFormIndtastning() knappen ser således ud ...
Sub cmdÅbenUserFormIndtastning()
'åbn userform3 UserForm3.Show
End Sub
På formen: UserForm3 har jeg ændret følgende ...
I proceduren: udfyldCombo() har jeg tilføjet en if sætning, som leder frem til en nyoprettet procedure, hvis combonavnet er Namecb. Det er gjort, da din "normale" fyld combobox med AddItem ikke fungerer, da comboen Namecb indeholder 2 kolonner.
Private Sub udfyldCombo() Dim omRåderne As Variant, ix As Byte, combo As Object, comboNavn As String omRåderne = Array("NameAktier", "NameAktierUdenlandske", "NameObl", "NameOblUdenlandske", "NameInv") '<---- kan ajourføres faneNavn = MultiPage1.SelectedItem.Caption comboNavn = findComboNavn(LCase(faneNavn)) If comboNavn <> "" Then
'hvis combonavnet er NameCB, så fyld værdier i comboboxen via mitarray i proceduren FyldComboboxNamecb If comboNavn = "Namecb" Then
'fyld comboboxen Namecb FyldComboboxNamecb
Else
Set combo = UserForm3.Controls(comboNavn) combo.Clear
For ix = 0 To UBound(omRåderne) For Each cc In ActiveWorkbook.Sheets("Oversigt").Range(omRåderne(ix)) If cc.Value <> "" Then combo.AddItem cc End If Next cc Next ix
sortering combo End If
End If End Sub
Den nyoprettede procedure: FyldComboboxNamecb() som fylder mitarray med den fundne værdien i kolonne D og B Efter at mitarray er blevet fyldt med de aktuelle værdier, kaldes endnu en nyoprettet procedure, som sorterer comboboxen Namecb Private Sub FyldComboboxNamecb() Dim i As Integer 'tællevariabel Dim c As Range 'objektvariabel Dim l As Integer 'tælle variabel til MitArray 'sæt tælle variabel = 0 l = 0 'opret MitArray Dim mitarray() As Variant 'redimensioner mitarray med 2 kolonner og 1 række ReDim mitarray(1, 0) 'comboboksen skal indeholde 2 kolonner UserForm3.NameCB.ColumnCount = 2
'fyld comboboxen med værdier fra kolonne D på arket Oversigt 'Start i celle 8 og slut i sidste celle indeholdende en værdi For i = 8 To Sheets("Oversigt").Range("D65536").End(xlUp).row
'set C = den næste celle i kolonnen Set c = Worksheets("Oversigt").Cells(i, 4)
'hvis cellen er forskellig fra tom og skrifttypen ikke er bold 'på Dansk: hvis der står noget i cellen, som ikke er med skrevet med fed skrift If c.Value <> "" And c.Font.Bold = False And c.Font.Italic = False Then
'opret række i MitArray 'giv kolonne 1 værdien fra kolonne B ud for den aktive celle mitarray(0, l) = c.Offset(0, -2).Value
'giv kolonne 2 værdien fra den aktive celle mitarray(1, l) = c.Value
Den nyoprettede procedure: SorterComboboxNamecb() som tildeler sarray værdierne fra comboboxen, hvorefter sarray sorteres efter kolonne 1 = kolonne D på regnearket Efter at sarray er blevet sorteret bliver comboboxen Namecb column-egenskab tildelt sarray kolonne værdier.
Public Sub SorterComboboxNamecb() Dim antal As Long, cc As Object Dim sarray(), ix As Long, j As Long Dim byt1 As Variant Dim byt2 As Variant
'sæt antal = med antallet af rækker i comboboxen antal = UserForm3.NameCB.ListCount
'redimensioner sarray til 2 kolonner samt antal rækker i comboboxen Namecb minus 1 ReDim sarray(1, antal - 1)
'fyld værdier i sarray fra comboboxen Namecb For ix = 1 To antal 'kolonne 1 sarray(0, ix - 1) = UserForm3.NameCB.Column(0, ix - 1) 'kolonne 2 sarray(1, ix - 1) = UserForm3.NameCB.Column(1, ix - 1)
Next ix
'udfør sorteringen af værdierne i comboboxens kolonne 1 = kolonne D på regnearket 'ta´ værdierne fra kolonne B på regnearket med over i comboboxens kolonne 0 For ix = antal - 1 To 1 Step -1 For j = 1 To ix
If sarray(1, j - 1) > sarray(1, j) Then
'kolonne 1 byt1 = sarray(0, j - 1)
'kolonne 2 byt2 = sarray(1, j - 1)
'kolonne 1 sarray(0, j - 1) = sarray(0, j)
'kolonne 2 sarray(1, j - 1) = sarray(1, j)
'kolonne 1 sarray(0, j) = byt1
'kolonne 2 sarray(1, j) = byt2
End If
Next j
Next ix
'tildel comboboxen de sorterede værdier UserForm3.NameCB.Column() = sarray
End Sub
Slutteligt har jeg kodemæssigt skrevet lidt i comboboxen Namecb´s klik hændelse. Ved et klik på en værdi i comboboxen tildeles textbox10 værdien af bærenummeret (fra kolonne 0 i comboboxen) der tilhører den klikkede værdi. Private Sub NameCB_Click()
'sæt textboksen bærenummer = værdien fra kolonne B i forhold til den valgte værdi på listen Me.TextBox10.Value = Me.NameCB.Column(0)
End Sub
Og som rosinen i pølseenden ... Så har jeg skjult kolonne 0 i comboboxen Namecb via boxens: Properties > ColumnWidths som er sat til: 0 pt;200 pt ... hvilket gør, at 1. kolonne ikke vises, da dens bredde er sat til 0.
----------------
Med venlig hilsen, Nicolai
Synes godt om
Ny brugerNybegynder
Din løsning...
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.