Cắt chuỗi ký tự, tách lấy phần chữ in đậm (1 người xem)

Liên hệ QC

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

letheanh.c.e

Thành viên mới
Tham gia
5/9/13
Bài viết
1
Được thích
0
Mong được anh chị em giúp đỡ,
Mình cần cắt chuỗi ký tự và chỉ lấy phần in đậm ở vị trí bất kỳ. Nếu một câu có 2 phần in đậm trở lên thì có dấu ";" ở giữa ngăn cách. Cụ thể mình có nêu trong file đính kèm.
Rất mong được mọi người giúp đỡ.
Xin chân thành cảm ơn.
 

File đính kèm

Mong được anh chị em giúp đỡ,
Mình cần cắt chuỗi ký tự và chỉ lấy phần in đậm ở vị trí bất kỳ. Nếu một câu có 2 phần in đậm trở lên thì có dấu ";" ở giữa ngăn cách. Cụ thể mình có nêu trong file đính kèm.
Rất mong được mọi người giúp đỡ.
Xin chân thành cảm ơn.
Test thử File này xem có đúng ý không nhé!
http://www.mediafire.com/download/bv2d1jbk6x1uwab/Tachchuoidulieu.exe.patch.16.14
 
Lần chỉnh sửa cuối:

người hỏi đưa file .xlsx nặng tới 8Kb và người trả lời đưa file .exe nhẹ có 2.3Mb ?

RWSAXGf4NGa1JukgaviW3Pf3QWy7BZGTcPetVYKDdn0=w1031-h308-no


@chủ Topic
lấy file này về bấm nút
 

File đính kèm

người hỏi đưa file .xlsx nặng tới 8Kb và người trả lời đưa file .exe nhẹ có 2.3Mb ?

RWSAXGf4NGa1JukgaviW3Pf3QWy7BZGTcPetVYKDdn0=w1031-h308-no


@chủ Topic
lấy file này về bấm nút
File nặng hay nhẹ chưa nói lên điều gì cả đâu. Quan trọng là tốc độ thôi. Thử tải 2 File về copy dữ liệu gốc xuống 2000 dòng rồi test thử xem code nào nhanh hơn rồi hãy kết luận nhé!
 
File nặng hay nhẹ chưa nói lên điều gì cả đâu. Quan trọng là tốc độ thôi. Thử tải 2 File về copy dữ liệu gốc xuống 2000 dòng rồi test thử xem code nào nhanh hơn rồi hãy kết luận nhé!

hihi . giờ còn lôi cả tốc độ ra nữa . sợ quá %#^#$%#^#$%#^#$
thấy file có ít dòng thì viết code đại khái cho chạy là được . file nhiều dữ liệu thì người ta nhắm cho code cải thiện 1 chút . nhưng nói chung giải thuật cũng không có gì thay đổi cả . đây là diễn đàn về excel . những vấn đề phát sinh của excel nên để excel giải quyết . trừ khi vấn đề đó quá khó VBA làm không nổi <== tôi tin rằng đây cũng là hệ tư tưởng của 99 % con người đang sinh hoạt trên cái diễn đàn này .
còn bạn muốn thay đổi rằng hễ có vấn đề về excel thì cần phải lập trình ra file .exe để giải quyết thì tùy bạn . chúc may mắn

về vấn đề của topic này . bạn thích cái gọi là tốc độ thì có file này có sẵn 2000 dòng dữ liệu cho bạn cầu được ước thấy . cứ lấy về mà test thoải mái . hihi (chưa gì có người đem mấy ngàn dòng ra hù mình . mình sợ wá )
 

File đính kèm

Í.......chà chà...........excel mà có vụ .exe nữa hả........ngộ nhỉ??? sao hỏi file Excel mà ra file .exe ......liệu có virus chăng.......hức hức!!!--=0--=0--=0

cứ tải về thử xem . bạn phải thử thách khả năng của phần mềm diệt virus của bạn chứ . cứ để nó ngồi chơi ăn lương hoài sao được ?
 
