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 ý.
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.
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ý 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
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
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
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
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
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
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
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 ở đâyChà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
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)
Chào anhThô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.
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é!*******************************
[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)
**********************
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
*****************************************
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.
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:
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.
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)
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.)em chua hieu y cua anh ?
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: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ể.
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.
Sorry. Anh đã gửi lại File em DL về xem nhé.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
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ì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 ô
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?
[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]
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
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
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
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
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