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ę.