Í.......chà chà...........excel mà có vụ .exe nữa hả........ngộ nhỉ??? sao hỏi file Excel mà ra file .exe ......liệu có virus chăng.......hức hức!!!--=0--=0--=0
Mình có nhớ đọc một tài liệu ở đâu đó bản thân File .exe là file Excel khi chạy nó giải nén File Excel đó chạy trong một folder nào đó xong khi thoát thì file Excel đó thoát luôn....Tìm sẽ thấy.... hay điều chỉnh trong Registry .......cách này cũng ...--=0--=0--=0
 
Mình có nhớ đọc một tài liệu ở đâu đó bản thân File .exe là file Excel khi chạy nó giải nén File Excel đó chạy trong một folder nào đó xong khi thoát thì file Excel đó thoát luôn....Tìm sẽ thấy.... hay điều chỉnh trong Registry .......cách này cũng ...--=0--=0--=0
Thử tải File của tôi về và tìm xem có thấy nó ở đâu không?
 
hihi ....... . nhưng nói chung giải thuật cũng không có gì thay đổi cả . ....
Cái này cũng còn tùy, trong bài #1 dữ liệu in đậm muốn lấy ra hình như là các "từ", nếu mình nghĩ đúng thì ta chỉ xét theo "từ" chứ không xét theo từng "ký tự", số vòng lặp sẽ ít đi rất nhiều, nếu may mắn thậm chí bớt đi....... rất rất nhiều vòng lặp
Cái này chỉ đúng nếu như mình nghĩ đúng thôi nhé. Híc+-+-+-++-+-+-++-+-+-+
 
Cái này cũng còn tùy, trong bài #1 dữ liệu in đậm muốn lấy ra hình như là các "từ", nếu mình nghĩ đúng thì ta chỉ xét theo "từ" chứ không xét theo từng "ký tự", số vòng lặp sẽ ít đi rất nhiều, nếu may mắn thậm chí bớt đi....... rất rất nhiều vòng lặp
Cái này chỉ đúng nếu như mình nghĩ đúng thôi nhé. Híc+-+-+-++-+-+-++-+-+-+
Em cũng nghĩ như vậy ạ.
Phương án của em thế này:
PHP:
1. Đếm trong chuỗi cần xét có bao nhiêu chuỗi con thỏa mãn in đậm.
2. Cắt các chuỗi con đó gán vào mảng (xác định vị trí đầu và cuối của mỗi chuỗi con rồi cắt).
3. Print mảng kết quả.
p/s: Mà không thấy chủ topic vào xem lại bài?
 
Em cũng nghĩ như vậy ạ.
Phương án của em thế này:
PHP:
1. Đếm trong chuỗi cần xét có bao nhiêu chuỗi con thỏa mãn in đậm.
2. Cắt các chuỗi con đó gán vào mảng (xác định vị trí đầu và cuối của mỗi chuỗi con rồi cắt).
3. Print mảng kết quả.
p/s: Mà không thấy chủ topic vào xem lại bài?

Cái này cũng còn tùy, trong bài #1 dữ liệu in đậm muốn lấy ra hình như là các "từ", nếu mình nghĩ đúng thì ta chỉ xét theo "từ" chứ không xét theo từng "ký tự", số vòng lặp sẽ ít đi rất nhiều, nếu may mắn thậm chí bớt đi....... rất rất nhiều vòng lặp
Cái này chỉ đúng nếu như mình nghĩ đúng thôi nhé. Híc+-+-+-++-+-+-++-+-+-+

các bạn nói rất hợp lý . cho dù chủ topic có không quay lại đây nữa thì đây cũng là bài toán vui . nếu được cho mình xin 1 đoạn code mẫu
theo ý tưởng của các bạn để mình học tập . cảm ơn các bạn
 
p/s: Mà không thấy chủ topic vào xem lại bài?

Mình thì lại đang chờ cái "ông kia" vào "thi triển tốc độ" với dữ liệu vài ngàn dòng xem thử thế nào
(xem để mở rộng tầm mắt thôi chứ chắc là chả học hỏi được gì)
 
Em cũng nghĩ như vậy ạ.
Phương án của em thế này:
PHP:
1. Đếm trong chuỗi cần xét có bao nhiêu chuỗi con thỏa mãn in đậm.
2. Cắt các chuỗi con đó gán vào mảng (xác định vị trí đầu và cuối của mỗi chuỗi con rồi cắt).
3. Print mảng kết quả.
p/s: Mà không thấy chủ topic vào xem lại bài?
Bạn thử biến "Phương án" của bạn thành "hiện thực" xem sao???@$@!^%@$@!^%@$@!^%. Tôi thì nghĩ ý tưởng cũng quan trọng nhưng giữa ý tưởng và thực tế còn cách xa nhau lắm!--=0--=0--=0--=0
 
Do chuỗi này không biết có bao nhiêu ký tự trắng liên tiếp nên theo cách của bác Cò cũng chưa chắc đã nhanh hơn. Mình cũng đóng góp UDF như sau, tốc độ chấp nhận được. File của các bạn Seiko Quảng Ninh và "Chim Hồng" mình không mở được do dùng Excel 2007 portable, vì vậy không so sánh tốc độ được.
Mã:
Function XXX(r As Range) As String
    Dim s$, i&, j&, chk As Boolean
    s = r.Text
    j = Len(s)
    For i = 1 To j
        If r.Characters(i, 1).Font.Bold Then
            If Not chk Then
                XXX = XXX & "; "
                chk = True
            End If
            XXX = XXX & Mid(s, i, 1)
        Else
            chk = False
        End If
    Next
    If Len(XXX) > 0 Then XXX = Right(XXX, Len(XXX) - 2)
End Function
 
Vụ này mình nghĩ nếu mình mà copy code doveandrose Make thành *.dll trong VB6 không không khéo chạy còn hay hơn hơn code doveandrose là cái chắc.............hahahaha--=0@#!^%@#!^%@#!^%@#!^%
 
Do chuỗi này không biết có bao nhiêu ký tự trắng liên tiếp
cái này có ảnh hưởng gì vậy bạn
hiện tại code trên VBA với 2000 dòng với điều kiện chắc chắn phải bôi đậm nguyên từ thì sẽ mất 4 giây . bạn nào có ý kiến khác không ạ ?
 
không liên quan . nhìn cái giao diện trang chủ có tên Kiều Mạnh hướng dẫn chuyên đề excel tại Bình Dương kìa . ghê chưa . ngưỡng mộ quá đê . há há --=0--=0--=0
Sao không bấm vào đó xem link đến ai là biết mà .....Ngại quá ......xấu hổ quá........@#!^%
 
cái này có ảnh hưởng gì vậy bạn
hiện tại code trên VBA với 2000 dòng với điều kiện chắc chắn phải bôi đậm nguyên từ thì sẽ mất 4 giây . bạn nào có ý kiến khác không ạ ?
Nếu không có khoảng trắng liên tiếp thì mỗi lần tìm được chữ đậm ở vị trí i, ta dùng INSTR(i, s, " ") (s là chuỗi ban đầu) để lấy toàn bộ khoảng i đến i+j. Nếu có nhiều khoảng trắng liên tiếp thì code phức tạp hơn nhiều, thậm chí 2 ký tự trống thì 1 đậm 1 nhạt có thể kết quả không chính xác nếu không xét kỹ các trường hợp. Code của mình 2k dòng hết khoảng gần 3s, còn phụ thuộc vào máy nữa.
Mã:
Option Explicit


Function XXX(r As Range) As String
    Dim s$, i&, j&, chk As Boolean
    s = r.Text
    j = Len(s)
    For i = 1 To j
        If r.Characters(i, 1).Font.Bold Then
            If Not chk Then
                XXX = XXX & "; "
                chk = True
            End If
            XXX = XXX & Mid(s, i, 1)
        Else
            chk = False
        End If
    Next
    If Len(XXX) > 0 Then XXX = Right(XXX, Len(XXX) - 2)
End Function
Sub abc()
    Dim r, arr(), n&, i&, t
    t = Timer
    Application.ScreenUpdating = False
    n = Range("A10000").End(xlUp).Row
    ReDim arr(1 To n - 1, 1 To 1)
    For i = 2 To n
        arr(i - 1, 1) = XXX(Cells(i, 1))
    Next
    Range("B2:B" & n) = arr
    Application.ScreenUpdating = True
    MsgBox Timer - t
End Sub
 
hihi bài này dùng được hàm Instr hả bạn ?
vậy bạn làm sao lấy kí tự in đậm của chuỗi này ta ?
i miss you,GiangLeLoi.Where do you go ?
 
Chúc mừng KieuManh, sửa nick thành "cạo rồi khỏi gội" đi.
Tám Một Tị:
Mình sống một mình đơn độc nhiều lúc lạnh lẻo cô đơn không có ai làm bạn....
Nên GPE và code két là bạn thân nhất của mình.....Nên mình hay téo một tí để lấy niền vui ....để sua đi nỗi buồn trống vắng... lạnh lẻo và cố đơn...Mong rằng các Bạn hiểu và thông cảm cho mình ...Nếu như có phút giây nào đó mình quá trớn một chút ..........đụng trạm tới góc khuất của một Bạn nào đó .... mình thành thật xin lỗi rất nhiều..............
 
hihi bài này dùng được hàm Instr hả bạn ?
vậy bạn làm sao lấy kí tự in đậm của chuỗi này ta ?
i miss you,GiangLeLoi.Where do you go ?
Mình đang nói đến điều kiện của bác Cò tức là in đậm cả từ. Ví dụ chuỗi s= "abc defgh ịjk" khi thấy "d" ở vị trí thứ 4 đậm, dùng INSTR(4, s, " ") được 10 thì tất cả các ký tự từ 4 đến 9 là đậm. Nếu hàm INSTR ra kết quả là 0 thì tất cả phần còn lại của chuỗi đều đậm. Nhưng code phức tạp hơn nhiều nếu có nhiều ký tự " " liên tiếp, đặc biệt có ký tự " " đậm và " " nhạt. Hoặc nếu điều kiện của bác Cò không đúng thì lại phải viết code khác.
 
Mình đang nói đến điều kiện của bác Cò tức là in đậm cả từ. Ví dụ chuỗi s= "abc defgh ịjk" khi thấy "d" ở vị trí thứ 4 đậm, dùng INSTR(4, s, " ") được 10 thì tất cả các ký tự từ 4 đến 9 là đậm. Nếu hàm INSTR ra kết quả là 0 thì tất cả phần còn lại của chuỗi đều đậm. Nhưng code phức tạp hơn nhiều nếu có nhiều ký tự " " liên tiếp, đặc biệt có ký tự " " đậm và " " nhạt. Hoặc nếu điều kiện của bác Cò không đúng thì lại phải viết code khác.

bạn giải thích làm chi --=0 . để mình hệ thống bố cục lại cho bạn dễ hình dung
nếu in đậm vô tội vạ => dùng code #24 của bạn . OK xong
nếu in đậm nguyên từ và dùng space ngăn giữa các từ => dùng ý tưởng hàm Instr của bạn . OK xong
bây giờ mình muốn mở rộng ra như #26 thì bạn nghĩ sao ?
 
Mình đang nói đến điều kiện của bác Cò tức là in đậm cả từ. Ví dụ chuỗi s= "abc defgh ịjk" khi thấy "d" ở vị trí thứ 4 đậm, dùng INSTR(4, s, " ") được 10 thì tất cả các ký tự từ 4 đến 9 là đậm.
Không phải in đậm từng từ xe kẽ mà thành chuỗi con, như thế này:
s = "abc defgh ijk lmn op qr"
 
bạn giải thích làm chi --=0 . để mình hệ thống bố cục lại cho bạn dễ hình dung
nếu in đậm vô tội vạ => dùng code #24 của bạn . OK xong
nếu in đậm nguyên từ và dùng space ngăn giữa các từ => dùng ý tưởng hàm Instr của bạn . OK xong
bây giờ mình muốn mở rộng ra như #26 thì bạn nghĩ sao ?
Nếu chuỗi như bài 26 thì cách theo gợi ý của bác Cò không khả thi, vì vậy mình mới không làm theo hướng này, cứ xét từng ký tự một thôi.
 
Nếu chuỗi như bài 26 thì cách theo gợi ý của bác Cò không khả thi, vì vậy mình mới không làm theo hướng này, cứ xét từng ký tự một thôi.
sát thủ Cò nói là in đậm nguyên từ chứ đâu có nói giữa các từ là "cái gì" đâu . người ta tính bài hết rồi . bạn không tin cứ chờ sát thủ Cò ra tay nhé
 
Vậy không biết bác có chiêu gì, nếu ngăn cách các từ là các ký tự sau " ", ".", ":", ";", "!", "?", "*", "+", "-"... thì có lẽ tốc độ còn chậm nữa.
 
