21. januar 2012 - 21:24
Der 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
Kan sende Excel arket, hvis dette er nemmer.
Hilsen
JAHT
21. januar 2012 - 23:07
#3
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.
Ex.:
Debug.Print Sheets("Ark1").ComboBox1.ListIndex
27. januar 2012 - 22:53
#4
Hej Jacob
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
'tæl tælle variablen l op med 1
l = l + 1
'redimensioner MitArray
ReDim Preserve mitarray(1, l)
End If
'næste celle
Next
'træk den sidste tomme række ud af mitarray
ReDim Preserve mitarray(1, l - 1)
'tilføj comboboksen værdierne fra mitarray
UserForm3.NameCB.Column() = mitarray
'kald proceduren sorterComboboxNamecb
sorterComboboxNamecb
End Sub
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