Avatar billede gibber Nybegynder
09. september 2005 - 13:26 Der 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
   
    ListBox1.ColumnCount = 2
    showhidden = chkHidden.Value  ' Skal skjulte ark vises?
    showvisible = chkVisible.Value ' Skal synlige ark vises?
    Call 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.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

End Sub

Hjælp ønskes.

/Gibber
Avatar billede bak Seniormester
09. september 2005 - 18:58 #1
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

        ' MsgBox (MyArray(0, 0) & i)

      End If
  Next ws

  ListBox1.List() = myarray
  ListBox1.SetFocus
  SendKeys "S"                                      ' Highlight Stamdata
Avatar billede gibber Nybegynder
09. september 2005 - 19:46 #2
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).
Avatar billede bak Seniormester
09. september 2005 - 21:14 #3
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"
Avatar billede bak Seniormester
09. september 2005 - 21:15 #4
sorry, en stavefejl

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
Avatar billede gibber Nybegynder
10. september 2005 - 09:38 #5
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
 
ReDim MyArrayVisible(Shtcount - 1, 1)
ReDim MyArrayHidden(ActiveWorkbook.Worksheets.Count - Shtcount - 1, 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 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
 
  ListBox1.SetFocus
  SendKeys "S"                                      ' Highlight Stamdata

End Sub
Avatar billede bak Seniormester
11. september 2005 - 18:37 #6
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

ReDim MyArray(ActiveWorkbook.Worksheets.Count - 1, 1) til
ReDim MyArray(ActiveWorkbook.Sheets.Count - 1, 1)

og måske
For Each ws In Application.Sheets
til
For Each ws In ActiveWorkbook.Sheets



du har 56 farver at chekke på, men det er måske ikke et problem ? (kan være du kun bruger et par stykker)
Avatar billede gibber Nybegynder
11. september 2005 - 19:21 #7
Tak for oplysningerne.

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.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester