Giúp sửa code lọc tìm kiếm chử cái đầu (1 người xem)

Liên hệ QC

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

minhtuan55

Thành viên bị đình chỉ hoạt động
Thành viên bị đình chỉ hoạt động
Tham gia
23/3/16
Bài viết
705
Được thích
52
Chào cả Nhà GPE !
Em có vần đề nhờ cả nhà giúp. Em có đoạn code tìm kiếm theo chữ cái đầu của tên hàng. Hiện tại code sau khi chạy xong thì hiện ra các dòng có DK đúng còn các dòng DK sai thì ẩn đi. giờ em muốn sửa lại sau khi code chạy xong xuất ra dữ liệu các tên hàng DK đúng thì phải sửa làm sao. Mong cả nhà giúp

Mã:
Public Sub Hihi()
    Dim Vung, i, J, Dk, Tach, Gom
    Application.ScreenUpdating = False
    Dk = UCase([K1])
    Cells.EntireRow.Hidden = False
    Set Vung = Range([C3], [C50000].End(xlUp))
    Vung.EntireRow.Hidden = True
        For i = 1 To Vung.Rows.Count
            Tach = Split(Vung(i))
            If UBound(Tach) + 1 >= Len(Dk) Then
                For J = 1 To Len(Dk)
                    Gom = Gom & TV(UCase(Left(Tach(J - 1), 1)))
                Next J
                    If Gom = Dk Then Vung(i).EntireRow.Hidden = False ' Em muốn sửa lại đoạn này để xuất ra 1 cột T
                Gom = ""
            End If
        Next i
Application.ScreenUpdating = True
End Sub


Function TV(ByVal Text As String) As String
    On Error Resume Next
    Dim CharCode, ResText As String, i As Long, tmp As String
    tmp = Text
    CharCode = Array(ChrW(7855), ChrW(7857), ChrW(7859), ChrW(7861), ChrW(7863), ChrW(7845), ChrW(7847), _
                     ChrW(7849), ChrW(7851), ChrW(7853), ChrW(225), ChrW(224), ChrW(7843), ChrW(227), ChrW(7841), _
                     ChrW(259), ChrW(226), ChrW(273), ChrW(7871), ChrW(7873), ChrW(7875), ChrW(7877), ChrW(7879), _
                     ChrW(233), ChrW(232), ChrW(7867), ChrW(7869), ChrW(7865), ChrW(234), ChrW(237), ChrW(236), _
                     ChrW(7881), ChrW(297), ChrW(7883), ChrW(7889), ChrW(7891), ChrW(7893), ChrW(7895), ChrW(7897), _
                     ChrW(7899), ChrW(7901), ChrW(7903), ChrW(7905), ChrW(7907), ChrW(243), ChrW(242), ChrW(7887), _
                     ChrW(245), ChrW(7885), ChrW(244), ChrW(417), ChrW(7913), ChrW(7915), ChrW(7917), ChrW(7919), _
                     ChrW(7921), ChrW(250), ChrW(249), ChrW(7911), ChrW(361), ChrW(7909), ChrW(432), ChrW(253), _
                     ChrW(7923), ChrW(7927), ChrW(7929), ChrW(7925))
    ResText = "aaaaaaaaaaaaaaaaadeeeeeeeeeeeiiiiiooooooooooooooooouuuuuuuuuuuyyyyy"
    For i = 0 To UBound(CharCode)
        tmp = Replace(tmp, CharCode(i), Mid(ResText, i + 1, 1))
        tmp = Replace(tmp, UCase(CharCode(i)), UCase(Mid(ResText, i + 1, 1)))
    Next
    TV = tmp
End Function
 

File đính kèm

Chào cả Nhà GPE !
Em có vần đề nhờ cả nhà giúp. Em có đoạn code tìm kiếm theo chữ cái đầu của tên hàng. Hiện tại code sau khi chạy xong thì hiện ra các dòng có DK đúng còn các dòng DK sai thì ẩn đi. giờ em muốn sửa lại sau khi code chạy xong xuất ra dữ liệu các tên hàng DK đúng thì phải sửa làm sao. Mong cả nhà giúp

Mã:
Public Sub Hihi()
    Dim Vung, i, J, Dk, Tach, Gom
    Application.ScreenUpdating = False
    Dk = UCase([K1])
    Cells.EntireRow.Hidden = False
    Set Vung = Range([C3], [C50000].End(xlUp))
    Vung.EntireRow.Hidden = True
        For i = 1 To Vung.Rows.Count
            Tach = Split(Vung(i))
            If UBound(Tach) + 1 >= Len(Dk) Then
                For J = 1 To Len(Dk)
                    Gom = Gom & TV(UCase(Left(Tach(J - 1), 1)))
                Next J
                    If Gom = Dk Then Vung(i).EntireRow.Hidden = False ' Em muốn sửa lại đoạn này để xuất ra 1 cột T
                Gom = ""
            End If
        Next i
Application.ScreenUpdating = True
End Sub


Function TV(ByVal Text As String) As String
    On Error Resume Next
    Dim CharCode, ResText As String, i As Long, tmp As String
    tmp = Text
    CharCode = Array(ChrW(7855), ChrW(7857), ChrW(7859), ChrW(7861), ChrW(7863), ChrW(7845), ChrW(7847), _
                     ChrW(7849), ChrW(7851), ChrW(7853), ChrW(225), ChrW(224), ChrW(7843), ChrW(227), ChrW(7841), _
                     ChrW(259), ChrW(226), ChrW(273), ChrW(7871), ChrW(7873), ChrW(7875), ChrW(7877), ChrW(7879), _
                     ChrW(233), ChrW(232), ChrW(7867), ChrW(7869), ChrW(7865), ChrW(234), ChrW(237), ChrW(236), _
                     ChrW(7881), ChrW(297), ChrW(7883), ChrW(7889), ChrW(7891), ChrW(7893), ChrW(7895), ChrW(7897), _
                     ChrW(7899), ChrW(7901), ChrW(7903), ChrW(7905), ChrW(7907), ChrW(243), ChrW(242), ChrW(7887), _
                     ChrW(245), ChrW(7885), ChrW(244), ChrW(417), ChrW(7913), ChrW(7915), ChrW(7917), ChrW(7919), _
                     ChrW(7921), ChrW(250), ChrW(249), ChrW(7911), ChrW(361), ChrW(7909), ChrW(432), ChrW(253), _
                     ChrW(7923), ChrW(7927), ChrW(7929), ChrW(7925))
    ResText = "aaaaaaaaaaaaaaaaadeeeeeeeeeeeiiiiiooooooooooooooooouuuuuuuuuuuyyyyy"
    For i = 0 To UBound(CharCode)
        tmp = Replace(tmp, CharCode(i), Mid(ResText, i + 1, 1))
        tmp = Replace(tmp, UCase(CharCode(i)), UCase(Mid(ResText, i + 1, 1)))
    Next
    TV = tmp
End Function
Thêm hàm này vào:
Mã:
Function AbbName(ByVal Text As String, Optional ByVal Ipt_Delimiter As String = " ", _
                                       Optional ByVal Opt_Delimiter As String = "") As String
  Dim tmp1 As String, tmp2 As String
  Dim n As Long, aTmp
  If InStr(1, Text, Ipt_Delimiter) Then
    aTmp = Split(Text, Ipt_Delimiter)
    For n = LBound(aTmp) To UBound(aTmp)
      aTmp(n) = Left(aTmp(n), 1)
    Next
    AbbName = Join(aTmp, Opt_Delimiter)
  End If
End Function
Xong, sửa sub chạy của bạn thành:
Mã:
Sub Main()
  Range("T:T").Clear
  Range("K2").Value = "=LEFT(AbbName(C3),LEN($K$1))=$K$1"
  Range("C2:C10000").AdvancedFilter xlFilterCopy, Range("K1:K2"), Range("T2")
  Range("K2").Clear
End Sub
Nhân tiện tôi "trả lại tên cho em" hàm này:
Mã:
Function RemoveMarks(ByVal Text As String) As String
  Dim CharCode, i As Long
  Dim ResText As String, sTmp As String
  On Error Resume Next
  sTmp = Text
  CharCode = Array(7855, 7857, 7859, 7861, 7863, 7845, 7847, 7849, 7851, 7853, 225, _
                   224, 7843, 227, 7841, 259, 226, 273, 7871, 7873, 7875, 7877, 7879, _
                   233, 232, 7867, 7869, 7865, 234, 237, 236, 7881, 297, 7883, 7889, _
                   7891, 7893, 7895, 7897, 7899, 7901, 7903, 7905, 7907, 243, 242, _
                   7887, 245, 7885, 244, 417, 7913, 7915, 7917, 7919, 7921, 250, _
                   249, 7911, 361, 7909, 432, 253, 7923, 7927, 7929, 7925)
  ResText = "aaaaaaaaaaaaaaaaadeeeeeeeeeeeiiiiiooooooooooooooooouuuuuuuuuuuyyyyy"
  For i = 0 To UBound(CharCode)
    sTmp = Replace(sTmp, ChrW(CharCode(i)), Mid(ResText, i + 1, 1))
    sTmp = Replace(sTmp, UCase(ChrW(CharCode(i))), UCase(Mid(ResText, i + 1, 1)))
  Next
  RemoveMarks = sTmp
End Function
----------------------------
Ghét nhất là tên nào copy code của mình rồi sửa lại tên thành.. tào lao gì đâu (Hàm TV là cái khỉ gì?)
Không thích dùng đồ của người khác thì cứ tự mình viết lấy nhé
 

File đính kèm

Upvote 0
Ghét nhất là tên nào copy code của mình rồi sửa lại tên thành.. tào lao gì đâu (Hàm TV là cái khỉ gì?)
Không thích dùng đồ của người khác thì cứ tự mình viết lấy nhé

lâu rồi mới thấy thầy NDU nổi nóng ha. Anh làm em "nhột" quá, không nhớ trước đây có từng xài "hàng" của anh NDU rồi đổi thành tên mới không nữa. !$@!!!$@!!
Không ấy anh ghi thêm 1 dòng chú thích bên trong hàm đi
'Được viết bởi anhtuan1066. Được copy nhưng cấm đổi tên -0-0-0-
 
Upvote 0
Thêm hàm này vào:
Mã:
Function AbbName(ByVal Text As String, Optional ByVal Ipt_Delimiter As String = " ", _
                                       Optional ByVal Opt_Delimiter As String = "") As String
  Dim tmp1 As String, tmp2 As String
  Dim n As Long, aTmp
  If InStr(1, Text, Ipt_Delimiter) Then
    aTmp = Split(Text, Ipt_Delimiter)
    For n = LBound(aTmp) To UBound(aTmp)
      aTmp(n) = Left(aTmp(n), 1)
    Next
    AbbName = Join(aTmp, Opt_Delimiter)
  End If
End Function
Xong, sửa sub chạy của bạn thành:
Mã:
Sub Main()
  Range("T:T").Clear
  Range("K2").Value = "=LEFT(AbbName(C3),LEN($K$1))=$K$1"
  Range("C2:C10000").AdvancedFilter xlFilterCopy, Range("K1:K2"), Range("T2")
  Range("K2").Clear
End Sub
Nhân tiện tôi "trả lại tên cho em" hàm này:
Mã:
Function RemoveMarks(ByVal Text As String) As String
  Dim CharCode, i As Long
  Dim ResText As String, sTmp As String
  On Error Resume Next
  sTmp = Text
  CharCode = Array(7855, 7857, 7859, 7861, 7863, 7845, 7847, 7849, 7851, 7853, 225, _
                   224, 7843, 227, 7841, 259, 226, 273, 7871, 7873, 7875, 7877, 7879, _
                   233, 232, 7867, 7869, 7865, 234, 237, 236, 7881, 297, 7883, 7889, _
                   7891, 7893, 7895, 7897, 7899, 7901, 7903, 7905, 7907, 243, 242, _
                   7887, 245, 7885, 244, 417, 7913, 7915, 7917, 7919, 7921, 250, _
                   249, 7911, 361, 7909, 432, 253, 7923, 7927, 7929, 7925)
  ResText = "aaaaaaaaaaaaaaaaadeeeeeeeeeeeiiiiiooooooooooooooooouuuuuuuuuuuyyyyy"
  For i = 0 To UBound(CharCode)
    sTmp = Replace(sTmp, ChrW(CharCode(i)), Mid(ResText, i + 1, 1))
    sTmp = Replace(sTmp, UCase(ChrW(CharCode(i))), UCase(Mid(ResText, i + 1, 1)))
  Next
  RemoveMarks = sTmp
End Function
----------------------------
Ghét nhất là tên nào copy code của mình rồi sửa lại tên thành.. tào lao gì đâu (Hàm TV là cái khỉ gì?)
Không thích dùng đồ của người khác thì cứ tự mình viết lấy nhé

dạ em cảm ơn anh. Dạ cái file đó e dowload trên diển đàn về em có biết gì đâu anh, chắc người trước họ đổi tên
 
Upvote 0
lâu rồi mới thấy thầy NDU nổi nóng ha. Anh làm em "nhột" quá, không nhớ trước đây có từng xài "hàng" của anh NDU rồi đổi thành tên mới không nữa. !$@!!!$@!!

Hòi xưa tôi cũng có khi cóp code của ngừoi ta về rồi đổi tên. Lý do đơn giản là tại vì xui xẻo nó trùng tên với cái hàm khác.
Nhưng đương nhiên là bây giờ thì có cách khác.

Chú thích: tôi chỉ mánh cóp code rồi đấy, các bạn nếu cần thì cứ đổ thừa là tại nó trùng tên với hàm khác có sẵn trong project. Chứ đổ tai tiếng qua người khác để người ta mang tội với trời phật tội nghiệp.
 
Upvote 0
Thêm hàm này vào:
Mã:
Function AbbName(ByVal Text As String, Optional ByVal Ipt_Delimiter As String = " ", _
                                       Optional ByVal Opt_Delimiter As String = "") As String
  Dim tmp1 As String, tmp2 As String
  Dim n As Long, aTmp
  If InStr(1, Text, Ipt_Delimiter) Then
    aTmp = Split(Text, Ipt_Delimiter)
    For n = LBound(aTmp) To UBound(aTmp)
      aTmp(n) = Left(aTmp(n), 1)
    Next
    AbbName = Join(aTmp, Opt_Delimiter)
  End If
End Function
Xong, sửa sub chạy của bạn thành:
Mã:
Sub Main()
  Range("T:T").Clear
  Range("K2").Value = "=LEFT(AbbName(C3),LEN($K$1))=$K$1"
  Range("C2:C10000").AdvancedFilter xlFilterCopy, Range("K1:K2"), Range("T2")
  Range("K2").Clear
End Sub
Nhân tiện tôi "trả lại tên cho em" hàm này:
Mã:
Function RemoveMarks(ByVal Text As String) As String
  Dim CharCode, i As Long
  Dim ResText As String, sTmp As String
  On Error Resume Next
  sTmp = Text
  CharCode = Array(7855, 7857, 7859, 7861, 7863, 7845, 7847, 7849, 7851, 7853, 225, _
                   224, 7843, 227, 7841, 259, 226, 273, 7871, 7873, 7875, 7877, 7879, _
                   233, 232, 7867, 7869, 7865, 234, 237, 236, 7881, 297, 7883, 7889, _
                   7891, 7893, 7895, 7897, 7899, 7901, 7903, 7905, 7907, 243, 242, _
                   7887, 245, 7885, 244, 417, 7913, 7915, 7917, 7919, 7921, 250, _
                   249, 7911, 361, 7909, 432, 253, 7923, 7927, 7929, 7925)
  ResText = "aaaaaaaaaaaaaaaaadeeeeeeeeeeeiiiiiooooooooooooooooouuuuuuuuuuuyyyyy"
  For i = 0 To UBound(CharCode)
    sTmp = Replace(sTmp, ChrW(CharCode(i)), Mid(ResText, i + 1, 1))
    sTmp = Replace(sTmp, UCase(ChrW(CharCode(i))), UCase(Mid(ResText, i + 1, 1)))
  Next
  RemoveMarks = sTmp
End Function
----------------------------
Ghét nhất là tên nào copy code của mình rồi sửa lại tên thành.. tào lao gì đâu (Hàm TV là cái khỉ gì?)
Không thích dùng đồ của người khác thì cứ tự mình viết lấy nhé
Hình như code sẽ không lọc được những tên không có khoảng trắng (1 chữ)
 
Upvote 0
Hình như code sẽ không lọc được những tên không có khoảng trắng (1 chữ)
Cảm ơn Thắng đã phát hiện!
Hàm AbbName có đoạn: If InStr(1, Text, Ipt_Delimiter) Then nên khi không phát hiện ra ký tự Ipt_Delimiter thì nó sẽ không làm gì cả
Nghĩ lại cũng thấy mình hơi buồn cười, vì với hàm Split, khi không tìm thấy Delimiter thì cùng lắm nó sẽ trả về mảng 1 phần tử chính bằng với chuỗi gốc
Vậy có lẽ nên bỏ đoạn IF đó thì hơn:
Mã:
Function AbbName(ByVal Text As String, Optional ByVal Ipt_Delimiter As String = " ", _
                                       Optional ByVal Opt_Delimiter As String = "") As String
  Dim n As Long, aTmp
  aTmp = Split(Text, Ipt_Delimiter)
  For n = LBound(aTmp) To UBound(aTmp)
    aTmp(n) = Left(aTmp(n), 1)
  Next
  AbbName = Join(aTmp, Opt_Delimiter)
End Function
----------------------------------------
lâu rồi mới thấy thầy NDU nổi nóng ha. Anh làm em "nhột" quá, không nhớ trước đây có từng xài "hàng" của anh NDU rồi đổi thành tên mới không nữa. !$@!!!$@!!
Không ấy anh ghi thêm 1 dòng chú thích bên trong hàm đi
'Được viết bởi anhtuan1066. Được copy nhưng cấm đổi tên -0-0-0-
Tôi không có thói quen ghi chú để "khẳng định chủ quyền". Ăn thua là sự tự trọng của mỗi người
Ai mà chẳng từng học hỏi code của nhau. Tôi cũng không ít lần tìm code trên diễn đàn hoặc ở nước ngoài rồi mang về "chế" lại
Vấn đề là "học hỏi" nó khác với "ăn trộm". Khi ta chỉ copy thuật toán của nhau và biến nó thành cái của riêng mình thì đó là học hỏi. Còn việc mang "nguyên con" về rồi chỉ sửa mỗi cái tên thì gọi.. là gì? Mà cho dù là "thay tên, đổi họ" gì đó đi.. cũng làm sao coi cho được (ít nhất cũng hay hơn) để tác giả không cảm thấy đứa con tinh thần của mình đang bị ngược đãi
Bức xúc nên phát biểu bâng quơ vậy thôi chứ ở Việt Nam vẫn còn tồn tại nhiều chuyện động trời hơn (ăn cắp luận án của nhau chẳng hạn) mà chúng ta vẫn xem là... chuyện thường thì chẳng biết đến khi nào mình mới sánh ngang tầm được với... Campuchia
???!!!
 
Upvote 0
Theo tôi hiểu những cái trên mạng theo luật bất thành văn:
1. Nếu tác phẩm có ghi rõ là phải có bản quyền mà ai đó dùng không có bản quyền thì là phạm luật.
2. Nếu tác phẩm chỉ công bố cho một nhóm người nhất định bằng cách đăng trong nhóm có đặng nhập bằng mật khẩu hoặc khóa mà ai đó bẻ khóa thì là phạm luật, là ăn cắp.
3. Nếu tác giả ghi rõ tác giả mà ai đó sửa lại thì là phạm luật, là ăn cắp. Nếu ghi rõ là không được chỉnh sửa, phát tán mà ai đó chỉnh sửa, phát tán thì là phạm luật.
4. Nếu tác phẩm đăng ở nơi ai cũng vào được, xem được thì được hiểu là chia sẻ cho tất cả mọi người. Nếu tác phẩm không ghi tác giả mà ai ̣đó ghi thêm mình là tác giả thì là ăn cắp. Nếu không ghi rõ tác giả trong tác phẩm, không cấm gì thì việc dùng tác phẩm đó không thể gọi là ăn cắp. Tác phẩm không cấm chỉnh sửa thì hoàn toàn có quyền chỉnh sửa. Chả nhẽ tên các hàm, các biến bằng tiếng Anh, Nga, Ba Lan, Séc mà người ta lại không có quyền chỉnh thành tên tiếng Việt? Vô lý quá mức. Nếu cấm thì đúng là không được chỉnh sửa nhưng không cấm tức là người khác có thể chỉnh sửa để phù hợp với mình. Ngay cả các code chỉ ghi tác giả, tức không cấm sửa thì vẫn có quyền sửa, vd. sửa lỗi của tác giả, bởi tác giả cũng có thể không lường được lỗi mà. Tất nhiên nếu đã có tên tác giả thì người sửa phải ghi rõ đã sửa gì, do ai sửa để tránh hiểu lầm là cả những phần sửa đó là do tác giả thực hiện. Vd. ai đó sửa nhưng lại sửa sai (trình độ có hạn) mà không ghi rõ ai sửa và sửa gì thì thành ra là tác giả viết code đó sai, gây ra hiểu lầm.
Tóm lại không thể ăn cắp cái được cho không, miễn phí. Và những cái mà luật không cấm thì mọi người luôn có quyền làm - đây là nguyên tắc của luật mà bất cứ người thực thi pháp luật nào đều biết. Nếu tôi làm gì đó mà ông công tố viên cứ muốn lôi tôi vào vòng lao lý thì ông ta phải chỉ ra được là tôi đã phạm điều luật nào. Không cấm trong bất cứ bộ luật nào thì tôi luôn có quyền làm. Đấy là nguyên tắc.
 
Upvote 0
Vậy là trường hợp này sửa code không có phạm luật đâu. Chủ thớt yên tâm đi, không cần phải chối bai bải là người khác sửa code.
 
Upvote 0
Web KT

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

Back
Top Bottom