09. september 2005 - 13:26Der er
6 kommentarer og 1 løsning
vba listbox kolonner
Jeg sidder og nørkler med et lille problem.
Jeg har en userform med en listbox og 2 checkboxe som henter arknavne ind til listboxen. Med checkboxene kan jeg definere og henholdsvis skjulte/synlige eller begge slags ark i mappen skal vises i listboxen. Så langt så godt.
Jeg har så prøvet at udvidde listboxen til 2 kolonner, således at navnet på arket vises i første kolonne, og farven på fanen til det pågældende ark vises i den anden kolonne. I første omgang checkes der på om fanen er grøn.
Jeg kan bare ikke lige finde min(e) fejl.
Her er min sub:
Dim ws As Worksheet Dim showhidden As Boolean Dim showvisible As Boolean Dim i As Single
If showvisible And ws.Visible = xlSheetVisible Then MyArray(i, 0) = ws.Name If ws.Tab.ColorIndex = 4 Then MyArray(i, 1) = "GRØN" Else MyArray(i, 1) = " " End If i = i + 1
ElseIf showhidden And ws.Visible = xlSheetHidden Then MyArray(i, 0) = ws.Name If ws.Tab.ColorIndex = 4 Then MyArray(i, 1) = "GRØN" Else: MyArray(i, 1) = " " End If i = i + 1
' MsgBox (MyArray(0, 0) & i)
End If Next ws ListBox1.List() = MyArray ListBox1.SetFocus SendKeys "S" ' Highlight Stamdata
jeg tror det er dit colorindex der driller. Det her virker, men har lidt problemer med myarray's størrelse
Dim ws As Worksheet Dim showhidden As Boolean Dim showvisible As Boolean Dim i As Single ReDim myarray(ActiveWorkbook.Worksheets.Count, 1)
ListBox1.ColumnCount = 2 showhidden = chkHidden.Value ' Skal skjulte ark vises? showvisible = chkVisible.Value ' Skal synlige ark vises? ListBox1.Clear
i = 0 For Each ws In Application.Sheets
If showvisible And ws.Visible = xlSheetVisible Then myarray(i, 0) = ws.Name If ws.Tab.Color = vbGreen Then myarray(i, 1) = "GRØN" Else myarray(i, 1) = " " End If i = i + 1
ElseIf showhidden And ws.Visible = xlSheetHidden Then myarray(i, 0) = ws.Name If ws.Tab.Color = vbGreen Then myarray(i, 1) = "GRØN" Else: myarray(i, 1) = " " End If i = i + 1
Takker, nu virker det efter hensigten. Bortset fra antallet af forekomster i listbox, som du selv skriver.
Er det ikke muligt at lave en variabel størrelse af myarray? (alternativet, kan man så ikke lave 3 arrays. 1 for alle ark i workbook. 1 for synlige ark og 1 for skjulte ark. Herefter kan man indlæse det korrekte array i listbox ud fra hvordan der er værdierne i checkbox'ene).
jo da. Det kræver at myarray vendes om, idet redim preserve kun virker på sidste led
Dim ws As Worksheet Dim showhidden As Boolean Dim showvisible As Boolean Dim i As Single ReDim myarray(1, ActiveWorkbook.Worksheets.Count)
ListBox1.ColumnCount = 2 showhidden = chkHidden.Value ' Skal skjulte ark vises? showvisible = chkVisible.Value ' Skal synlige ark vises? ListBox1.Clear
i = 0 For Each ws In Application.Sheets
If showvisible And ws.Visible = xlSheetVisible Then myarray(0, i) = ws.Name If ws.Tab.Color = vbGreen Then myarray(1, i) = "GRØN" Else myarray(1, i) = " " End If i = i + 1
ElseIf showhidden And ws.Visible = xlSheetHidden Then myarray(i, 0) = ws.Name If ws.Tab.Color = vbGreen Then myarray(1, i) = "GRØN" Else: myarray(1, i) = " " End If i = i + 1
' MsgBox (MyArray(0, 0) & i)
End If Next ws ReDim Preserve myarray(1, i - 1) ListBox1.List() = Application.Transpose(myarray) ListBox1.SetFocus SendKeys "S"
Dim ws As Worksheet Dim showhidden As Boolean Dim showvisible As Boolean Dim i As Single ReDim myarray(1, ActiveWorkbook.Worksheets.Count)
ListBox1.ColumnCount = 2 showhidden = chkHidden.Value ' Skal skjulte ark vises? showvisible = chkVisible.Value ' Skal synlige ark vises? ListBox1.Clear
i = 0 For Each ws In Application.Sheets
If showvisible And ws.Visible = xlSheetVisible Then myarray(0, i) = ws.Name If ws.Tab.Color = vbGreen Then myarray(1, i) = "GRØN" Else myarray(1, i) = " " End If i = i + 1
ElseIf showhidden And ws.Visible = xlSheetHidden Then myarray(1, i) = ws.Name If ws.Tab.Color = vbGreen Then myarray(1, i) = "GRØN" Else: myarray(1, i) = " " End If i = i + 1
' MsgBox (MyArray(0, 0) & i)
End If Next ws ReDim Preserve myarray(1, i - 1) ListBox1.List() = Application.Transpose(myarray) ListBox1.SetFocus SendKeys "S" ' Highlight Stamdata
Hej Bak, tak endnu en gang for din hjælp. Denne makro giver bare et problem hvis begge checkboxe ikke er markeret. Jeg har selv prøvet at bikse lidt sammen, så det virker til mit formål.
Du må meget gerne se hvor koden kan optimeres (din programmering ser mere overskuelig ud end min). Og smid lige et svar så du kan få dine point :)
Her en min makro:
Private Sub loaddata() Dim ws As Worksheet Dim showhidden As Boolean Dim showvisible As Boolean Dim i As Single Dim j As Single Dim Shtcount As Single
Shtcount = 0
ReDim MyArray(ActiveWorkbook.Worksheets.Count - 1, 1) For j = 1 To Sheets.Count If Sheets(j).Visible = True Then Shtcount = Shtcount + 1 Else: End If Next j
ListBox1.ColumnCount = 2 showhidden = chkHidden.Value ' Skal skjulte ark vises? showvisible = chkVisible.Value ' Skal synlige ark vises? ListBox1.Clear
i = 0 For Each ws In Application.Sheets
If showvisible And ws.Visible = xlSheetVisible Then MyArray(i, 0) = ws.Name If showhidden = True And showvisible = True Then Else MyArrayVisible(i, 0) = ws.Name End If
If ws.Tab.Color = vbGreen Then MyArray(i, 1) = "GRØN" If showhidden = True And showvisible = True Then Else MyArrayVisible(i, 1) = "GRØN" End If
Else MyArray(i, 1) = "HVID" If showhidden = True And showvisible = True Then Else MyArrayVisible(i, 1) = "HVID" End If End If i = i + 1
ElseIf showhidden And ws.Visible = xlSheetHidden Then MyArray(i, 0) = ws.Name If showhidden = True And showvisible = True Then Else MyArrayHidden(i, 0) = ws.Name End If If ws.Tab.Color = vbGreen Then MyArray(i, 1) = "(Skjult) GRØN" If showhidden = True And showvisible = True Then Else MyArrayHidden(i, 1) = "(Skjult) GRØN" End If Else MyArray(i, 1) = "(Skjult)" End If If showhidden = True And showvisible = True Then Else MyArrayHidden(i, 1) = "(Skjult)"
End If i = i + 1
End If Next ws If showvisible = True And showhidden = True Then ListBox1.List() = MyArray Else If showvisible = True And showhidden = False Then ListBox1.List() = MyArrayVisible Else If showvisible = False And showhidden = True Then ListBox1.List() = MyArrayHidden End If End If End If
lige et par ting. Du er vel klar over at worksheets og sheets ikke dækker over det samme. Sheets dækker alle faneblade (diagramark, xl4-makroark, dialogboksark mv., mens worksheets kun dækker reelle regneark. Dette betyder at din listbox kun kommer til at indeholde alm. regneark. Hvis du vil ændre dette skal du ændre linien Dim ws as Worksheet til Dim ws as Object
Jeg skal kun teste på grøn, så det er ikke noget problem med farverne - det skulle da lige være koden til ingen farve. Men den kan jeg vel nok finde et eller andet sted.
Tak for hjælpen, og du har fuldt ud fortjent dine point.
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.