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
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 và sheet2 ---> listview2 ??........ý 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
From ThuyYeu99:
dạ laod dữ liệu sheet1 ---> listview1 và sheet2 ---> listview2
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ả.dạ laod dữ liệu sheet1 ---> listview1 và sheet2 ---> listview2
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ả.
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é!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)
Bạn chép đoạn code này vào Form:dạ đây là ví dụ nhờ anh xem giúp
cho em hỏi sự kiện UserForm_Activate và UserForm_Initialize là sao ạh
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 là 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ả.
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: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![]()
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
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.
................................
Me.ListView2.ColumnHeaders.Add , , Sheet2.Cells(6, i)
................................
..........................
mDetail.SubItems(j) = Sheet2.Cells(i + 6, j + 1)
.............................
[Worksheet].Cells(Row, Column)
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.
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
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)
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
Call TaoLVGPE(Me.H_LVDK, Sheet1.Range("A2:D11"), 2, 4)
Me.ListView1.ColumnHeaders.Add , , Sheet1.Cells(5, IIf(i < 4, i, i + 2))
[/highlight]
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))
..............., Sheet1.Cells(5, IIf(i < 4, i, i + 2))
Nhờ các anh chị hướng dẫn em giải quyết thêm 1 vấn đề này nữa. Cám ơn các anh chị trước
Trong LV của em có những dòng rỗng không có dữ liệu vậy mình có cách nào để khi load LV lên thì nó sẽ ẩn những dòng đó đi hoặc Remove nó không ? (chỉ remove tren LV thôi)
Mấu chốt vấn đề cũng sẽ quy về dữ liệu nguồn mà thôi. Bạn có thể nói rõ, dòng dữ liệu như thế nào là "rỗng" trong phần data của bạn thì chắc sẽ có cách giải quyết!
Như vậy, trong file của bạn, có những dòng thành tiền >0 nhưng không có số lượng, đơn giá, đơn vị tính thì có đưa vào không?Em muốn là số tiền bằng không trong VD (Cột thành tiền) này thì không đưa vào LV. Tức là Cột thành tiền khác 0 thí đưa vào.
Vậy định dạng để không thấy số 0 được không?
C1: Dùng Options: Vào Tools -> Options -> Bỏ Check ở dòng Zero Values.
C2: Dùng Format Cells: Quét chọn vùng Thành Tiền -> Nhấn phải chuột chọn Format Cells -> Chọn Custome -> Trong khung Type: gõ:
#,##0;#,##0;""
Hoặc:
[=0]"";#,##0
Thân.
Như vậy, trong file của bạn, có những dòng thành tiền >0 nhưng không có số lượng, đơn giá, đơn vị tính thì có đưa vào không?
Vậy chỉ cần lồng vào If ... Then ... Else là xong. bạn xem file đính kèm. Ấn Ctrl+Shift+L để xem kết quả!da đưa tất cả vào hết anh miễn sao cột Thành tiền >0 là đưa vào hết
da đưa tất cả vào hết anh miễn sao cột Thành tiền >0 là đưa vào hết
Cái cột C trong file của bạn, tiêu đề của nó là gì vậy! Có cần thiết không? Nếu cần thì phải sửa code lại! Vì code file trước không lấy cột C, vì file trước bạn gửi, cột C không có dữ liệu, không có tiêu đề cột --> mình nghĩ là không cần thiết.Đây là file ví dụ em gởi kèm
Private Sub UserForm_Activate()
Dim mDetail As ListItem
Me.ListView1.ColumnHeaders.Clear: Me.ListView1.ListItems.Clear
''Load sheet1 to Listview1:
''Gán ColumnHeader tương ứng:
For i = 1 To 9
Me.ListView1.ColumnHeaders.Add , , Sheet1.Cells(9, i)
Next i
''--------------------------------------------------
''Gán Detail tương ứng:
For i = 1 To Sheet1.[H65536].End(xlUp).Row - 9
If IsNumeric(Sheet1.Cells(i + 9, "H")) And Sheet1.Cells(i + 9, "H") > 0 Then
Set mDetail = Me.ListView1.ListItems.Add(, , Sheet1.Cells(i + 9, "A"))
For J = 1 To 8
mDetail.SubItems(J) = Sheet1.Cells(i + 9, J + 1)
Next J
End If
Next i
End Sub
From ThuyYeu99:
Cám ơn anh Ca_dafi nhiều đúng yêu cầu em đề ra rồi
Các bạn giúp tôi đoạn code chuyển chức năng "automatic" sang "manual" và ngược lại trong Tool/Option/Caculation. Vì tôi đang thiết lập sheets1 chứa rất nhiều công thức mảng lấy dữ liệu từ sheets2.và vùng đặt trước trong sheets1 rất lớn nên khi nhập dữ liệu chậm.
Tiện thể hướng dẫn giúp tôi thiết lập name động (offset...).
Chân thành cảm ơn.
Bạn mở file mới, tạo form, thêm Listview sau đo mở Properties chọn mục Custom. Vào đó tất cả chi phối thuộc tính riêng của nó.Quậy tít mù lên xem sao?Xin hỏi ListView có thuộc tính nào giống như thuộc tính ColumnsWidth và ColumnsCount của Listbox, nhờ đó ta có thể ấn định bề rộng cũng như số lượng cột của ListView ngay trong quá trình thiết kế.
Trân trọng.
Trong vba chỉ có ControlTipTextCám ơn các bạn đã giúp đỡ mình.
Xin cho mình hỏi thêm: trong listview mình thấy có ControlTipText và ToolTipText. Hai cái này khác nhau thế nào?
.
Chỉ có cách làm dùng Api.Có cách nào để khi người dùng di chuyển chuột trên mỗi đầu cột thì TipText sẽ thay đổi nội dung một cách tương ứng.
Trân trọng.