Hỏi về Listview

Liên hệ QC

thuyyeu99

Trùm Nhiều Chuyện
Tham gia
6/6/08
Bài viết
1,729
Được thích
875
Các anh chị trong GPE cho em hỏi mình có thể load 1 lúc 2 listView trong 1 form được không ?

Cám ơn các anh chị đã quan tâm -=.,,
 
Mình chưa thấy tài liệu nào nói tới giới hạn cả. Mình nhớ không nhầm thì trong ví dụ mình đã gửi bạn cũng đã có 2 listview trên 1 form rồi
 
Upvote 0
From sealand:
Mình chưa thấy tài liệu nào nói tới giới hạn cả. Mình nhớ không nhầm thì trong ví dụ mình đã gửi bạn cũng đã có 2 listview trên 1 form rồi

From ThyYeu99:
Hình như trong ví dụ không có anh ạh (Nếu em nhớ sai có gì anh gởi lại giúp em). ý của em là em muốn một lúc 2 listview thể hiện ở 2 mảng khác nhau
ví dụ em gởi kèm
........ý của em là em muốn một lúc 2 listview thể hiện ở 2 mảng khác nhau
ví dụ em gởi kèm
anh hướng dẫn lại giùm em trên 1 form mà LV load được ở 2 bảng ở sheet1 và sheet 2
Bạn nói rõ hơn chút, nghĩa là load dữ liệu của hai sheet ---> 1 listview, hay là load dữ liệu ở sheet1 ---> listview1 sheet2 ---> listview2 ??

From ThuyYeu99:
dạ laod dữ liệu sheet1 ---> listview1 sheet2 ---> listview2
 

File đính kèm

Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0

File đính kèm

Upvote 0
Nếu vậy thì 10 sheet cho 10 list cũng đâu có sao! bạn xem file đính kèm! Ấn Ctrl+Shift+L để thấy kết quả.

Có thể em nói không rõ ràng nên anh hiểu nhầm ý em Cái anh dùng là LB còn em nói là LV (Còn cấu trúc của file ví dụ thì nó sao các anh để nguyên đừng sữa)
 
Lần chỉnh sửa cuối:
Upvote 0
Có thể em nói không rõ ràng nên anh hiểu nhầm ý em Cái anh dùng là LB còn em nói là LV (Còn cấu trúc của file ví dụ thì nó sao các anh để nguyên đừng sữa)
Ok! Listview có nhiều loại listview, bạn đang sử dụng Listview nào? Hoặc bạn tạo sẵn cái form kèm theo hai cái listview của bạn rồi gửi lên đây xem thử nhé!
 
Upvote 0
dạ đây là ví dụ nhờ anh xem giúp
Bạn chép đoạn code này vào Form:
Lưu ý: Nhớ Set lại thuộc tính View cho các Listview 3-lvwReport
[highlight=vb]
Private Sub UserForm_Activate()
Dim mDetail As ListItem
Me.ListView1.ColumnHeaders.Clear: Me.ListView1.ListItems.Clear
Me.ListView2.ColumnHeaders.Clear: Me.ListView2.ListItems.Clear
'--------------------------------------------------
'Đưa dữ liệu từ sheet1 vào Listview1:
'Gán ColumnHeader cho Listview1:
For i = 1 To 6
Me.ListView1.ColumnHeaders.Add , , Sheet1.Cells(5, i)
Next i
'Import dữ liệu detail vào Listview1:
For i = 1 To Sheet1.[A65536].End(xlUp).Row - 5
Set mDetail = Me.ListView1.ListItems.Add(, , Sheet1.Cells(i + 5, 1))
For j = 1 To 5
mDetail.SubItems(j) = Sheet1.Cells(i + 5, j + 1)
Next j
Next i
'//---------------------------------------------------------------------//
'Đưa dữ liệu từ sheet2 vào Listview2:
'Gán ColumnHeader cho Listview1:
For i = 1 To 4
Me.ListView2.ColumnHeaders.Add , , Sheet2.Cells(6, i)
Next i
'Import dữ liệu detail vào Listview2:
For i = 1 To Sheet2.[A65536].End(xlUp).Row - 6
Set mDetail = Me.ListView2.ListItems.Add(, , Sheet2.Cells(i + 6, 1))
For j = 1 To 3
mDetail.SubItems(j) = Sheet2.Cells(i + 6, j + 1)
Next j
Next i
'=====================================================================
'Format Listviews nếu thấy cần thiết:
With ListView1
.ColumnHeaders(1).Alignment = lvwColumnLeft
.ColumnHeaders(2).Alignment = lvwColumnLeft
.ColumnHeaders(3).Alignment = lvwColumnRight
.ColumnHeaders(4).Alignment = lvwColumnRight
.ColumnHeaders(5).Alignment = lvwColumnRight
.ColumnHeaders(6).Alignment = lvwColumnRight
End With
With ListView2
.ColumnHeaders(1).Alignment = lvwColumnLeft
.ColumnHeaders(2).Alignment = lvwColumnLeft
.ColumnHeaders(3).Alignment = lvwColumnRight
.ColumnHeaders(4).Alignment = lvwColumnRight
End With
End Sub
[/highlight]

Bạn xem thêm fild đính kèm. Ấn Ctrl+Shift+L để xem kết quả.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
cho em hỏi sự kiện UserForm_Activate và UserForm_Initialize là sao ạh
 
Upvote 0
cho em hỏi sự kiện UserForm_Activate và UserForm_Initialize là sao ạh

Initiallize - tiếng Anh có nghĩa là khởi động, chuẩn bị làm việc.
Activate - có nghĩa là kích hoạt.

Theo mình hiểu, sự kiện Form_Activate là sự kiện khi Form đó được chọn, nghĩa là bao gồm cả khi khởi động form lên, hoặc khi ta mở nhiểu form, sau đó thao tác trên form khác, sau đó quay lại form chính này, lúc này form chính sẽ activate.

Sự kiện Form_Initialize là sự kiện khi form được Mở, nếu có chạy code cho sự kiện này thì nó chỉ chạy một lần khi form được mở.

Trong trường hợp này, file của bạn chỉ có 1 form, lúc đó sự kiện activate và Initialize dường như là giống nhau.

Nhưng nếu file có nhiều form và mở cùng lúc (sau khi đã chọn chế độ Show Modal sẽ cho phép chọn nhiều form khác nhau dù nhiều form đó đang mở cùng lúc) sẽ thấy rõ sự khác biệt này.

Bạn cũng có thể vào trang support của Microsoft để hiểu thêm về sự khác biệt giữa các sự kiện:
Form_Load - Form_Initialize - Form_Activate Hoặc Click Here
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn chép đoạn code này vào Form:
Lưu ý: Nhớ Set lại thuộc tính View cho các Listview 3-lvwReport
[highlight=vb]
Private Sub UserForm_Activate()
Dim mDetail As ListItem
Me.ListView1.ColumnHeaders.Clear: Me.ListView1.ListItems.Clear
Me.ListView2.ColumnHeaders.Clear: Me.ListView2.ListItems.Clear
'--------------------------------------------------
'Đưa dữ liệu từ sheet1 vào Listview1:
'Gán ColumnHeader cho Listview1:
For i = 1 To 6
Me.ListView1.ColumnHeaders.Add , , Sheet1.Cells(5, i)
Next i
'Import dữ liệu detail vào Listview1:
For i = 1 To Sheet1.[A65536].End(xlUp).Row - 5
Set mDetail = Me.ListView1.ListItems.Add(, , Sheet1.Cells(i + 5, 1))
For j = 1 To 5
mDetail.SubItems(j) = Sheet1.Cells(i + 5, j + 1)
Next j
Next i
'//---------------------------------------------------------------------//
'Đưa dữ liệu từ sheet2 vào Listview2:
'Gán ColumnHeader cho Listview1:
For i = 1 To 4
Me.ListView2.ColumnHeaders.Add , , Sheet2.Cells(6, i)
Next i
'Import dữ liệu detail vào Listview2:
For i = 1 To Sheet2.[A65536].End(xlUp).Row - 6
Set mDetail = Me.ListView2.ListItems.Add(, , Sheet2.Cells(i + 6, 1))
For j = 1 To 3
mDetail.SubItems(j) = Sheet2.Cells(i + 6, j + 1)
Next j
Next i
'=====================================================================
'Format Listviews nếu thấy cần thiết:
With ListView1
.ColumnHeaders(1).Alignment = lvwColumnLeft
.ColumnHeaders(2).Alignment = lvwColumnLeft
.ColumnHeaders(3).Alignment = lvwColumnRight
.ColumnHeaders(4).Alignment = lvwColumnRight
.ColumnHeaders(5).Alignment = lvwColumnRight
.ColumnHeaders(6).Alignment = lvwColumnRight
End With
With ListView2
.ColumnHeaders(1).Alignment = lvwColumnLeft
.ColumnHeaders(2).Alignment = lvwColumnLeft
.ColumnHeaders(3).Alignment = lvwColumnRight
.ColumnHeaders(4).Alignment = lvwColumnRight
End With
End Sub
[/highlight]

Bạn xem thêm fild đính kèm. Ấn Ctrl+Shift+L để xem kết quả.


Em muốn bỏ ColumnHeaders thì bỏ làm sao anh (em chỉ muốn nó load dữ liệu thôi) mò hoài chẳng ra **~**
 
Upvote 0
Em muốn bỏ ColumnHeaders thì bỏ làm sao anh (em chỉ muốn nó load dữ liệu thôi) mò hoài chẳng ra **~**
Bạn vào Properties của từng Listview và Set thuộc tính Hide ColumnHeader là TRUE là xong thôi. Còn nếu muốn dùng Code thì thêm vào đầu đoạn code bên dưới như sau:
PHP:
Private Sub UserForm_Activate()
Dim mDetail As ListItem
Me.ListView1.ColumnHeaders.Clear: Me.ListView1.ListItems.Clear
Me.ListView2.ColumnHeaders.Clear: Me.ListView2.ListItems.Clear
'Thêm vào hai đoạn này:
Me.ListView1.HideColumnHeaders = True
Me.ListView2.HideColumnHeaders = True
'--------------------------------------------------
............................
............................
............................
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
thí dụ em chỉ muốn lấy đúng 3 cột trong sheet thu 2 của ví dụ em gởi kèm thì làm sao anh.
 
Upvote 0
thí dụ em chỉ muốn lấy đúng 3 cột trong sheet thu 2 của ví dụ em gởi kèm thì làm sao anh.

Thứ nhất, câu này để gán columnheader
PHP:
................................
Me.ListView2.ColumnHeaders.Add , , Sheet2.Cells(6, i)
................................

Thứ hai, câu này để gán SubItem
PHP:
..........................
 mDetail.SubItems(j) = Sheet2.Cells(i + 6, j + 1)
.............................

Thứ ba, cú pháp hàm cells() như sau:
PHP:
[Worksheet].Cells(Row, Column)

Vậy bạn nghiên cứu thử xem phải làm sao?
 
Upvote 0
Em làm theo cách anh hướng dẫn thì đúng với yêu cầu em đặt ra rồi.Thật ra trong bảng dữ liệu em chỉ cần láy mấy cột thôi nhưng mà nó không có nằm liền với nhau, em có dùng .ColumnHeaders(5).Width=0 để ẩn trên LV các cột không cần thiết nhưng thấy nó sao sao đó. (Tự em không biết gì về VB nên không thể hiện được câu hỏi chính xác mong các anh thông cảm)

Cám ơn anh đã nhiệt tình hướng dẫn
 
Upvote 0
Em làm theo cách anh hướng dẫn thì đúng với yêu cầu em đặt ra rồi.Thật ra trong bảng dữ liệu em chỉ cần láy mấy cột thôi nhưng mà nó không có nằm liền với nhau, em có dùng .ColumnHeaders(5).Width=0 để ẩn trên LV các cột không cần thiết nhưng thấy nó sao sao đó. (Tự em không biết gì về VB nên không thể hiện được câu hỏi chính xác mong các anh thông cảm)

Cám ơn anh đã nhiệt tình hướng dẫn

ca_dafi tận dụng sự liên tục của các cột nên dùng For ... Next để rút ngắn code đấy các hạ à!

