Lấy những tên xuất hiện > 3 lần trong 1 ô (3 người xem)

Liên hệ QC

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

Cháo lòng quá là ngon. Đập một quả trứng và cắt 2, 3 quẩy nữa thì tuyệt vời. Mà phở cũng ngon, mì xào dòn cũng tuyệt.

Cũng cháo lòng nhưng nấu hơi khác chút.

Mã:
Function RepeatN(ByVal cell_str As String, ByVal repeat_count As Long, _
    Optional ByVal phan_biet_hoa_thuong As Boolean = False) As String
Dim re As Object, s As String, item
    cell_str = Replace(cell_str, " ", "")
    Set re = CreateObject("VBScript.RegExp")
    re.Global = True
    re.ignorecase = Not phan_biet_hoa_thuong
    For Each item In Split(cell_str, ",")
        If item <> "" Then
            re.Pattern = "(?:^|,)" & item & "(?=(?:,|$))"
            If re.Execute(cell_str).Count >= repeat_count Then
                s = s & item & ", "
                cell_str = re.Replace(cell_str, "")
            End If
        End If
    Next item
    Set re = Nothing
    If s <> "" Then RepeatN = Left(s, Len(s) - 2)
End Function

Mình ngèo nên chỉ ăn cá khô ?
Mã:
Function fst(cell, n) As String
For Each e In Split(cell, ",")
t = Trim(e): s = "," & t & ","
If t <> "" Then
    st = st & s
    If Len(st) - Len(Replace(st, s, "")) = n * Len(s) Then _
    If fst = "" Then fst = fst & t Else fst = fst & ", " & t
End If
Next
End Function
 
Cá hay mắm gì cũng xơi ngon chán.
Chỉ có loại code không chịu phân biệt "An" với "Anh" mới là loại sợ "người ta tưởng thiệt mà áp dụng lung tung" thôi.
 
