logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

VBA Excel Multipage - Błąd przy inicjalizacji wielu ListBoxów na stronach

MarTeaM 17 Gru 2010 10:43 6330 16
REKLAMA
  • #1 8879104
    MarTeaM
    Poziom 9  
    Posty: 39
    Ocena: 1
    Mam UserForm w którym jest Multipage z 7 stronami. Na każdej stronie jest ListBox ( też jest ich 7 oczywiście - po jednym na stronę) z kolumnami i każdy ListBox jest powiązany ze swoim arkuszem.
    
    UserForm4.MultiPage1.Value = 0
    UserForm4.Show

    Ten kod otwiera mi Userform tylko wtedy kiedy w
    
    Private Sub UserForm_Initialize()
    ListBox1.ColumnCount = 5
    ListBox1.RowSource = "test!G8:K97"
    End Sub

    Jak dodam do Private Sub jeszcze 6 Listbox'ów po jednym na każdą stronę to wyskakuje mi błąd na tym pierwszym kodzie.
  • REKLAMA
  • #2 8879182
    marcinj12
    Poziom 40  
    Posty: 3404
    Pomógł: 1024
    Ocena: 250
    U mnie to działa, upewnij się że dobrze ponazywałeś / odwołujesz się do ListBox'ów. Jaki komunikat o błędzie dostajesz?
  • #3 8879204
    MarTeaM
    Poziom 9  
    Posty: 39
    Ocena: 1
    U mnie też to działa tylko jak to zrobić żeby działało na siedmiu stronach MultiPage'a? Próbuję coś takiego ale niestety nie wiem co jest źle :|
    
    Sub Show_UserForm4()
        
        UserForm4.MultiPage1.Page1.Value = Index0
        UserForm4.MultiPage1.Page2.Value = Index1
        UserForm4.MultiPage1.Page3.Value = Index2
        UserForm4.MultiPage1.Page4.Value = Index3
        UserForm4.MultiPage1.Page5.Value = Index4
        UserForm4.MultiPage1.Page6.Value = Index5
        UserForm4.MultiPage1.Page7.Value = Index6
        UserForm4.Show
    
    End Sub

    i to:
    Private Sub UserForm_Initialize()
    Page1.ListBox1.ColumnCount = 5
    Page1.ListBox1.RowSource = "test!G8:K97"
    Page2.ListBox2.ColumnCount = 5
    Page2.ListBox2.RowSource = "BAAN 3!G8:K97"
    Page3.ListBox3.ColumnCount = 5
    Page3.ListBox3.RowSource = "BAAN 4!G8:K97"
    Page4.ListBox4.ColumnCount = 5
    Page4.ListBox4.RowSource = "BAAN 5!G8:K97"
    Page5.ListBox5.ColumnCount = 5
    Page5.ListBox5.RowSource = "BAAN 6!G8:K97"
    Page6.ListBox6.ColumnCount = 5
    Page6.ListBox6.RowSource = "BAAN 7!G8:K97"
    Page7.ListBox7.ColumnCount = 5
    Page7.ListBox7.RowSource = "BAAN 8!G8:K97"
    End Sub

    i nie działa mi to mam błąd 424.
  • REKLAMA
  • #4 8879375
    marcinj12
    Poziom 40  
    Posty: 3404
    Pomógł: 1024
    Ocena: 250
    A do czego ma służyć ten fragment:
    UserForm4.MultiPage1.Page1.Value = Index0
        UserForm4.MultiPage1.Page2.Value = Index1
        UserForm4.MultiPage1.Page3.Value = Index2
        UserForm4.MultiPage1.Page4.Value = Index3
        UserForm4.MultiPage1.Page5.Value = Index4
        UserForm4.MultiPage1.Page6.Value = Index5
        UserForm4.MultiPage1.Page7.Value = Index6 
    ?
    Za pomocą wartości UserForm4.Multipage1.Value = ... ustawiasz, która zakładka (1, 2, 3 etc.) ma być aktywna. Poza tym obiekt MultiPage chyba nie ma obiektów .Page1 .Page2 etc ?
  • REKLAMA
  • #5 8879426
    MarTeaM
    Poziom 9  
    Posty: 39
    Ocena: 1
    Ale ja chcę żeby wszystkie zakładki były aktywne. No mój MultiPage ma zakładki Page1, Page2 itd. Przechodzac po Page'ach chce na każdym z osobna widzieć to co jest na kolejnych arkuszach czyli (test, BAAN 3, BAAN 4 itd).
    
    UserForm4.MultiPage1.Value = 0
    UserForm4.Show

    Jak użyje tylko tego to też nie działa. Pomocy
  • #6 8879476
    marcinj12
    Poziom 40  
    Posty: 3404
    Pomógł: 1024
    Ocena: 250
    MultiPage może mieć tylko jedną zakładkę aktywną. Nie bardzo sobie wyobrażam żeby jak na raz wszystkie mogły by być aktywne...
    Wrzuć plik najlepiej...
  • #7 8891044
    MarTeaM
    Poziom 9  
    Posty: 39
    Ocena: 1
    Załączam plik ale nie ze wszystkimi arkuszami bo jest ich bardzo dużo. Ale to co chcem zrobić dotyczy tylko tych arkuszy. Chciałbym żeby przechodząc po zakładkach w multipage przechodził po kolejnych arkuszach. OK jedna jest aktywna ale jak przejdę do drugiej zakładki to powinna byc druga aktywna itd.
    Załączniki:
    • tester.xls (459 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #8 8891415
    marcinj12
    Poziom 40  
    Posty: 3404
    Pomógł: 1024
    Ocena: 250
    Tam, gdzie jako źródło wierszy do listboxa masz nazwy ze spacją, musisz umieścić je w apostrofach.
    Czyli w UserForm4, MultiPage1_Change() możesz usunąć, wystarczy że zostawisz to (zwróć uwagę na apostrofy!):
    Private Sub UserForm_Initialize()
    ListBox1.ColumnCount = 5
    ListBox1.RowSource = "'BAAN 2'!G8:K97"
    ListBox2.ColumnCount = 5
    ListBox2.RowSource = "'BAAN 3'!G8:K97"
    ListBox3.ColumnCount = 5
    ListBox3.RowSource = "'BAAN 4'!G8:K97"
    ListBox4.ColumnCount = 5
    ListBox4.RowSource = "'BAAN 5'!G8:K97"
    ListBox5.ColumnCount = 5
    ListBox5.RowSource = "'BAAN 6'!G8:K97"
    ListBox6.ColumnCount = 5
    ListBox6.RowSource = "'BAAN 7'!G8:K97"
    ListBox7.ColumnCount = 5
    ListBox7.RowSource = "'BAAN 8'!G8:K97"
    End Sub


    Tak naprawdę możesz właściwość RowCount ustawić na stałe w designerze dla każdej listy i wywalić to z kodu.
    Możesz też ustawić automatyczne ustalenie zakresu ostatniego wiersza w zakresie, dla każdego zakresu dać:
    ost_wiersz = Worksheets("BAAN 3").Range("G65536").End(xlUp).Row
    ListBox2.RowSource = "'BAAN 3'!G8:K" & ost_wiersz
  • REKLAMA
  • #9 8891471
    MarTeaM
    Poziom 9  
    Posty: 39
    Ocena: 1
    Dziękuję :D Działa. Mam jeszcze dwa pytania:
    Pierwsze dotyczące drukowania zaznaczonego tekstu w Listbox'ie. Chodzi o to jaka komenda ma być w CommandButton_Click jeżeli chcę wydrukować to co zaznaczyłem plus dwie kolumny dalej? czyli np: jak zaznaczę w Page1 wiersze od 01 do 15 to wydrukuje mi się zaznaczenie ale z dwiema kolumnami więcej z tym zaznaczeniem (zaznaczenie: G8:K22 a wydruk G8:M22). Najlepiej byłoby jakbym miał tylko jeden CommandButton_Click dla każdego Page'a czyli jak się domyślam byłby on na UserForm'ie tylko wtedy musiałby się odnosić do aktywnego Page'a i zaznaczenia w nim no i oczywiście do dwóch kolumn które są niewidoczne w ListBox'ie (jak wspomniałem wyżej). Czy można ustawić szerokość kolumn w ListBox'ie?
    Drugie dotyczące wstawienia siatki w Listbox'ie. Czy jest jakaś możliwość zrobienia siatki?
  • #10 8891710
    marcinj12
    Poziom 40  
    Posty: 3404
    Pomógł: 1024
    Ocena: 250
    W komponencie ListBox chyba nie ma możliwości zrobienia siatki.
    Do tego musiałbyś wykorzystać inny komponent: jak w projekcie UserForm4 klikniesz prawym na toolboxie / Additional Controls, to jest tam komponent Microsoft ListView Control. Wygląda podobnie jak ListBox, tylko trzeba go skonfigurować. Jest o tyle fajny że działa na nim scroll myszy :)

    Jak już umieścisz go na formie, to z właściwości wybierz (Custom) [...]
    - w zakładce General wybierz view = 3-lvwReport, label edit ustaw na Manual (żeby wiersze były tylko do odczytu), zaznacz też Multiselect, FullRowSelect i GridLines (to właśnie siatka).
    - w zakładce Column Headers dodaj, nazwij i ustaw szerokość ew. wyrównanie dla tylu kolumn, ile ma być.

    Niestety trudniej dodaje się do tego dane: ten fragment dodaje jeden wiersz 3-kolumnowy:
    
    Dim listItem As listItem
    
    Set listItem = ListView1.ListItems.Add(, , "aaa1")
    listItem.SubItems(1) = "aaa2"
    listItem.SubItems(2) = "aaa3"
    Set listItem = Nothing
    

    Gdybyś chciał wypełnić całym zakresem, to musisz zrobić to w pętli For, coś w stylu:
    
    Dim listItem As listItem
    
    With Worksheets("BAAN 2")
        ost_wiersz = .Range("G65536").End(xlUp).Row
        For i = 8 To ost_wiersz
            Set listItem = ListView1.ListItems.Add(, , .Range("G" & i))
            listItem.SubItems(1) = .Range("H" & i)
            listItem.SubItems(2) = .Range("I" & i)
            listItem.SubItems(2) = .Range("J" & i)
            listItem.SubItems(2) = .Range("K" & i)
            Set listItem = Nothing
        Next i
    End With
    

    i tak dla każdego ListView.


    Jeżeli chodzi o wydruk, to sprawa jest nieco trudniejsza, bo najpierw musisz przełożyć zaznaczenie z listbox / listview na zakres w arkuszu (zakładam że będzie to jeden ciąg, bez przerw), zanim wydrukujesz arkusz.
    Private Sub CommandButton3_Click()
    
    Dim pocz_idx As Integer
    Dim ost_idx As Integer
    
    pocz_idx = -1
    ost_idx = -1
    
    'ustalenie pierwszego i ostatniego zaznaczonego wiersza
    For Each c In ListView1.ListItems
        If c.Selected Then
            If pocz_idx = -1 Then pocz_idx = c.Index
            ost_idx = c.Index
        End If
    Next c
    
    If (pocz_idx > -1) And (ost_idx > -1) Then
        'wydruk komórek
        With Worksheets("BAAN 2")
            .PageSetup.PrintArea = "G" & pocz_idx + 7 & ":M" & ost_idx + 7
            .PrintOut
        End With
    Else
        MsgBox "Brak danych do wydruku."
    End If
    End Sub

    Wydrukuje na domyślną drukarkę.
    Załączniki:
    • tester.xls (381 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #11 8892006
    MarTeaM
    Poziom 9  
    Posty: 39
    Ocena: 1
    Przepraszam Cię bardzo ale ja nic z tego nie rozumiem :/
    Mam już na każdy Page ListView i jakos mi to nie działa. Zamiast ListBox'ów powpisywałem ListView i mam jakiś błąd. No i nie wiem do czego jest to:
    
    Dim listItem As listItem
    
    With Worksheets("BAAN 2")
        ost_wiersz = .Range("G65536").End(xlUp).Row
        For i = 8 To ost_wiersz
            Set listItem = ListView1.ListItems.Add(, , .Range("G" & i))
            listItem.SubItems(1) = .Range("H" & i)
            listItem.SubItems(2) = .Range("I" & i)
            Set listItem = Nothing
        Next i
    End With
    
    
    
    
    
    
     ' .ListItems(.ListItems.Count - 1).SubItems(1) = rec("RetailCost")
     '.ListItems(.ListItems.Count - 1).SubItems(2) = txtQty.Value
    'ListView1.ListItems = "'BAAN 2'!G8:K97"

    i dlaczego jest w Range G65536 skoro chodzi mi tylko o komórki od wiersza 8 do 97? Widzę że chyba za duży ciężar wziąłem na siebie. Laik ze mnie.
  • #12 8892073
    marcinj12
    Poziom 40  
    Posty: 3404
    Pomógł: 1024
    Ocena: 250
    To może tak:
    - w ListoBoxie którego używasz nie można zastosować siatki,
    - siatkę można zastosować w komponencie ListView, który jest inną kontrolką niż ListBox (ma inne właściwości i inaczej się do niego ładuje dane). Mam nadzieję że wstawiłeś ListView tak jak pisałem w poprzednim poście, a nie tylko zmieniłeś nazwy ListBoxów??
    - ten kod który Ci podałem pokazuje przykład w jaki sposób załadować dane do ListView.,
    - w poprzednim poście drugi kod pokazuje, jak załadować cały zakres z kolumn G - K,
    - masz też przykład w załączniku ode mnie, gdzie dla BAAN 2 wstawiłem dodatkowo komponent ListView (skonfigurowany dla 3 kolumn) żebyś mógł przykład podejrzeć.
    Cytat:
    i dlaczego jest w Range G65536 skoro chodzi mi tylko o komórki od wiersza 8 do 97?

    Jeżeli chodzi tylko o komórki z wiersza 8-97 to możesz wpisać zakres na sztywno, ale z doświadczenia wiem, że zawsze coś się zmienia, dochodzą nowe wiersze, a to rozwiązanie ustala automatycznie ostatni wiersz (dokładnie: wiersz ostatniej niepustej komórki w kolumnie G).
  • #13 8892249
    MarTeaM
    Poziom 9  
    Posty: 39
    Ocena: 1
    
    Private Sub UserForm_Initialize()
    
    ListView1.RowSource = "'BAAN 2'!G8:K97"
    ''ListView2.RowSource = "'BAAN 3'!G8:K97"
    ''ListView3.RowSource = "'BAAN 4'!G8:K97"
    ''ListView4.RowSource = "'BAAN 5'!G8:K97"
    ''ListView5.RowSource = "'BAAN 6'!G8:K97"
    ''ListView6.RowSource = "'BAAN 7'!G8:K97"
    ''ListView7.RowSource = "'BAAN 8'!G8:K97"
    
    Dim listItem As listItem
    
    With Worksheets("BAAN 2")
        ost_wiersz = .Range("G8:K97").End(xlUp).Row
        For i = 8 To ost_wiersz
            Set listItem = ListView1.ListItems.Add(, , .Range("G" & i))
            listItem.SubItems(1) = .Range("H" & i)
            listItem.SubItems(2) = .Range("I" & i)
            listItem.SubItems(3) = .Range("J" & i)
            listItem.SubItems(4) = .Range("K" & i)
            Set listItem = Nothing
        Next i
    End With
    
    
     ' .ListItems(.ListItems.Count - 1).SubItems(1) = rec("RetailCost")
     '.ListItems(.ListItems.Count - 1).SubItems(2) = txtQty.Value
    'ListView1.ListItems = "'BAAN 2'!G8:K97"
    End Sub
    

    zmieniłem ten kod co mi podałeś na taki jak wyżej ale nie ładują się mi żadne dane tylko mam znowu błąd. Narazie chcę żeby zadziałał na jednym Listview dlatego reszta jest w cudzysłowiu ale nawet jeden mi nie trybi.
    Aha... i w zakładce Column Headers jest więcej zaznaczonych opcji niż podałeś to znaczy że to co jest zaznaczone domyślnie to mam nie odznaczać bo zaznaczyłem to co mi podałeś ale nic nie odznaczałem.
  • #14 8892407
    marcinj12
    Poziom 40  
    Posty: 3404
    Pomógł: 1024
    Ocena: 250
    Zakomentuj też
    ListView1.RowSource = "'BAAN 2'!G8:K97"

    PS. Jak robisz na stały zakres wierszy, to wpisz po prostu:
    ost_wiersz = 97

    zamiast
    ost_wiersz = .Range("G8:K97").End(xlUp).Row 
  • #15 8895117
    MarTeaM
    Poziom 9  
    Posty: 39
    Ocena: 1
    OK :D Mam wszystkie ListView ale w Listview nie pokazują mi się żadne informacje z arkuszy.
    
    Private Sub UserForm4()
    
    ListView1.ListItems = "'BAAN 2'!G8:K97" (czy jest różnica jak zamiast ListItems będzie RowSource?)
    
    ListView2.ListItems = "'BAAN 3'!G8:K97"
    
    ListView3.ListItems = "'BAAN 4'!G8:K97"
    
    ListView4.ListItems = "'BAAN 5'!G8:K97"
    
    ListView5.ListItems = "'BAAN 6'!G8:K97"
    
    ListView6.ListItems = "'BAAN 7'!G8:K97"
    
    ListView7.ListItems = "'BAAN 8'!G8:K97"
    
    
    Dim listItem As listItem
    
    With Worksheets("'BAAN 2'")
        ost_wiersz = 97
        For i = 8 To ost_wiersz
            Set listItem = ListView1.ListItems.Add(, , .Range("G" & i))
            listItem.SubItems(1) = .Range("H" & i)
            listItem.SubItems(2) = .Range("I" & i)
            listItem.SubItems(3) = .Range("J" & i)
            listItem.SubItems(4) = .Range("K" & i)
            Set listItem = Nothing
        Next
    With Worksheets("'BAAN 3'")
        ost_wiersz = 97
        For i = 8 To ost_wiersz
        Set listItem = ListView2.ListItems.Add(, , .Range("G" & i))
            listItem.SubItems(1) = .Range("H" & i)
            listItem.SubItems(2) = .Range("I" & i)
            listItem.SubItems(3) = .Range("J" & i)
            listItem.SubItems(4) = .Range("K" & i)
            Set listItem = Nothing
        Next i   (etc)
        
    End With
    
    End Sub
  • Pomocny post
    #16 8895704
    marcinj12
    Poziom 40  
    Posty: 3404
    Pomógł: 1024
    Ocena: 250
    marcinj12 napisał:
    ...ListView, który jest inną kontrolką niż ListBox (ma inne właściwości i inaczej się do niego ładuje dane).

    Ten sposób
    ListView2.ListItems = "'BAAN 3'!G8:K97" 

    ładowania danych NIE JEST poprawny dla ListView, zapomnij o nim. To działa tylko z ListBox'em.

    USUŃ z formy wszystkie ListBoxy które tam miałeś...
    Zamiast nich wstaw i skonfiguruj pod 5 kolumn elementy ListView (zrób porządnie jeden i 6x go skopiuj-wklej na pozostałe arkusze).

    Kiedy już to zrobisz, procedura UserForm_Initialize ma wyglądać tak i tylko tak:
    Private Sub UserForm_Initialize()
    Dim listItem As listItem
    
    With Worksheets("BAAN 2")
        ost_wiersz = 97
        For i = 8 To ost_wiersz
            Set listItem = ListView1.ListItems.Add(, , .Range("G" & i))
            listItem.SubItems(1) = .Range("H" & i)
            listItem.SubItems(2) = .Range("I" & i)
            listItem.SubItems(3) = .Range("J" & i)
            listItem.SubItems(4) = .Range("K" & i)
            Set listItem = Nothing
        Next i
    End With
    
    With Worksheets("BAAN 3")
        ost_wiersz = 97
        For i = 8 To ost_wiersz
            Set listItem = ListView2.ListItems.Add(, , .Range("G" & i))
            listItem.SubItems(1) = .Range("H" & i)
            listItem.SubItems(2) = .Range("I" & i)
            listItem.SubItems(3) = .Range("J" & i)
            listItem.SubItems(4) = .Range("K" & i)
            Set listItem = Nothing
        Next i
    End With
    
    With Worksheets("BAAN 4")
        ost_wiersz = 97
        For i = 8 To ost_wiersz
            Set listItem = ListView3.ListItems.Add(, , .Range("G" & i))
            listItem.SubItems(1) = .Range("H" & i)
            listItem.SubItems(2) = .Range("I" & i)
            listItem.SubItems(3) = .Range("J" & i)
            listItem.SubItems(4) = .Range("K" & i)
            Set listItem = Nothing
        Next i
    End With
    
    With Worksheets("BAAN 5")
        ost_wiersz = 97
        For i = 8 To ost_wiersz
            Set listItem = ListView4.ListItems.Add(, , .Range("G" & i))
            listItem.SubItems(1) = .Range("H" & i)
            listItem.SubItems(2) = .Range("I" & i)
            listItem.SubItems(3) = .Range("J" & i)
            listItem.SubItems(4) = .Range("K" & i)
            Set listItem = Nothing
        Next i
    End With
    
    With Worksheets("BAAN 6")
        ost_wiersz = 97
        For i = 8 To ost_wiersz
            Set listItem = ListView5.ListItems.Add(, , .Range("G" & i))
            listItem.SubItems(1) = .Range("H" & i)
            listItem.SubItems(2) = .Range("I" & i)
            listItem.SubItems(3) = .Range("J" & i)
            listItem.SubItems(4) = .Range("K" & i)
            Set listItem = Nothing
        Next i
    End With
    
    With Worksheets("BAAN 7")
        ost_wiersz = 97
        For i = 8 To ost_wiersz
            Set listItem = ListView6.ListItems.Add(, , .Range("G" & i))
            listItem.SubItems(1) = .Range("H" & i)
            listItem.SubItems(2) = .Range("I" & i)
            listItem.SubItems(3) = .Range("J" & i)
            listItem.SubItems(4) = .Range("K" & i)
            Set listItem = Nothing
        Next i
    End With
    
    With Worksheets("BAAN 8")
        ost_wiersz = 97
        For i = 8 To ost_wiersz
            Set listItem = ListView7.ListItems.Add(, , .Range("G" & i))
            listItem.SubItems(1) = .Range("H" & i)
            listItem.SubItems(2) = .Range("I" & i)
            listItem.SubItems(3) = .Range("J" & i)
            listItem.SubItems(4) = .Range("K" & i)
            Set listItem = Nothing
        Next i
    End With
    
    End Sub

    (można by to uprościć do funkcji przyjmującej parametry: nazwa arkusza oraz kontrolka ListBox, ale nie komplikujmy sprawy...).
  • #17 8895864
    MarTeaM
    Poziom 9  
    Posty: 39
    Ocena: 1
    Super :D Tylko mam mały problem bo jak dodam jeszcze dwie kolumny:
    
    Private Sub UserForm_Initialize()
    Dim listItem As listItem
    
    With Worksheets("BAAN 2")
        ost_wiersz = 97
        For i = 8 To ost_wiersz
            Set listItem = ListView1.ListItems.Add(, , .Range("G" & i))
            listItem.SubItems(1) = .Range("H" & i)
            listItem.SubItems(2) = .Range("I" & i)
            listItem.SubItems(3) = .Range("J" & i)
            listItem.SubItems(4) = .Range("K" & i)
            listItem.SubItems(5) = .Range("L" & i)
            listItem.SubItems(6) = .Range("M" & i)
        Set listItem = Nothing
        Next i
    End With

    w takim układzie wyskakuje mi błąd ale na Show Userform'ie. Dodałem też te dwie kolumny w Custom... ...Column Headers.

Podsumowanie tematu

LABEL_AI_GENERATED
Użytkownik ma problem z inicjalizacją wielu ListBoxów w UserFormie z Multipage w VBA Excel. Każda strona Multipage zawiera jeden ListBox powiązany z odpowiednim arkuszem. Po dodaniu kodu do inicjalizacji wszystkich ListBoxów, występuje błąd. Użytkownicy sugerują, aby upewnić się, że ListBoxy są poprawnie nazwane oraz że MultiPage może mieć tylko jedną aktywną zakładkę. Wskazówki obejmują użycie komponentu ListView zamiast ListBox, aby uzyskać siatkę oraz poprawne ładowanie danych do ListView. Użytkownik z powodzeniem zaimplementował ListView, ale napotkał problemy z dodawaniem dodatkowych kolumn.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA