Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

VBA Excel Multipage - kilka stron i arkuszy

MarTeaM 17 Dec 2010 10:43 5922 16
  • #1
    MarTeaM
    Level 9  
    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.
  • #2
    marcinj12
    Level 40  
    U mnie to działa, upewnij się że dobrze ponazywałeś / odwołujesz się do ListBox'ów. Jaki komunikat o błędzie dostajesz?
  • #3
    MarTeaM
    Level 9  
    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.
  • #4
    marcinj12
    Level 40  
    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 ?
  • #5
    MarTeaM
    Level 9  
    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
    marcinj12
    Level 40  
    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
    MarTeaM
    Level 9  
    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.
  • #8
    marcinj12
    Level 40  
    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
  • #9
    MarTeaM
    Level 9  
    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
    marcinj12
    Level 40  
    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ę.
  • #11
    MarTeaM
    Level 9  
    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
    marcinj12
    Level 40  
    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ć.
    Quote:
    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
    MarTeaM
    Level 9  
    
    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.
  • #15
    MarTeaM
    Level 9  
    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
  • Helpful post
    #16
    marcinj12
    Level 40  
    marcinj12 wrote:
    ...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
    MarTeaM
    Level 9  
    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.