Trong trường hợp của các hạ, lấy các cột không liên tục và load vào Lisview như thế thì không dùng for ... next được. Xem đoạn code sau nhé! Mượn File ca_dafi bên trên nhé!

Code này sẽ load các cột A,B,C,F của sheet1 vào Listview1 tương ứng với [STT], [TÊN], [DVT], [TIỀN].
[highlight=vb]
Private Sub UserForm_Activate()
Dim mDetail As ListItem
Me.ListView1.ColumnHeaders.Clear: Me.ListView1.ListItems.Clear
Me.ListView2.ColumnHeaders.Clear: Me.ListView2.ListItems.Clear
'--------------------------------------------------
Me.ListView1.HideColumnHeaders = True: Me.ListView2.HideColumnHeaders = True
'Load sheet1 to Listview1:
'Listview1 có 4 cot STT, Tên, DVi, TIEN,
'Gán ColumnHeader tung ung voi 4 cot cua sheet1, cot 1,2,3,6 trong sheet1:
Me.ListView1.ColumnHeaders.Add , , Sheet1.Cells(5, 1)
Me.ListView1.ColumnHeaders.Add , , Sheet1.Cells(5, 2)
Me.ListView1.ColumnHeaders.Add , , Sheet1.Cells(5, 3)
Me.ListView1.ColumnHeaders.Add , , Sheet1.Cells(5, 6) ''<===Chú ý chỗ này nhảy cột nè!
'--------------------------------------------------
For i = 1 To Sheet1.[A65536].End(xlUp).Row - 5
Set mDetail = Me.ListView1.ListItems.Add(, , Sheet1.Cells(i + 5, 1))
With mDetail
.SubItems(1) = Sheet1.Cells(i + 5, 2)
.SubItems(2) = Sheet1.Cells(i + 5, 3)
.SubItems(3) = Sheet1.Cells(i + 5, 6) ''<===Chú ý chỗ này nhảy cột nè!
End With
Next i
'--------------------------------------------------
'Load sheet2 to Listview2:
For i = 1 To 4
Me.ListView2.ColumnHeaders.Add , , Sheet2.Cells(6, i)
Next i
For i = 1 To Sheet2.[A65536].End(xlUp).Row - 6
Set mDetail = Me.ListView2.ListItems.Add(, , Sheet2.Cells(i + 6, 1))
For j = 1 To 3
mDetail.SubItems(j) = Sheet2.Cells(i + 6, j + 1)
Next j
Next i
'=====================================================================
'Format Listviews:
With ListView1
.ColumnHeaders(1).Alignment = lvwColumnLeft
.ColumnHeaders(2).Alignment = lvwColumnLeft
.ColumnHeaders(3).Alignment = lvwColumnRight
.ColumnHeaders(4).Alignment = lvwColumnRight
End With
With ListView2
.ColumnHeaders(1).Alignment = lvwColumnLeft
.ColumnHeaders(2).Alignment = lvwColumnLeft
.ColumnHeaders(3).Alignment = lvwColumnRight
.ColumnHeaders(4).Alignment = lvwColumnRight
End With
End Sub
[/highlight]
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
ca_dafi tận dụng sự liên tục của các cột nên dùng For ... Next để rút ngắn code đấy các hạ à!

Trong trường hợp của các hạ, lấy các cột không liên tục và load vào Lisview như thế thì không dùng for ... next được.

Mình vẫn có thể dùng For ...Next được nhé!

Bạn xem code bên dưới nha!
PHP:
Private Sub UserForm_Activate()
Dim mDetail As ListItem
Me.ListView1.ColumnHeaders.Clear: Me.ListView1.ListItems.Clear
Me.ListView2.ColumnHeaders.Clear: Me.ListView2.ListItems.Clear
'--------------------------------------------------
Me.ListView1.HideColumnHeaders = True
Me.ListView2.HideColumnHeaders = True
'Load sheet1 to Listview1:
'Listview1 có 4 cot STT, Tên, DVi, TIEN,
'Gán ColumnHeader tung ung voi 4 cot cua sheet1, cot 1,2,3,6 trong sheet1:
'Vẫn dùng For ... Next để giải quyết được:
For i = 1 To 4
    Me.ListView1.ColumnHeaders.Add , , Sheet1.Cells(5, IIf(i < 4, i, i + 2))