Cám ơn cái ý kiến thêm chào quảy của bác. Tôi bị vướng ở chỗ cái khớp (match) nó xơi (consume) mất cái dấu phẩy trong mẫu (pattern) cho nên không giải quyết được trường hợp 2 từ giống nhau đi liền nhau, và bắt buộc phải dùng dấu ngăn chuỗi (#). Bây giờ thấy cái mẫu của bác mới nhớ ra là mình quên mất cái vụ "dòm trước ngó sau" (lookahead/lookaround)

tb. Code bác đã lỡ có cái "optional" rồi thì cũng nên cho thêm cái option "giữ nguyên cụm từ" hoăc "gọp lại thành 1 từ"
(phân biêt hoăc không Lan Anh với LanAnh)

(*) Giải thích thêm cho các bạn chưa quen với Regex:
Khi Regex tìm được một điểm khớp với mẫu, thì nó bắt đầu tìm tiếp kể từ SAU điểm khớp, cho nên nếu tìm mẫu ",b," (b giữa 2 dấu phẩy) trong chuỗi "a,b,b,c,..." thì nó chỉ tìm được cái đầu, cái kế nó không thấy vì nó đã vượt qua dấu phẩy (nó tìm tiếp kể từ ký tự b thứ 2, và không biết rằng b này cũng nằm giữa 2 dấu phẩy)
Kỹ thuật "dòm trước" giúp Regex giải quyết khó khăn này. Nếu tôi đặt dấu phẩy trong điều kiện "dòm trước" thì nó không thuộc về phần bị lướt qua sau điểm khớp. Nếu tìm mẫu ",b" + "dòm trước ," thì sau khi thấy ",b," nó lại bắt đầu tìm tiếp ở sau b và thấy được ",b," kế tiếp.

Cám ơn bạn đã giải thích hộ.
 
Cháo lòng quá là ngon. Đập một quả trứng và cắt 2, 3 quẩy nữa thì tuyệt vời. Mà phở cũng ngon, mì xào dòn cũng tuyệt.

Cũng cháo lòng nhưng nấu hơi khác chút.

Mã:
Function RepeatN(ByVal cell_str As String, ByVal repeat_count As Long, _
    Optional ByVal phan_biet_hoa_thuong As Boolean = False) As String
Dim re As Object, s As String, item
    cell_str = Replace(cell_str, " ", "")
    Set re = CreateObject("VBScript.RegExp")
    re.Global = True
    re.ignorecase = Not phan_biet_hoa_thuong
    For Each item In Split(cell_str, ",")
        If item <> "" Then
            re.Pattern = "(?:^|,)" & item & "(?=(?:,|$))"
            If re.Execute(cell_str).Count >= repeat_count Then
                s = s & item & ", "
                cell_str = re.Replace(cell_str, "")
            End If
        End If
    Next item
    Set re = Nothing
    If s <> "" Then RepeatN = Left(s, Len(s) - 2)
End Function
Kinh mong bác Siwtom và mọi người giải thích giúp phần ý nghĩa của phần
Pattern="(?:^|,)" & item & "(?=(?:,|$))"
trên. Hiện tại nếu sử dụng
hoặc
thì tôi thấy vẫn ra kết quả.
P/S:Tôi đã hiểu vấn đề, xin mode xóa bài này.
 
Lần chỉnh sửa cuối:
Anh chị giúp em chỉnh sửa lại file này được không ạ nó chỉ có thể gọp file nhưng lại hk thể lọc dữ liệu trùng nhau +-+-+-+


VD : Trong một file em có


宛家=Uyển Gia/Uyển Gia/Uyển Yên

宛某=Uyển mỗ/Uyển Yên/Uyển Yên


宛柔=Uyển Yên/Uyển Yên/Uyển Vũ

(Uyển Vũ/Uyển Yên/Uyển Vũ ) Em chỉ muốn kết quả sẽ là : Uyển Vũ/Uyển Yên )(*^=

Chân thành cảm ơn anh chị
@$@!^%


CombineVP.py


import os

VP_ENTRIES = []
TRUNG_ENTRIES = []
VP_HASH = {}

files = os.listdir('.')
for file in files:
if( not (file.lower().startswith( 'vietphrase') and file.lower().endswith('.txt')) ): continue
f = open( file, 'rb')
data = f.read()[2:]
f.close()
entries =data.split( '\x0d\x00\x0a\x00')
for entry in entries:
items = entry.split( '=\x00' )
if( len (items) < 2 ): continue
trung = items[0]
viet = items[1]
vietItems = viet.split( '|\x00' )
if( VP_HASH.has_key( trung ) ):
index = VP_HASH[ trung ]
currentEntry = VP_ENTRIES[ index ] + vietItems
newVietItems = []
for e in currentEntry:
if( e not in newVietItems ): newVietItems.append( e )
VP_ENTRIES[index] = newVietItems
else:
newVietItems = []
for e in vietItems:
if( e not in newVietItems ): newVietItems.append( e )
VP_ENTRIES.append( newVietItems )
TRUNG_ENTRIES.append( trung )
VP_HASH[trung] = len ( VP_ENTRIES ) - 1

f = open('CombinedVietPhrase.txt', 'wb')
f.write('\xff\xfe')
for i in range(len(VP_ENTRIES)):
if( len( VP_ENTRIES ) == 0 ): continue
f.write( TRUNG_ENTRIES + '=\x00' )
vpEntry = VP_ENTRIES
for j in range(len(vpEntry)-1):
f.write( vpEntry[j] + '|\x00' )
f.write( vpEntry[-1] + '\x0d\x00\x0a\')
f.close()
 
Kính nhờ các a/c giúp em giải quyết một yc sau:
Nếu tên xuất hiện trong cột B của sheet2 mà trùngisteen trong cột B của sheets1 thì tên đó trong sheet 1 đổi màu, hoặc sẽ không được xuất hiện lần 2 trong sheet2 nữa.
Em dang tìm hiểveefeef excel mong các a/c giúp. Xin cảm ơn a/c
 
Em xin phép hỏi chút xíu> VBA em không biết: Nếu cũng mục đích như trên như chuỗi số không có dấu phẩy phân cách thì sửa code trên thế nào cho chạy được ạ. Em có copy về làm theo hướng dẫn mà không ra kết quả. Các thày giúp em với ạ
chuỗi của em là chuỗi số ạ VD A1 = 12356423589765124587952314 > kết quả 1235 ( cũng liền không phân cách ạ)
 
Web KT

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

Back
Top Bottom