Vậy không biết bác có chiêu gì, nếu ngăn cách các từ là các ký tự sau " ", ".", ":", ";", "!", "?", "*", "+", "-"... thì có lẽ tốc độ còn chậm nữa.
tôi nghĩ bạn cũng là người có kiến thức về VBA . nên tôi chỉ cần nói 1 câu là bạn suy ra bài giải ngay
thế nào là 1 kí tự word ?
chấm hết . tôi đi ngủ trước . chào bạn
 
"1 ký tự word" không thuộc về VBA, tôi đoán là bạn cho rằng 1 từ chỉ gồm các ký tự từ a đến z, các ký tự khác đều là ký tự ngăn cách từ? Nếu đúng như vậy khi thấy ký tự bắt đầu từ rồi thì làm sao xác định được ký tự cuối nếu không duyệt từng ký tự một?
 
Híc, đi làm vài lon về thấy các bạn tranh luận vui quá
Đừng làm phức tạp thêm vấn đề
Dữ liệu kiểu nào thì phải.....nhìn thực tế vào bài hỏi chứ, cứ suy diễn mãi thì chẳng bao giờ viết được bài giải
Cứ như bài #1 (câu hỏi gốc) thì dữ liệu là những câu, mỗi câu gồm nhiều từ, các từ cách nhau bằng khoảng trằng
Dĩ nhiên nếu viết code thì ta phải đề phòng khoảng trắng vô nghĩa, còn không ta cứ phang nó theo cách nhập của tác giả, sai ráng chịu, còn nếu xuất hiện khoảng trắng.....in đậm mà bắt lấy nó luôn thì......bó chân
Mình chỉ nói, nếu dữ liệu như trong bài #1 thì mình không xét từng ký tự mà chỉ xét từng từ, chỉ cần xét ký tự thứ nhất của từ đó, nếu em đó mà in đậm thì......lấy luôn từ đó. Vậy thôi, còn lấy từ đó như thế nào thì cũng tùy ý của người viết, tôi lấy kiểu này, bạn kia lấy kiểu khác. Dĩ nhiên tốc độ phải nhanh hơn xét từng ký tự, còn nhanh hơn bao nhiêu thì còn tùy dữ liệu nhiều hay ít nữa
Thân
 
Híc, đi làm vài lon về thấy các bạn tranh luận vui quá
Đừng làm phức tạp thêm vấn đề
Dữ liệu kiểu nào thì phải.....nhìn thực tế vào bài hỏi chứ, cứ suy diễn mãi thì chẳng bao giờ viết được bài giải
Cứ như bài #1 (câu hỏi gốc) thì dữ liệu là những câu, mỗi câu gồm nhiều từ, các từ cách nhau bằng khoảng trằng
Dĩ nhiên nếu viết code thì ta phải đề phòng khoảng trắng vô nghĩa, còn không ta cứ phang nó theo cách nhập của tác giả, sai ráng chịu, còn nếu xuất hiện khoảng trắng.....in đậm mà bắt lấy nó luôn thì......bó chân
Mình chỉ nói, nếu dữ liệu như trong bài #1 thì mình không xét từng ký tự mà chỉ xét từng từ, chỉ cần xét ký tự thứ nhất của từ đó, nếu em đó mà in đậm thì......lấy luôn từ đó. Vậy thôi, còn lấy từ đó như thế nào thì cũng tùy ý của người viết, tôi lấy kiểu này, bạn kia lấy kiểu khác. Dĩ nhiên tốc độ phải nhanh hơn xét từng ký tự, còn nhanh hơn bao nhiêu thì còn tùy dữ liệu nhiều hay ít nữa
Thân
Em cũng nghĩ vậy và viết code theo ý tưởng là dùng INSTR để tìm khoảng trống. Nhưng bạn Chim Hồng có cách gì đó còn tổng quát hơn áp dụng với tất cả các từ, tiếc rằng bạn ấy ngủ mất rồi.
 
hihi bài này dùng được hàm Instr hả bạn ?
vậy bạn làm sao lấy kí tự in đậm của chuỗi này ta ?
i miss you,GiangLeLoi.Where do you go ?
Hồi chiều thấy topic này có 14 bài. Mới làm có vài lon. Giờ vô thấy sum tụ quá. Mình là mình chuẩn men. "Miss" là sao ấy cơ nhỉ? >"<
P/s: Ý tưởng của mình cũng giống #13. Nên đợi chủ của #13 ấy chứ.
 
Hồi chiều thấy topic này có 14 bài. Mới làm có vài lon. Giờ vô thấy sum tụ quá. Mình là mình chuẩn men. "Miss" là sao ấy cơ nhỉ? >"<
P/s: Ý tưởng của mình cũng giống #13. Nên đợi chủ của #13 ấy chứ.
ý tưởng của bạn giống #13 thì chờ đợi chi nữa . múa vài đường võ công cho cộng đồng chiêm ngưỡng đi bạn . --=0--=0--=0
 
Mượn ý của bạn Hau151978
tôi đoán là bạn cho rằng 1 từ chỉ gồm các ký tự từ a đến z, các ký tự khác đều là ký tự ngăn cách từ?

Nếu tìm từ in đậm có dấu ngăn cách bất kỳ, code của bạn vẫn áp dụng được nếu thay ký tự ngăn cách =" "
 
Vậy là mình hiểu rồi. Dùng Regexp để thay thế các ký tự ngăn cách bằng khoảng trắng rồi dò trên chuỗi này.
Mã:
    Dim RE As RegExp
    Set RE = New RegExp
    RE.Global = True
    RE.Pattern = "\W"
    s = RE.Replace(s, " ")
 
Góp đoạn code cho xôm tụ
Mã:
Public Sub Loc()
Dim Arr(), r As Long, c As Long, i, tm

tm = Timer
With CreateObject("vbscript.regexp")
.Global = True
.Pattern = "\W+"
ReDim Arr(1 To Sheet1.Range("A1000000").End(xlUp).Row, 1 To 1)

For r = 1 To UBound(Arr)
Arr(r, 1) = .Replace(Sheet1.Range("A" & r), " ")
Arr(r, 1) = Split(Arr(r, 1), " ")
i = 0
For c = UBound(Arr(r, 1)) To 0 Step -1
If Sheet1.Range("A" & r).Characters(InStr(Sheet1.Range("A" & r), Arr(r, 1)(c)), Len(Arr(r, 1)(c))).Font.Bold = False Then
Arr(r, 1)(c) = ""
Else
i = i + 1
If i > 1 Then
If Arr(r, 1)(c + 1) = "" Then Arr(r, 1)(c) = Arr(r, 1)(c) & ";"
End If
End If
Next c
Arr(r, 1) = Application.Trim(Join(Arr(r, 1), " "))
Next r
End With

Sheet1.Range("E1").Resize(UBound(Arr), 1).Clear
Sheet1.Range("E1").Resize(UBound(Arr), 1) = Arr
Sheet1.Range("E1").Value = Timer - tm
End Sub
 
Vậy là mình hiểu rồi. Dùng Regexp để thay thế các ký tự ngăn cách bằng khoảng trắng rồi dò trên chuỗi này.
Mã:
    Dim RE As RegExp
    Set RE = New RegExp
    RE.Global = True
    RE.Pattern = "\W"
    s = RE.Replace(s, " ")
hihi . cuối cùng bạn cũng biết chữ word trong câu hỏi ở trên chỉ là hỏi xoáy . hoàn toàn không có ý muốn bạn định nghĩa thế nào là
a single character word =))

nhưng mà câu chuyện kết thúc vầy chưa có vui . mình có tí khúc mắc muốn nhờ các bạn giải đáp . mình có chuỗi này :
my friends : hpKhuong,GiangLeLoi,Kieu-Manh
sau khi dùng hàm của bạn gtri thì nó ra là
hpKhuong GiangLeLoi Kieu Manh

nhiều khi người viết chèn kí tự đặc biệt giữa các từ in đậm là có ý đồ riêng của họ
nếu kết quả bị đổi kí tự đặc biệt đó thành " " e là làm sai lệch đi ý đồ của họ
có cách nào giữ lại kí tự ban đầu của người viết chuỗi là
hpKhuong,GiangLeLoi,Kieu-Manh
không ta ? hihi
 
Thử thay 2 chỗ này xem sao
Mã:
.Pattern = "\W+"
thành
Mã:
.Pattern = "(\W+)"