Next i
'--------------------------------------------------
For i = 1 To Sheet1.[A65536].End(xlUp).Row - 5
    Set mDetail = Me.ListView1.ListItems.Add(, , Sheet1.Cells(i + 5, 1))
'Vẫn dùng For ... Next để giả quyết được:
    For J = 1 To 3
        mDetail.SubItems(J) = Sheet1.Cells(i + 5, IIf(J < 3, J, J + 2))
    Next J
Next i
'--------------------------------------------------
...........................
...........................
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Em làm theo cách anh hướng dẫn thì đúng với yêu cầu em đặt ra rồi.Thật ra trong bảng dữ liệu em chỉ cần láy mấy cột thôi nhưng mà nó không có nằm liền với nhau, em có dùng .ColumnHeaders(5).Width=0 để ẩn trên LV các cột không cần thiết nhưng thấy nó sao sao đó. (Tự em không biết gì về VB nên không thể hiện được câu hỏi chính xác mong các anh thông cảm)

Đây là Sub dùng để đưa một mảng vào Listview.

PHP:
Sub TaoLVGPE(LVAll As ListView, Mang As Range, _
             Optional Cot1 As Long, Optional Cot2 As Long, _
             Optional Cot3 As Long, Optional Cot4 As Long, _
             Optional Cot5 As Long, Optional Cot6 As Long, _
             Optional Cot7 As Long, Optional Cot8 As Long)
' Sub nay dung de dua mot MANG vao mot LISTVIEW'
    On Error Resume Next
    Dim iC As Byte, ir As Integer, SoCot As Long, i As Byte
    SoCot = (Cot1 > 0) * 1 + (Cot2 > 0) * 1 + (Cot3 > 0) * 1 + (Cot4 > 0) * 1 + (Cot5 > 0) * 1 + (Cot6 > 0) * 1 + (Cot7 > 0) * 1 + (Cot8 > 0) * 1
    SoCot = SoCot * (-1)
    iC = Mang.Columns.Count
    If LVAll.ColumnHeaders.Count < SoCot Then Exit Sub
    LVAll.ListItems.Clear
    LVAll.Sorted = False

    For ir = 1 To Mang.Rows.Count    ' Xet tung Hang'
        If Mang(ir, 1) = "" Then GoTo Tiep
        For i = 1 To SoCot                ' Xet tung cot'
            iC = Choose(i, Cot1, Cot2, Cot3, Cot4, Cot5, Cot6, Cot7)
            If i = 1 Then
                LVAll.ListItems.Add.Text = Mang(ir, iC).Text    ' Cot Dau Tien'
            ElseIf i > 1 Then
                   LVAll.ListItems.Item(ir).SubItems(i - 1) = Mang(ir, iC)    ' Hang iR, Cot thu IC'
            End If
            'Stop'
        Next
Tiep:
    Next
    'LVAll.Sorted = True'
    ' Tao Mau cho cac hang'
    '   TaoColorLV LVAll'
End Sub

VD : Đưa vào Cột 2 và cột 4

PHP:
Call TaoLVGPE(Me.H_LVDK, Sheet1.Range("A2:D11"), 2, 4)


-- Chúc vui -
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Anh giải thích giùm em câu này được không Ạh:
Me.ListView1.ColumnHeaders.Add , , Sheet1.Cells(5, IIf(i < 4, i, i + 2))

Ý bạn là giải thích câu này phải không?
PHP:
..............., Sheet1.Cells(5, IIf(i < 4, i, i + 2))
IIf(i < 4, i, i + 2) : Nghĩa là nếu i nhỏ hơn 4 thì lấy i còn không thì lấy i+2
heet1.Cells(5, IIf(i < 4, i, i + 2)) : Nghĩa là: nếu i nhỏ hơn 4 thì lấy ô có địa chỉ là dòng 5 cột i, còn không thì lấy ô có địa chỉ là dòng 5 cột i+2

Chỉ là hàm If bình thường mà!
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom