Hỏi về hidecolumnheads trong listview (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

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ị cho em hỏi có cách nào gõ tiếng việt trong mục hidecolumnheads trong listview không.

cám ơn các anh chị quan tâm
 
HideColumnHeader chỉ có False và true làm gì có tiếng việt. Nếu không nhầm thì bạn muốn chỉnh tiếng Việt trong column Header. Vao Properties chọn Customs rồi gõ Tếng Việt
 
Upvote 0
Vậy trong ListBox gõ tên mặc định cho Header được không ? (tự vì mình có rất nhiều mãng mà mỗi mãng tiêu đề khác nhau)
 
Lần chỉnh sửa cuối:
Upvote 0
thuyyeu99
trong thẻ font bạn chon font có hổ trợ tiếng Việt là được. Nhưng columnhead là nét ưu việt của Listview sau lại hide nó đi? Trong Listbox thì dòng tiêu đề cột là columnhead. Vậy bạn muốn nó hiển thị ra sao thì gõ cụ thể vào dòng ngày. Trong Listview thì bạn có thể thay đổi tiêu đề tùy ý.
 
Lần chỉnh sửa cuối:
Upvote 0
thuyyeu99
trong thẻ font bạn chon font có hổ trợ tiếng Việt là được. Nhưng columnhead là nét ưu việt của Listview sau lại hide nó đi? Trong Listbox thì dòng tiêu đề cột là columnhead. Vậy bạn muốn nó hiển thị ra sao thì gõ cụ thể vào dòng ngày. Trong Listview thì bạn có thể thay đổi tiêu đề tùy ý.


Em có làm thử Listview nhưng nó không hiển thị được fónt chữ Unicode chỉ hiện thị được phong chư ABC thôi. có cách nào cho nó hiện được fónt unicode không (em đã chỉnh fonts time new roman trong Listview nhưng nó không hiển thị được)
 
Upvote 0
Trên VBA đâu có hỗ trợ font Unicode. Nếu dùng Font Unicode thì không riêng tiêu đề mà cả trong List cũng không hiển thị được. Nếu dữ liệu là font Unicode thì sủ dụng hàm để chuyển về font tiếng Việt khác có hỗ trợ trên Listview.
 
Lần chỉnh sửa cuối:
Upvote 0
Trên VBA đâu có hỗ trợ font Unicode. Nếu dùng Font Unicode thì không riêng tiêu đề mà cả trong List cũng không hiển thị được. Nếu dữ liệu là font Unicode thì sủ dụng hàm để chuyển về font tiếng Việt khác có hỗ trợ trên Listview.

ý của anh là mình phải chuyển dữ liệu góc trên Ễccll thành font ABC đúng không hay có cách nào dữ liệu trên excell vẫn là UNI nhưng có cách nào khi load vào LV minh convert nó qua ABC không
 
Upvote 0
ý của anh là mình phải chuyển dữ liệu góc trên Ễccll thành font ABC đúng không hay có cách nào dữ liệu trên excell vẫn là UNI nhưng có cách nào khi load vào LV minh convert nó qua ABC không
Không phải vậy, trên Excel thì cứ tôn trọng để nguyên vậy, chỉ đổi khi nạp vào listview thôi như phương án 2 của bạn. Bạn gủi File ví dụ lên mình làm để bạn xem chứ viết bằng lời thế này khó quá và gửi cho cái hàm convert font mình sưu tầm trên diễn đàn khá ngắn gọn

Hàm chuyển font UNI sang TCVN3 như sau:

Mã:
Const CodUni = "225  224  7843 227  7841 259  7855 7857 7859 7861 7863 226  7845 7847 7849 7851 7853 233  232  7867 7869 7865 234  7871 7873 7875 7877 7879 237  236  7881 297  7883 243  242  7887 245  7885 244  7889 7891 7893 7895 7897 417  7899 7901 7903 7905 7907 250  249  7911 361  7909 432  7913 7915 7917 7919 7921 253  7923 7927 7929 7925 273  193  193  192  192  7842 7842 195  195  7840 7840 258  258  7854 7854 7856 7856 7858 7858 7860 7860 7862 7862 194  194  7844 7844 7846 7846 7848 7848 7850 7850 7852 7852 201  201  200  200  7866 7866 7868 7868 7864 7864 202  202  7870 7870 7872 7872 7874 7874 7876 7876 7878 7878 205  204  7880 296  7882 211  211  210  210  7886 7886 213  213  7884 7884 212  212  7888 7888 7890 7890 7892 7892 7894 7894 7896 7896 416  7898 7898 7900 7900 7902 7902 7904 7904 7906 7906 218  218  217  217  7910 7910 360  360  7908 7908 431  7912 7912 7914 7914 7916 7916 7918 7918 7920 7920 221  221  7922 7922 7926 7926 7928 7928 7924 272  "
Const StrVn3 = "¸µ¶·¹¨¾»¼½Æ©ÊÇÈÉËÐÌÎÏѪÕÒÓÔÖÝרÜÞãßáâä«èåæçé¬íêëìîóïñòô­øõö÷ùýúûüþ®¸¸µµ¶¶··¹¹¡¡¾¾»»¼¼½½ÆÆ¢¢ÊÊÇÇÈÈÉÉËËÐÐÌÌÎÎÏÏÑÑ££ÕÕÒÒÓÓÔÔÖÖÝרÜÞããßßááââä䤤èèååææççéé¥ííêêëëììîîóóïïññòòôô¦øøõõöö÷÷ùùýýúúûûüüþ§"
Option Explicit
Function UniVn3(text As String) As String
For i = 1 To Len(text)
  kytu = Mid(text, i, 1)
  codkytu = AscW(kytu) & String(5 - Len(CStr(AscW(kytu))), " ")
  vitri = (InStr(1, CodUni, codkytu, 0) + 4) / 5
  If vitri >= 1 Then
    newtext = newtext & Mid(StrVn3, vitri, 1)
  Else
    newtext = newtext & kytu
  End If
Next
UniVn3 = newtext
End Function
 
Lần chỉnh sửa cuối:
Upvote 0
em mới tập làm LV nên nhờ anh sealand chỉ em cách đưa dữ liệu từ LV vào TextB khi minh nhấn dupbo click và nhấn nút gán thì nó sẽ chép dữ liệu vào trong Texb. có gì anh cứ thêm đoạn code cách 2 như anh nói giùm em

cám ơn anh
 

File đính kèm

Upvote 0
Không phải vậy, trên Excel thì cứ tôn trọng để nguyên vậy, chỉ đổi khi nạp vào listview thôi như phương án 2 của bạn. Bạn gủi File ví dụ lên mình làm để bạn xem chứ viết bằng lời thế này khó quá và gửi cho cái hàm convert font mình sưu tầm trên diễn đàn khá ngắn gọn

Hàm chuyển font UNI sang TCVN3 như sau:

Mã:
Const CodUni = "225  224  7843 227  7841 259  7855 7857 7859 7861 7863 226  7845 7847 7849 7851 7853 233  232  7867 7869 7865 234  7871 7873 7875 7877 7879 237  236  7881 297  7883 243  242  7887 245  7885 244  7889 7891 7893 7895 7897 417  7899 7901 7903 7905 7907 250  249  7911 361  7909 432  7913 7915 7917 7919 7921 253  7923 7927 7929 7925 273  193  193  192  192  7842 7842 195  195  7840 7840 258  258  7854 7854 7856 7856 7858 7858 7860 7860 7862 7862 194  194  7844 7844 7846 7846 7848 7848 7850 7850 7852 7852 201  201  200  200  7866 7866 7868 7868 7864 7864 202  202  7870 7870 7872 7872 7874 7874 7876 7876 7878 7878 205  204  7880 296  7882 211  211  210  210  7886 7886 213  213  7884 7884 212  212  7888 7888 7890 7890 7892 7892 7894 7894 7896 7896 416  7898 7898 7900 7900 7902 7902 7904 7904 7906 7906 218  218  217  217  7910 7910 360  360  7908 7908 431  7912 7912 7914 7914 7916 7916 7918 7918 7920 7920 221  221  7922 7922 7926 7926 7928 7928 7924 272  "
Const StrVn3 = "¸µ¶·¹¨¾»¼½Æ©ÊÇÈÉËÐÌÎÏѪÕÒÓÔÖÝרÜÞãßáâä«èåæçé¬íêëìîóïñòô­øõö÷ùýúûüþ®¸¸µµ¶¶··¹¹¡¡¾¾»»¼¼½½ÆÆ¢¢ÊÊÇÇÈÈÉÉËËÐÐÌÌÎÎÏÏÑÑ££ÕÕÒÒÓÓÔÔÖÖÝרÜÞããßßááââä䤤èèååææççéé¥ííêêëëììîîóóïïññòòôô¦øøõõöö÷÷ùùýýúúûûüüþ§"
Option Explicit
Function UniVn3(text As String) As String
For i = 1 To Len(text)
  kytu = Mid(text, i, 1)
  codkytu = AscW(kytu) & String(5 - Len(CStr(AscW(kytu))), " ")
  vitri = (InStr(1, CodUni, codkytu, 0) + 4) / 5
  If vitri >= 1 Then
    newtext = newtext & Mid(StrVn3, vitri, 1)
  Else
    newtext = newtext & kytu
  End If
Next
UniVn3 = newtext
End Function


anh làm thẳng vào ví dụ giùm em được không -+*/ chứ em không biết áp dụng làm sao !$@!!
 
Upvote 0
Cám ơn anh Sealand đúng yêu cầu của em rồi
 
Upvote 0
Bạn sửa lại hàm TableToArray để khi là số sẽ hiển thị canh phải và có phân nhóm ngàn, triệu :

Mã:
Function TableToArray(ByVal TableName As String)
   Dim arr
   Dim vRange As Range
   Dim i As Long, j As Long, m As Long, n As Long
   If Not RangeNameExists(TableName) Then Exit Function  'Neu khong ton tai thi thoat
   On Error Resume Next
   Set vRange = Range(TableName)
   i = vRange.Rows.Count
   j = vRange.Columns.Count
   ReDim arr(1 To i, 1 To j)
   For m = 1 To i
      For n = 1 To j
      If IsNumeric(vRange(m, n).Value) Then
         arr(m, n) = Format(vRange(m, n).Value, "#,##0")
      Else
         arr(m, n) = UniVn3(vRange(m, n).Value)
         End If
      Next n
   Next m
   TableToArray = arr
   Set vRange = Nothing
End Function
P/s: Mình load nhầm file, đã load mới rồi
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
ah tự đoạn code chuyen font cua em sai em thấy rồi
 
Upvote 0
Ah em còn 1 vấn đề này nữa có cách nào cho Text Box hiển thị UNI mà không chỉnh trong Propety không và em muốn chọn mã hàng thì chọn theo tên chỗ này mình sửa làm sao anh
 
Lần chỉnh sửa cuối:
Upvote 0
Ah em còn 1 vấn đề này nữa có cách nào cho TB hiển thị UNI mà không chỉnh trong Propety không anh

Phải chỉnh trong Properties chỉ có điều chỉnh khi nào mà thôi, khi nạp thì phải nạp kèm theo hàm chuyển Font (Trong ví dụ không kèm hàm vì ta lấy từ LV mà LV đẫ chuyển rồi).Có 2 cách chỉnh:
1/Khi thiết kế: Chắc bạn rõ rồi
2/Khi hoạt động (run time):
Dùng câu lệnh: Me.TextBox1.Font = "MS sans serip"

Khi chọn muốn lấy tên chứ không phải mã thì gán như sau:

xxxxxxx = LVDataSelector.SelectedItem.SubItems(1)

(Hình như mình hiểu có 1 ý nữa là khi nhập ký tự tìm thì nó tìm ở cột tên có đúng không)Nếu đúng vậy bạn sửa đoạn code dưới như sau sẽ tìm trong tên mặt hàng có cumj như text box ví dụ có số 14

Mã:
Private Sub TextCode_Change()
Dim it As ListItem
   btim = Me.TextCode.text
For i = 1 To Me.LVDataSelector.ListItems.Count
Set it = Me.LVDataSelector.ListItems.Item(i)
If InStr(1, it.SubItems(1), btim, 0) Then Exit For
Next
   bindex = i
   Me.LVDataSelector.ListItems.Item(bindex).Selected = True
   Me.LVDataSelector.ListItems.Item(bindex).EnsureVisible
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
2/Khi hoạt động (run time):
Dùng câu lệnh: Me.TextBox1.Font = "MS sans serip"

cái này thì dung ý em rồi nhưng có 1 điều nữa là khi mình chép dữ liệu vào Excel thì nó không hiểu

(Hình như mình hiểu có 1 ý nữa là khi nhập ký tự tìm thì nó tìm ở cột tên có đúng không) da dung rồi
 
Upvote 0
Chào anh SEALAND
Sẵn anh đang online, em hỏi anh luôn File bữa trước em gửi Bằng EX07.
- Muốn ListWiew lọc từ cột thứ 2, 3 thì làm thế nào. Em dung finditem không được.
- Dùng ListView để hiện dữ liệu đã nhập vào sheets (VD: theo số 005, 006, 007..) giờ em dùng SPinBotton quay lại số 005 chỉnh sửa rồi gán lại vào sheets đúng vị trí số đó Có chèn thêm dữ liệu. Thì dùng Mảng hay dùng cách thủ công nhanh hơn. Cách thủ công em làm gần được thấy thủ công quá (lặp liên tục) nên dừng lại tìm cách tối ưu. File em gửi mail qua ĐC cũ của anh rồi, E không up được lên diễn đàn.
- Anh xem dùm em mấy sự kiện đã hợp lý chưa mà sao thấy code dài quá
Cám ơn anh
 
Upvote 0
Bạn chép thêm hàm chuyển từ TCVN3 thành Unicode vào dưới hàm dổi đẫ có

Mã:
Function doi_font(text As String) As String
Dim i, kytu, vitri, newtext
For i = 1 To Len(text)
  kytu = Mid(text, i, 1)
  vitri = InStr(1, StrVn3, kytu, 0)
  If vitri > 0 Then
    newtext = newtext & ChrW(Mid(CodUni, vitri * 5 - 4, 5))
  Else
    newtext = newtext & kytu
  End If
Next
doi_font = newtext
End Function
 
Upvote 0
Chào anh SEALAND
Sẵn anh đang online, em hỏi anh luôn File bữa trước em gửi Bằng EX07.
- Muốn ListWiew lọc từ cột thứ 2, 3 thì làm thế nào. Em dung finditem không được.
- Dùng ListView để hiện dữ liệu đã nhập vào sheets (VD: theo số 005, 006, 007..) giờ em dùng SPinBotton quay lại số 005 chỉnh sửa rồi gán lại vào sheets đúng vị trí số đó Có chèn thêm dữ liệu. Thì dùng Mảng hay dùng cách thủ công nhanh hơn. Cách thủ công em làm gần được thấy thủ công quá (lặp liên tục) nên dừng lại tìm cách tối ưu. File em gửi mail qua ĐC cũ của anh rồi, E không up được lên diễn đàn.
- Anh xem dùm em mấy sự kiện đã hợp lý chưa mà sao thấy code dài quá
Cám ơn anh
Mình đã coi lại bài của bạn nhưng chưa được kỹ nên chưa có ý kiến cụ thể được. nhưng để hiển thị dữ liệu lọc thì ta phải thay đổi biện pháp nạp dữ liệu.Mình sẽ gửi đường dẫn tham khảo cách lọc và nạp ở đây
 
Lần chỉnh sửa cuối:
Upvote 0
Cho em hỏi thêm 1 vấn đề này nữa làm cách nào mình xác định được ô trên LV ứng với ô trong mảng của mình (dùng để sửa dữ liệu từ LV)
 
Lần chỉnh sửa cuối:
Upvote 0
Cho em hỏi thêm 1 vấn đề này nữa làm cách nào mình xác định được ô trên LV ứng với ô trong mảng của mình (dùng để sửa dữ liệu từ LV)

Thông thường, một cơ sở dữ liệu chuẩn sẽ có các Primery key, index, v.v... Nếu Bảng dữ liệu (trong excel là sheet) của bạn quy định cột nào là key field thì ta có thể căn cứ vào giá trị tại cột đó để tìm kiếm (Có thể dùng phương thức Find hoặc For...Next để tìm) và xác định địa chỉ (dòng) của dữ liệu đó.
 
Upvote 0
Bài của anh Kiệt là bài lý thuyết chuẩn trong việc tìm kiếm này, bạn đọc và hiểu kỹ thì rất thuận lợi cho việc giao tiếp, liên kết dữ liệu giữa Form, Code và sheet và tư duy tổ chức dữ liệu. Mình thêm 1 cách thực hành ngoài cách anh Kiệt đã giới thiệu là dùng hàm Match() cũng rất nhanh.Trên Form mình đã ví dụ dòng thứ mấy trong ds và địa chỉ là ô nào trên sheet1 liên quan đến dòng hiện hành trên form.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Thông thường, một cơ sở dữ liệu chuẩn sẽ có các Primery key, index, v.v... Nếu Bảng dữ liệu (trong excel là sheet) của bạn quy định cột nào là key field thì ta có thể căn cứ vào giá trị tại cột đó để tìm kiếm (Có thể dùng phương thức Find hoặc For...Next để tìm) và xác định địa chỉ (dòng) của dữ liệu đó.
Chào anh
Anh có thể đưa VD về tìm kiếm trong LISTVIEW dùng phương thức find hay for....next được không. Em nhớ là hình như chỉ tìm được ở cột đầu tiên thì phải. Muốn tìm ở cột khác thì phải dùng LISTVIEW tạm. KHông biết đã là tối ưu nhất chưa.
 
Upvote 0
To kieuvietphuong:
Bạn hiểu sai rồi, Ca_dafi nói là lấy giá trị của List làm tiêu chuẩn tìm kiếm và sẽ tìm trên sheet. Còn tìm bằng phương pháp nào hay tìm ở cột nào là do người viết code quyết định chứ.
Còn tìm trên list hoàn toàn có thể ở bất kỳ cột nào, không cần list tạm.
Nếu không nhầm thì bạn liên tưởng tới bài của anh Duyệt về vấn đề lọc. Nhưng mình cho rằng dùng list tạm trong lọc là không hợp lý vì nó liên quan tới các đối tương khác. Mình nghĩ nên sử dụng 1 trong 3 cách sau là hợp lý hơn:
-Thượng sách: Thay đổi cách nạp rồi nạp theo ĐKlọc. Mỗi khi thay đổi xoá đi và nạp lại.
-Trung sách: Khai báo 1 biến mảng Public rồi lưu giá trị List ra mảng khi cần nạp từ mảng vào LIST
-Hạ sách:Chép dữ liệu trên List ra 1 sheet tạm rồi lọc
 
Upvote 0
Chào anh
Anh có thể đưa VD về tìm kiếm trong LISTVIEW dùng phương thức find hay for....next được không. Em nhớ là hình như chỉ tìm được ở cột đầu tiên thì phải. Muốn tìm ở cột khác thì phải dùng LISTVIEW tạm. KHông biết đã là tối ưu nhất chưa.

Bạn có thể tham khảo hai link sau để áp dụng cho vấn đề của bạn! Chúc bạn thành công!
http://www.giaiphapexcel.com/forum/showpost.php?p=67185&postcount=2
http://www.giaiphapexcel.com/forum/showthread.php?p=114512
 
Upvote 0
*******************************
Sub napdl()
'Tam khai bien tra phuc vu loc sau nay
Dim ktra As Boolean
Dim muc As ListItem
ktra = True
If Me.ListView1.ListItems.Count > 0 Then Me.ListView1.ListItems.Clear
For i = 2 To Application.WorksheetFunction.CountA(Sheet1.[a2:a2000]) + 1
If ktra Then
Set muc = Me.ListView1.ListItems.Add(, , Sheet1.Cells(i, 1))
With muc
.SubItems(1) = Sheet1.Cells(i, 2)
.SubItems(2) = Sheet1.Cells(i, 3)
.SubItems(3) = Sheet1.Cells(i, 4)
.SubItems(4) = Sheet1.Cells(i, 5)
End With
End If
Next
End Sub
***********************************
các anh cho em hỏi cái này mình áp dụng để gáng cho mãng được không (Em muốn mở form "tênform.show" lên là LV tự chạy)
 
Upvote 0
*******************************
[highlight=vb]Sub napdl()
'Tam khai bien tra phuc vu loc sau nay
Dim ktra As Boolean
Dim muc As ListItem
ktra = True
If Me.ListView1.ListItems.Count > 0 Then Me.ListView1.ListItems.Clear
For i = 2 To Application.WorksheetFunction.CountA(Sheet1.[a2:a2000]) + 1
If ktra Then
Set muc = Me.ListView1.ListItems.Add(, , Sheet1.Cells(i, 1))
With muc
.SubItems(1) = Sheet1.Cells(i, 2)
.SubItems(2) = Sheet1.Cells(i, 3)
.SubItems(3) = Sheet1.Cells(i, 4)
.SubItems(4) = Sheet1.Cells(i, 5)
End With
End If
Next
End Sub
[/highlight]
***********************************
các anh cho em hỏi cái này mình áp dụng để gáng cho mãng được không (Em muốn mở form "tênform.show" lên là LV tự chạy)
Code trên của bạn có thể rút gọn lại rất nhiều và chạy nhanh hơn nếu dùng mảng (bằng cách đặt Name). Bạn gửi file lên để mọi người hỗ trợ cụ thể nhé!
 
Upvote 0
ĐÂY là file của anh sealand em tìm được trong GPE. em muốn thêm mãng A "đoạn tô màu vàng"(khi mở form lên nó sẽ cập nhật cả hai LV) trong file vao LV2 thi làm cách nào ?


sẵn tiện các anh cho em hỏi đoạn code này sửa làm sao

**********************
Private Sub LVDataSelector_ItemClick(ByVal Item As MSComctlLib.ListItem)
Call tim
End Sub
****************************************
Sub tim()
Dim ma, dong
ma = LVDataSelector.SelectedItem.text
dong = Application.WorksheetFunction.Match(ma, S01.[a2:a10000], 0) ' nó báo lỗi
Me.TextBox6 = dong
Me.TextBox7 = S01.Cells(dong + 1, 1).Address

End Sub
*****************************************
Khi em chọn vào LV trúng o rỗng thì nó báo lỗi em không biết cách sửa (em muốn khi chọn trúng o rỗng trong LV thì nó sẽ hiện thông báo "đây là o rong" và nó vẫn cho chọn trong LV)


Cám ơn các anh
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
1/Tạo mảng nạp DL nhanh, gọn nhưng không thay đổi được, bạn không thêm bớt xóa sửa, lọc được mà phải gắn với nó. Tùy thực tế mà áp dụng. (Mình không thấy mảng màu vàng đâu cả)
2/Thực ra mình chỉ nêu ví dụ về cách tìm. Thực tế phải chặn lỗi chứ:
VD: Đếm số dòng dữ liệu để khai S01.[a1:annn] cho phù hợp
VD:Khi nạp mã =empty thì bỏ qua
VD: Sửa câu lệnh lỗi

Mã:
**********************
Private Sub LVDataSelector_ItemClick(ByVal Item As MSComctlLib.ListItem)
Call tim
End Sub
****************************************
Sub tim()
Dim ma, dong
ma = LVDataSelector.SelectedItem.text
if trim(ma)<>"" then
[COLOR=Red]dong = Application.WorksheetFunction.Match(ma, S01.[a2:a10000], 0)[/COLOR]
Me.TextBox6 = dong
Me.TextBox7 = S01.Cells(dong + 1, 1).Address
else
Me.TextBox6 = ""
 Me.TextBox7 =""
end if
End Sub
*****************************************
 
Lần chỉnh sửa cuối:
Upvote 0
Sub napdl()
'Tam khai bien tra phuc vu loc sau nay
Dim ktra As Boolean
Dim muc As ListItem
ktra = True
If Me.ListView1.ListItems.Count > 0 Then Me.ListView1.ListItems.Clear
For i = 2 To Application.WorksheetFunction.CountA(Sheet1.[a2:a2000]) + 1
If ktra Then
Set muc = Me.ListView1.ListItems.Add(, , Sheet1.Cells(i, 1))
With muc
.SubItems(1) = Sheet1.Cells(i, 2)
.SubItems(2) = Sheet1.Cells(i, 3)
.SubItems(3) = Sheet1.Cells(i, 4)
.SubItems(4) = Sheet1.Cells(i, 5)
End With
End If
Next
End Sub

đây là đoạn code anh dùng để tạo LV anh có thể chỉ em cách nạp vô LV bàng Mãng được không đây là Ví dụ



 
Upvote 0
Nạp bằng mảng cũng vậy thôi, thay thay sheet1.cells bằng tên mảng là được. Mục đích dùng mảng chỉ để thay đổi nguồn còn nó rắc rối thêm mà thôi.
 
Upvote 0
Em dùng DataSelector để mở form có 2 LV nhưng nó mở tới 2 form ( là LVDataSelector xong rồi nhấn nút thoát nó mới hiện LVDataSelector1 ). em tính gán bằng mãng để nó tự nạp mỗi khi load form vì file em làm sai mang nhieu lắm.

Private Sub xoa_Click()

Dim ma, dong, ma1, dong1
ma = LVDataSelector.SelectedItem.text
ma1 = doi_font(LVDataSelector.SelectedItem.SubItems(1)) ' doi thanh font unicode
If Trim(ma) <> "" Then
dong = Application.WorksheetFunction.Match(ma, S01.[a2:a6536], 0)
dong1 = Application.WorksheetFunction.Match(ma1, S01.[b2:b6536], 0)
'Me.TextBox6 = dong
'Me.TextBox7 = S01.Cells(dong + 1, 1).Address
'Me.LVDataSelector.ListItems.Item(bindex).Selected = True
'Me.LVDataSelector.ListItems.Item(bindex).EnsureVisible
'Set RRng = Range("La1")
TextBox1 = ""
TextBox2 = ""
TextBox3 = ""
TextBox4 = ""
TextBox5 = ""
If dong = dong1 Then
S01.Cells(dong + 1, 1).Value = TextBox1.Value
S01.Cells(dong + 1, 2).Value = TextBox2.Value
S01.Cells(dong + 1, 3).Value = TextBox3.Value
S01.Cells(dong + 1, 4).Value = TextBox4.Value
S01.Cells(dong + 1, 5).Value = TextBox5.Value
Else
If dong > dong1 Then
'r1 = LVDataSelector.SelectedItem.Item(bindex).Selected + 1
S01.Cells(dong + 1, 1).Value = TextBox1.Value
S01.Cells(dong + 1, 2).Value = TextBox2.Value
S01.Cells(dong + 1, 3).Value = TextBox3.Value
S01.Cells(dong + 1, 4).Value = TextBox4.Value
S01.Cells(dong + 1, 5).Value = TextBox5.Value
Else
If dong1 > dong Then
'r1 = LVDataSelector.SelectedItem.Item(bindex).Selected + 1
S01.Cells(dong1 + 1, 1).Value = TextBox1.Value
S01.Cells(dong1 + 1, 2).Value = TextBox2.Value
S01.Cells(dong1 + 1, 3).Value = TextBox3.Value
S01.Cells(dong1 + 1, 4).Value = TextBox4.Value
S01.Cells(dong1 + 1, 5).Value = TextBox5.Value
End If
End If
End If
Else
MsgBox ("dddddddd")
End If
Me.LVDataSelector.ListItems.Clear
Call NhapDuLieu
End Sub

cái này anh có thể rut gon được không (em tìm theo 2 điều kiện ở hai ô ) tự em chẳng biết tí gì về VB toàn là mò và hỏi không
 
Lần chỉnh sửa cuối:
Upvote 0
Lỗi load LVDatầSelector1 là do chép sửa sót Bạn tìm bằng lệnh Find LVDataSelector1sửa lại là xong. Mình bận chút hẹn sau nhé
 
Upvote 0
Cái sub xoa của bạn không được rồi:
-Trước hết phải rõ ý đồ xóa dòng nào, dòng hiện thời hay dòng đánh dấu.
-Xóa như thế nào: Xóa trên list hay cả trên sheet.
Sau đó mới viết lệnh xóa tương ứng.
 
Upvote 0
Cái sub xoa của bạn không được rồi:
-Trước hết phải rõ ý đồ xóa dòng nào, dòng hiện thời hay dòng đánh dấu.
-Xóa như thế nào: Xóa trên list hay cả trên sheet.
Sau đó mới viết lệnh xóa tương ứng.

Nhờ anh hướng dẫn em xóa dòng được đánh dấu (dòng chọn trên LV và xóa dòng có dữ liệu tương ứng trên sheet ) "chỉ xóa dữ liệu thôi"

cám ơn anh
 
Upvote 0
Xóa dữ liệu trên sheet tại dòng có mã =maxoa như thế nào chắc bạn làm được:
-Tìm dòng có mã=maxoa
-Xóa dòng đó đi.
Mình chỉ ví dụ xóa 1 dòng trên Listview thôi (Bạn có thể thêm checkbox vào List để có thể chọn và xóa nhiều dòng)

P/s: Không đủ thấy áy náy, xóa trên sheet1 bạn thêm vào lệnh xóa trên:

dong = Application.WorksheetFunction.Match(maxoa, Sheet1.[a1:a5000], 0)
Sheet1.Cells(dong, 1).EntireRow.Delete
(Dòng 5000 là mình tạm vậy cho nhanh còn trong chương trình nên tìm dòng cuối cùng có dữ liệu)
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Xóa dữ liệu trên sheet tại dòng có mã =maxoa như thế nào chắc bạn làm được:

Cám ơn anh cái này em sẽ có gắng chư chưa chằc lảm được+-+-+-+. anh cho em hỏi thêm vấn đề nữa là em muốn những dòng nào mà xóa rồi tức là trên LV không có dữ liệu, em muốn những dòng đó sẽ ẩn đi hoặc nó sẽ mờ đi không cho chọn được không.

có cách nào làm ẩn list bos trên form không (tức là không cho hiện lên form nhưng mình vẫn lấy được dữ liệu trong đó)

file của em chỉ xóa được dữ liệu thôi không được xóa hàng vì nếu mà xóa hàng thì dữ liệu của em nó chạy lung tung hết
 
Upvote 0
Thủy Yêu coi cái này (có 2 LV) để ứng dụng cho bài của mình (lấy ý tưởng)
Chúc vui
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Thực tế mình cũng chưa bao giờ tìm hiểu đến việc unable từng item của Listview nên không biết có làm được không? Còn cho hiện hay không cả Listview thì được , nó tùy thuộc vào thuộc tính Visiable của đối tượng đó.
Nhưng việc dùng 1 cái listview chỉ để lưu trữ dũ liệu thì không nên vì nó làm chậm tiến trình load form và tốn nhiều tài nguyên không cần thiết. Có nhiều cách lưu tạm như lưu vào sheet tạm nào đó hoặc biến mảng.
 
Upvote 0
Public Function ListViewFindItem(sFindItem As String, lvFind As ListView, [eValueType As elvSearch], [lSearchFor As Long = 1], [lIndexBeginFrom As Long = 1]) As ListItem

'Purpose : Finds and selects and item in a listview'Inputs : sFileName The path and file name of the component to register.
' lvFind The listview to search for the item in.
' [eValueType] The type of values to search:
' 1 = Searches the text items.
' 2 = Searches sub items.
' 4 = Searches the item tags.
' [lSearchFor] The type of matching required:
' lvwWhole = Find whole word.
' lvwPartial = Find a partial match.
' [lIndexBeginFrom] The item index to begin the search from.
Có ai biết Cho Mình hỏi code để dùng hàm trên để tìm trên listView từ cột thứ 2 như thế nào?
 
Upvote 0
Bạn hỏi về hàm tìm kiếm UDF mà chỉ đúng có 1 dòng tên hàm thì ai mà biết cái hàm ấy ra làm sao mà có ý kiến. Một vấn đề nữa liên quan tới giải thuật:
-Tìm tất cả các dòng có ký tự như mẫu.
-Tìm tất cả (Hay dòng đầu tiên) có bắt đàu = mẫu...
Nói tóm lại là phải có yêu cầu cụ thể.
 
Upvote 0
Thực tế mình cũng chưa bao giờ tìm hiểu đến việc unable từng item của Listview nên không biết có làm được không? Còn cho hiện hay không cả Listview thì được , nó tùy thuộc vào thuộc tính Visiable của đối tượng đó.
Nhưng việc dùng 1 cái listview chỉ để lưu trữ dũ liệu thì không nên vì nó làm chậm tiến trình load form và tốn nhiều tài nguyên không cần thiết. Có nhiều cách lưu tạm như lưu vào sheet tạm nào đó hoặc biến mảng.


File của em dùng LB thì rất ok vì nó không khó Bằng LV. em đã gắn mọi sự kiện của LB vào LV ý của em là có cách nào làm ẩn LB (không cho nó hiện lên form mà vẫn có thể sử dụng nó)
 
Upvote 0
Xóa dữ liệu trên sheet tại dòng có mã =maxoa như thế nào chắc bạn làm được:
-Tìm dòng có mã=maxoa
-Xóa dòng đó đi.
Mình chỉ ví dụ xóa 1 dòng trên Listview thôi (Bạn có thể thêm checkbox vào List để có thể chọn và xóa nhiều dòng)

P/s: Không đủ thấy áy náy, xóa trên sheet1 bạn thêm vào lệnh xóa trên:

dong = Application.WorksheetFunction.Match(maxoa, Sheet1.[a1:a5000], 0)
Sheet1.Cells(dong, 1).EntireRow.Delete
(Dòng 5000 là mình tạm vậy cho nhanh còn trong chương trình nên tìm dòng cuối cùng có dữ liệu)

dù sao cũng cám anh sealand vì đã cho em 1 ý tưởng. em sẽ cố gắng làm nhưng không biết có thành công không vì em chẳng biết gì về lập trình. Dù sao cũng cám ơn anh
 
Upvote 0
E cứ xem code trong bài để ứng dụng cho công việc của em xem có được không. (Anh cũng chỉ là vọc cho vui chứ kg theo đạo Excel.)
Trong bài anh gửi sử dụng 2 LV trên 1 Form.
1/Trên LV thứ 1: Có thể lọc theo số CMT hoặc theo TEN.
2/Trên LV thứ 2: có thể Thêm/Xoá. và lọc theo CMT
3/Ở đay anh dùng LV và việc Load DL lên LV là từ các cột trong 1 Sheet nào đó chứ không dùng Mảng (rất chậm vì phải sử dụng 2 vòng For quét qua tất cả các ô) hay Name động (không làm tươi dữ liệu trên LV được và cũng chậm).

Em chay thử File anh gửi đẻ biết thêm. Anh viết code đơn giản nên kg khó đọc. Mong em có thể tìm thêm được 1 vài ý tưởng trên đó. Gom góp từng vấn đề nhỏ thành vấn đề lớn hơn. Nhưng đừng nên phức tạp hoá vấn đề.

Chúc em thành công.
 
Upvote 0
Bạn hỏi về hàm tìm kiếm UDF mà chỉ đúng có 1 dòng tên hàm thì ai mà biết cái hàm ấy ra làm sao mà có ý kiến. Một vấn đề nữa liên quan tới giải thuật:
-Tìm tất cả các dòng có ký tự như mẫu.
-Tìm tất cả (Hay dòng đầu tiên) có bắt đàu = mẫu...
Nói tóm lại là phải có yêu cầu cụ thể.
anh ơi, cái hàm này em tham khảo bài của Anh Lê Văn Duyệt trên diễn đàn File (StockCountHelper). Chi tiết của nó như sau:
Option Explicit
Option Base 1
Public Enum elvSearch
elvSearchText = 1
elvSearchSub = 2
elvSearchTag = 4
End Enum
Private Type LV_ITEM
Mask As Long
iItem As Long
iSubItem As Long
state As Long
stateMask As Long
pszText As String
cchTextMax As Long
iImage As Long
lParam As Long
iIndent As Long
End Type
' Color Constants
Public Const vbViolet = &HFF8080
Public Const vbVioletBright = &HFFC0C0
Public Const vbForestGreen = &H228B22
Public Const vbGray = &HE0E0E0
Public Const vbLightBlue = &HFFD3A4
Public Const vbLightGreen = &HABFCBD
Public Const vbGreenLemon = &HB3FFBE
Public Const vbYellowBright = &HC0FFFF
Public Const vbOrange = &H2CCDFC
' ListView API
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function SendMessageLong Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
' ListView messages
Private Const LVM_FIRST = &H1000, LVM_GETNEXTITEM = (LVM_FIRST + 12)
Private Const LVNI_SELECTED = &H2, LVM_GETSELECTEDCOUNT = (LVM_FIRST + 50)
Private Const LVM_SETEXTENDEDLISTVIEWSTYLE = LVM_FIRST + 54, LVM_GETEXTENDEDLISTVIEWSTYLE = LVM_FIRST + 55
Private Const LVS_EX_FULLROWSELECT = &H20
Private Const LVIF_TEXT = &H1
Private Const LVM_SETITEMSTATE As Long = (LVM_FIRST + 43)
Private Const LVM_GETITEMSTATE As Long = (LVM_FIRST + 44)
Private Const LVM_GETITEMTEXT As Long = (LVM_FIRST + 45)
'Purpose : Finds and selects and item in a listview
'Inputs : sFileName The path and file name of the component to register.
' lvFind The listview to search for the item in.
' [eValueType] The type of values to search:
' 1 = Searches the text items.
' 2 = Searches sub items.
' 4 = Searches the item tags.
' [lSearchFor] The type of matching required:
' lvwWhole = Find whole word.
' lvwPartial = Find a partial match.
' [lIndexBeginFrom] The item index to begin the search from.
'Outputs : N/A
'Author : Andrew Baker
'Date : 25/11/2000 03:17
'Notes :
'Revisions :
Public Function ListViewFindItem(sFindItem As String, lvFind As Listview, _
Optional eValueType As elvSearch = elvSearchText + elvSearchSub + elvSearchTag, _
Optional lSearchFor As Long = lvwPartial, _
Optional lIndexBeginFrom As Long = 1) As ListItem
On Error Resume Next
'Try to find item
If eValueType And elvSearchText Then
'Search text
Set ListViewFindItem = lvFind.FindItem(sFindItem, lvwText, lIndexBeginFrom, lSearchFor)
End If
If eValueType And elvSearchSub And (ListViewFindItem Is Nothing) Then
'Search subitems
Set ListViewFindItem = lvFind.FindItem(sFindItem, lvwText, lIndexBeginFrom, lSearchFor)
End If
If eValueType And elvSearchTag And (ListViewFindItem Is Nothing) Then
'Search tags
Set ListViewFindItem = lvFind.FindItem(sFindItem, lvwText, lIndexBeginFrom, lSearchFor)
End If
If (ListViewFindItem Is Nothing) = False Then
'Found a matching item, display it.
Set lvFind.SelectedItem = ListViewFindItem
lvFind.SelectedItem.EnsureVisible
End If
On Error GoTo 0
End Function

Em chỉ muốn tìm trong cột thứ 2 trở đi, tìm (Hay dòng đầu tiên) có bắt đàu = mẫu, nếu được thì tìm luôn tất cả các dòng có ký tự như mẫu. File em chẳng upload được
 
Upvote 0
Mình gửi bài ví dụ về xem-xóa-sửa-tìm trên Listview. Mình e hỏng dữ liệu mẫu khi thử nên bạn bổ xung xóa sửa trên sheet nữa nhé. Phần tìm mình chưa biết cơ chế tìm của bạn nên tạm tìm tên đúng như trong ô
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Em có tạo 1 form dùng để chon bảng cần nhập. em dùng dùng formnhap.show thì nó vẫn chạy nhưng khi nhấn nút thoát trên formnhập thì nó báo lỗi formnhap.show. còn dùng lệnh call nhapdulieu de gọi LV thì nó cũng hiện lên formnhap nhưng khi nhấn nút thoát lần thứ 1 thì nó không thoát formnhập mà giống như là nó call nhapdulieu thêm 1 lần nữa. em không biết tại sao no bị như vậy các anh có cách nào khắc phục không ?

và còn 1 vấn đề nữa là em dùng lệnh đổi font cho textbox để chép vào bảng Excel mọi chữ điều bình thường nhưng có 1 chữ này nó không chép được "Xã Bảo Vinh" (em cũng đã thử convet font abc sang unicode trên excel thì bình thường).

cám ơn các anh
 
Upvote 0
E cứ xem code trong bài để ứng dụng cho công việc của em xem có được không. (Anh cũng chỉ là vọc cho vui chứ kg theo đạo Excel.)
Trong bài anh gửi sử dụng 2 LV trên 1 Form.
1/Trên LV thứ 1: Có thể lọc theo số CMT hoặc theo TEN.
2/Trên LV thứ 2: có thể Thêm/Xoá. và lọc theo CMT
3/Ở đay anh dùng LV và việc Load DL lên LV là từ các cột trong 1 Sheet nào đó chứ không dùng Mảng (rất chậm vì phải sử dụng 2 vòng For quét qua tất cả các ô) hay Name động (không làm tươi dữ liệu trên LV được và cũng chậm).

Em chay thử File anh gửi đẻ biết thêm. Anh viết code đơn giản nên kg khó đọc. Mong em có thể tìm thêm được 1 vài ý tưởng trên đó. Gom góp từng vấn đề nhỏ thành vấn đề lớn hơn. Nhưng đừng nên phức tạp hoá vấn đề.

Chúc em thành công.


trong bài anh gởi lên không có form nào hết mà chỉ có modul1 với đoạn code trong đó thôi
 
Upvote 0
To thuyyeu99: Lỗi của bạn hay xảy ra khi chép, sửa hiệu đính không hết. Bạn xóa bớt dữ liệu chỉ để mãu load lên mọi người tìm giúp chứ vừa đọc vừa đoán khó lắm.
 
Upvote 0
Mình gửi bài ví dụ về xem-xóa-sửa-tìm trên Listview. Mình e hỏng dữ liệu mẫu khi thử nên bạn bổ xung xóa sửa trên sheet nữa nhé. Phần tìm mình chưa biết cơ chế tìm của bạn nên tạm tìm tên đúng như trong ô
Cám ơn anh đã nhiệt tình giúp đỡ. Nếu em chỉ gõ 1 cụm từ trong textbox6 nó sẽ tìm toàn bộ các dòng có subitem(1) chứa cụm từ đó thì làm như thế nào?
Mục đích chính của em là hỗ trợ người dùng tìm kiếm dữ liệu một cách đa dạng. Và không phải lọc từ sheets như cách em làm
 
Upvote 0
Mình thay đổi cơ chế tìm, hơn nữa đây là tìm nhiều dòng nên khi đúng mình đánh dấu vào hộp kiểm đầu dòng

P/s: Mình thay tệp kèm để khi tìm vùa đánh dấu vừa chép sang Listview2
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
các anh cho em hỏi thêm 1 vấn đề nữa là từ form mình có cách nào để tạo nút xem trước khi in không ( khi mình nhấn vào nút xem thì nó xẽ nhảy ra màn hình Xem trước khi in giống như trong Excel và khi nhấn nút đóng thì nó sẽ trở về lại Form ban đầu)
 
Upvote 0
Từ Form ban dùng lệnh unloadme để đóng Form lại.
Cần xem sh nào ví dụ sh TBAO ta dùng lệnh: sheets("TBAO").PrintPreview
Cái khó mình chưa tìm ra là khi thoát chế độ Printview không có sự kiện để load trở lại Form mà phải đặt nút lệnh mở form trở lại.
 
Upvote 0
Để ẩn/hiện form dùng method Hide và Show.

Trước khi PrintOut hoặc PrintPreview ta dùng như sau:
...

UserForm1.Hide ' dấu form

<< mã xử lý in, ví dụ: Sheet1.PrintPreview >>>

UserForm1.Show ' cho hiện lại form
 
Upvote 0
các anh cho em hỏi trong LV có cách nào thay đổi màu của các đường kẻ và màu của dòng mình dang chọn không ?
 
Upvote 0
Public Function ListViewFindItem(sFindItem As String, lvFind As ListView, [eValueType As elvSearch], [lSearchFor As Long = 1], [lIndexBeginFrom As Long = 1]) As ListItem

'Purpose : Finds and selects and item in a listview'Inputs : sFileName The path and file name of the component to register.
' lvFind The listview to search for the item in.
' [eValueType] The type of values to search:
' 1 = Searches the text items.
' 2 = Searches sub items.
' 4 = Searches the item tags.
' [lSearchFor] The type of matching required:
' lvwWhole = Find whole word.
' lvwPartial = Find a partial match.
' [lIndexBeginFrom] The item index to begin the search from.
Có ai biết Cho Mình hỏi code để dùng hàm trên để tìm trên listView từ cột thứ 2 như thế nào?

Bạn có thể tham khảo tại đây :
-- CV--
 
Upvote 0
Bạn chọn Properties như các điều khiển khác, trên dòng Customs bạn nhấn dấu 3 chấm sẽ mở ra cửa sổ định dạng riêng của Listview, trong đó có yêu cầu của bạn.
 
Upvote 0
Anh có thể cho em một ví dụ về tìm kiếm trên cột 2 theo hướng dẫn được không. Em làm thử mà không được
 
Upvote 0
To kieuvietphuong:Dưới đây là đoạn mã lọc trên cột 2 của file kèm theo bài 58

Mã:
[COLOR=Blue]Private Sub CommandButton3_Click()
Call CommandButton4_Click  [COLOR=Orange] 'Lệnh xóa dấu kiểm và xóa List.2[/COLOR]
matim = Me.TextBox7
For i = 1 To Me.ListView1.ListItems.Count
If InStr(1, Me.ListView1.ListItems.Item(i).SubItems(1), matim, 0) > 0 Then [COLOR=Orange]'Nếu tìm thấy thì.....[/COLOR]
Me.ListView1.ListItems.Item(i).Checked = True   [COLOR=Orange]'Đánh dấu hộp kiểm[/COLOR] 
Call nap_loc(i) [COLOR=Orange]'Thêm dòng tìm thấy vào Lìst[/COLOR]
End If
Next
Me.ListView1.SetFocus

End Sub

Private Sub CommandButton4_Click()
[COLOR=Orange]'Xóa tất cả các dấu kiểm của List1[/COLOR]
For i = 1 To Me.ListView1.ListItems.Count
If Me.ListView1.ListItems.Item(i).Checked = True Then
Me.ListView1.ListItems.Item(i).Checked = False
End If
Next
[COLOR=Orange]'Xóa hết List2 trước khi nạp mới[/COLOR]
If Me.ListView2.ListItems.Count > 0 Then
Me.ListView2.ListItems.Clear
End If
End Sub
[/COLOR]
Bạn xem lại nhé
 
Upvote 0
Anh ơi Ý em muốn là không cần dùng Litsview phụ.
Em thử đoạn code:
Private Sub TxtMaDV_Change()
Dim It As ListItem, i As Long
On Error Resume Next
Set It = Me.lwDSDV.FindItem(TxtMaDV, lvwSubItem, , lvwPartial)
' hoặc thay lvwtext + 1 theo đường dẫn của Lệnh Hồ Đại Hiệp mà không ra
i = It.Index
Me.lwDSDV.ListItems(i).Selected = True
Me.lwDSDV.ListItems(i).EnsureVisible
End Sub

Em thấy nhiều tài liệu nói FindIterm chỉ cho tìm trong cột đầu thôi. Không rõ có đúng vậy không
 
Lần chỉnh sửa cuối:
Upvote 0
Đúng là FindItem chỉ tìm trên cột đầu. Nhưng mình vận dụng các chức năng khác để duyệt và tìm tiếm chứ. Ví dụ của mình đâu có dùng FindItem.
List phụ chỉ là cái thông báo cho bạn thôi, nó có thể thay bằng Msgbox hay sử dụng kết quả vào việc gì thì tùy theo ý bạn mà vận dụng.
Một lần nữa là FindItem chỉ tìm trên cột Index thôi.
 
Lần chỉnh sửa cuối:
Upvote 0
Anh ơi Ý em muốn là không cần dùng Litsview phụ.
Em thử đoạn code:
Private Sub TxtMaDV_Change()
Dim It As ListItem, i As Long
On Error Resume Next
Set It = Me.lwDSDV.FindItem(TxtMaDV, lvwSubItem, , lvwPartial)
' hoặc thay lvwtext + 1 theo đường dẫn của Lệnh Hồ Đại Hiệp mà không ra
i = It.Index
Me.lwDSDV.ListItems(i).Selected = True
Me.lwDSDV.ListItems(i).EnsureVisible
End Sub

Em thấy nhiều tài liệu nói FindIterm chỉ cho tìm trong cột đầu thôi. Không rõ có đúng vậy không

FindItem cho phép ta tìm kiếm trên các Sub Item, tuy nhiên nó lại không cho ta xác định là ở cột nào.
Đây là Code : Mặc dù là lvwPartial nhưng nó lại là tìm kiếm chính xác lvwWhole (!?)
và không biết cách nào để lấy được chỉ số cột của Item tìm được (!?)
PHP:
    Dim LVFind As ListView
    Dim MyItem As ListItem
    Dim RowItem As Long
    Set MyItem = LVFind.FindItem(MaFind, 1, , lvwPartial)
    If MyItem Is Nothing Then Exit Sub
    RowItem = MyItem.Index
    MsgBox RowItem

Còn nếu bạn muốn chỉ tìm trong 1 cột nhất định thì đây là UDF :


PHP:
Function TimRowItemLV(MaFind As String, LVFind As ListView, Cot As Integer, _
Optional TimChinhXac As Boolean = True) As Long
    On Error Resume Next    
    If LVFind.ListItems.Count = 0 Then Exit Function
    Dim i As Integer
    With LVFind
        If TimChinhXac = True Then
            For i = 1 To LVFind.ListItems.Count
                If .ListItems.Item(i).SubItems(Cot - 1) = MaFind Then
                    TimRowItemLV = i
                    Exit Function
                End If
            Next
        Else
            For i = 1 To LVFind.ListItems.Count
                If InStr(1, .ListItems.Item(i).SubItems(Cot - 1), MaFind) Then
                    TimRowItemLV = i
                    Exit Function
                End If
            Next
        End If
    End With
    Set LVFind = Nothing
End Function
-- Chúc vui--
 
Upvote 0
UDF này rất hay
Em thử chạy tốt và code tìm kiếm rút ngắn lại rất nhiều. Tùy biến trong việc tìm kiếm các cột. Hỗ trợ nhập liệu trong ứng dụng nhanh nếu dữ liệu được Sort. Duy chỉ có tốc độ tìm kiếm chưa bằng FindItem.
Cám ơn anh nhiều.
 
Lần chỉnh sửa cuối:
Upvote 0
Cho em hỏi
Có code nào sort dữ liệu trên các cột listview ngoài cột đầu tiên không. Khi load dữ liệu vào listview là sort luôn không cần phải sự kiện nhấn columnheader hoặc sự kiện khác
Thân
 
Lần chỉnh sửa cuối:
Upvote 0
Cho em hỏi
Có code nào sort dữ liệu trên các cột listview ngoài cột đầu tiên không. Khi load dữ liệu vào listview là sort luôn không cần phải sự kiện nhấn columnheader hoặc sự kiện khác
Thân

Bạn tham khảo nhé :

PHP:
Sub SortLVTheoCot(AllLV As ListView, Optional Cot As Long = 1, _
                    Optional Ascending As Boolean = True)
    If Cot < 1 Then Exit Sub
    If Cot > AllLV.ColumnHeaders.Count Then Exit Sub
    With AllLV
        .Sorted = True
        .SortKey = Cot - 1
        .SortOrder = IIf(Ascending = True, lvwAscending, lvwDescending)
    End With
End Sub
--CV--
 
Upvote 0

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

Back
Top Bottom