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.
?
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 ?
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).
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.
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!):
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ć:
Dziękuję 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?
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
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.
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).
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.
ł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...).
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.