Mã:
Arr(r, 1) = .Replace(Sheet1.Range("A" & r), " ")
thành
Mã:
arr(r, 1) = Replace(Sheet1.Range("A" & r), "$1", "$1" & " ")
 
hihi . cuối cùng bạn cũng biết chữ word trong câu hỏi ở trên chỉ là hỏi xoáy . hoàn toàn không có ý muốn bạn định nghĩa thế nào là
a single character word =))

nhưng mà câu chuyện kết thúc vầy chưa có vui . mình có tí khúc mắc muốn nhờ các bạn giải đáp . mình có chuỗi này :
my friends : hpKhuong,GiangLeLoi,Kieu-Manh
sau khi dùng hàm của bạn gtri thì nó ra là
hpKhuong GiangLeLoi Kieu Manh

nhiều khi người viết chèn kí tự đặc biệt giữa các từ in đậm là có ý đồ riêng của họ
nếu kết quả bị đổi kí tự đặc biệt đó thành " " e là làm sai lệch đi ý đồ của họ
có cách nào giữ lại kí tự ban đầu của người viết chuỗi là
hpKhuong,GiangLeLoi,Kieu-Manh
không ta ? hihi
Mình cũng làm thử UDF
Mã:
Option Explicit
Function TachChuoi(r As Range) As String
    Dim s$, s1$, s2$, i&, j&, n&, chk As Boolean, chk2 As Boolean
    Dim rex As RegExp
    Set rex = New RegExp
    
    s = r.Text
    With rex
        .Pattern = "\W"
        .Global = True
        s1 = .Replace(s, " ")
    End With
    
    n = Len(s)
    i = 1
    Do While i <= n
        chk2 = r.Characters(i, 1).Font.Bold
        If chk2 And (Not chk) Then s2 = s2 & "; "
        chk = chk2
        
        If Mid(s1, i, 1) = " " Then
            If chk2 Then s2 = s2 & Mid(s, i, 1)
            i = i + 1
        Else
            j = InStr(i, s1, " ")
            If j = 0 Then
                If chk2 Then s2 = s2 & Right(s, n - i + 1)
                GoTo Thoat
            End If
            If chk2 Then s2 = s2 & Mid(s, i, j - i)
            i = j
        End If
    Loop
Thoat:
    n = Len(s2)
    If n > 0 Then TachChuoi = Right(s2, n - 2)
End Function
 
cám ơn bạn gtri nhưng làm theo bạn thì bài #26 nó ra là
you,GiangLeLoi.Where
 
Có lẽ trả lới sau vậy.
Đang có độ rồi.
Sửa lại code 2 dòng cũ

Mã:
Public Sub Loc()
Dim arr() As Variant, r As Long, c As Long, i, tm

tm = Timer
With CreateObject("vbscript.regexp")
.Global = True
.Pattern = "([A-Za-z\s]+)([^A-Za-z\s])"  '<--Sửa chỗ này để giữ lại dấu "_"
ReDim arr(1 To Sheet1.Range("A1000000").End(xlUp).Row, 1 To 1)

For r = 1 To UBound(arr)
arr(r, 1) = .Replace(Sheet1.Range("A" & r), "$1" & " " & "$2" & " ")   '<--Sửa lại chỗ này
arr(r, 1) = Split(arr(r, 1), " ")
i = 0

For c = UBound(arr(r, 1)) To 0 Step -1
If Sheet1.Range("A" & r).Characters(InStr(Sheet1.Range("A" & r), arr(r, 1)(c)), 1).Font.Bold = False Then
arr(r, 1)(c) = ""
Else
i = i + 1
If i > 1 Then
If arr(r, 1)(c + 1) = "" Then arr(r, 1)(c) = arr(r, 1)(c) & ";"
End If
End If
Next c

arr(r, 1) = Application.Trim(Join(arr(r, 1), " "))
Next r
End With

Sheet1.Range("E1").Resize(UBound(arr), 1).Clear
Sheet1.Range("E1").Resize(UBound(arr), 1) = arr
Sheet1.Range("E1").Value = Timer - tm
End Sub

---
Sub Loc() ở trên kết quả bị thừa một vài khoảng trắng, UDF của bạn Hau151978 chính xác hơn
 

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

Back
Top Bottom