Nhờ giúp đỡ tách các ký tự trong một chữ theo điều kiện nhất định (1 người xem)

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

hiepnh1985

Thành viên chính thức
Tham gia
31/8/10
Bài viết
76
Được thích
48
Lâu em không động tới mảng tách ký tự nên giờ mò mãi không ra. Tình hình là em có việc cần phải tách ký tự từ các địa chỉ email có sẵn.

Ví dụ 4 email này:
dinhconghoang@yahoo.com.vn
saotrentroi@gmail.com
trichxongngat@pvc.vn
talaai@hotmail.com.vn

Sau khi tách thì được kết quả:
dinhconghoang
saotrentroi
trichxongngat
talaai

Em gửi file đính kèm để các bác xem cho tiện.
Có thể dùng VBA cũng được nếu phải dùng vì em cũng biết món này.
Các bác nào biết chỉ giúp em với ạ. Em xin cảm ơn nhiều.
 

File đính kèm

lâu em không động tới mảng tách ký tự nên giờ mò mãi không ra. Tình hình là em có việc cần phải tách ký tự từ các địa chỉ email có sẵn.

ví dụ 4 email này:
dinhconghoang@yahoo.com.vn
saotrentroi@gmail.com
trichxongngat@pvc.vn
talaai@hotmail.com.vn

sau khi tách thì được kết quả:
dinhconghoang
saotrentroi
trichxongngat
talaai

em gửi file đính kèm để các bác xem cho tiện.
Có thể dùng vba cũng được nếu phải dùng vì em cũng biết món này.
Các bác nào biết chỉ giúp em với ạ. Em xin cảm ơn nhiều.

PHP:
=left(a2,find("@",a2)-1)
 
Upvote 0
Lâu em không động tới mảng tách ký tự nên giờ mò mãi không ra. Tình hình là em có việc cần phải tách ký tự từ các địa chỉ email có sẵn.

Ví dụ 4 email này:
dinhconghoang@yahoo.com.vn
saotrentroi@gmail.com
trichxongngat@pvc.vn
talaai@hotmail.com.vn

Sau khi tách thì được kết quả:
dinhconghoang
saotrentroi
trichxongngat
talaai

Em gửi file đính kèm để các bác xem cho tiện.
Có thể dùng VBA cũng được nếu phải dùng vì em cũng biết món này.
Các bác nào biết chỉ giúp em với ạ. Em xin cảm ơn nhiều.

vba:
Mã:
Public Function TACH(source)
    Dim s$
        s = source
        With CreateObject("VBscript.regexp")
            .Pattern = ".+(?=@)"
            s = .Execute(s)(0)
        End With
        TACH = s
End Function
 
Upvote 0
Lâu em không động tới mảng tách ký tự nên giờ mò mãi không ra. Tình hình là em có việc cần phải tách ký tự từ các địa chỉ email có sẵn.

Ví dụ 4 email này:
dinhconghoang@yahoo.com.vn
saotrentroi@gmail.com
trichxongngat@pvc.vn
talaai@hotmail.com.vn

Sau khi tách thì được kết quả:
dinhconghoang
saotrentroi
trichxongngat
talaai

Em gửi file đính kèm để các bác xem cho tiện.
Có thể dùng VBA cũng được nếu phải dùng vì em cũng biết món này.
Các bác nào biết chỉ giúp em với ạ. Em xin cảm ơn nhiều.

Nếu xóa trực tiếp trên vùng dữ liệu thì dùng ctrl+H
find what: @*
nhấn replace all
 
Upvote 0
@ Các bác
Cảm ơn các bác nhiều
Em đã làm được rồi. Vậy mà em không biết, gà quá +-+-+-+
 
Upvote 0
vba:
Mã:
Public Function TACH(source)
    Dim s$
        s = source
        With CreateObject("VBscript.regexp")
            .Pattern = ".+(?=@)"
            s = .Execute(s)(0)
        End With
        TACH = s
End Function

chỉ cần viết như vầy
TACH = .Execute(source)(0)
thì không cần đến biến s
Tuy nhiên, code trên không có phần test pattern. Nếu dữ liệu không có "@" thì sẽ bị lỗi.

RegEx là cỗ máy rất nặng. Code này dùng để chơi cho vui thôi chứ chả hiệu quả chút nào.

chỉ cần code giản dị thế này:
Public Function TACH(source)
If InStr(source, "@") Then TACH = Split(source, "@")(0)
End Function
 
Upvote 0
Nếu dùng Reg thì có thể dùng cái sau, khá giản dị dễ hiểu
Mã:
            .Pattern = "@(.*)"
            s = .Replace(s, "$1")
 
Upvote 0
Hàm replace nặng ký hơn hàm execute. Tức là thực ra hàm Replace gọi hàm Execute. Nếu không bị bắt buộc, execute hiệu quả hơn replace.
 
Upvote 0
Nếu là hàm người dùng thì cơ cấu như vầy:
Static RX as Object
If RX is nothing then
set RX = CreateObject("....")
RX.Pattern = "..."
end if
Tach = RX.Execute ... (Hay Replace, gì đó tuỳ ý)

từ khoá static giữ biến lại. Và vì biến được giữ lại nên object không bị huỷ. Nếu hàm này kéo xuống cho cả một cột thì vba cũng chỉ phải gọi hàm CreateObject và gán pattern 1 lần.
nếu dùng biến tự động qua từ khoá with, khi end with thì object bị huỷ. Túc là khi kéo xuống cả cột thì mỗi ô lại có một quá trình tạo và huỷ object.
 
Upvote 0
Đúng là có vấn đề anh ạ, em chưa check đã post đây mà. Như thế này chắc ổn anh nhỉ?
Mã:
            .Pattern = "[B].*[/B]@(.*)"
            s = .Replace(s, "$1")
Hình như tác giả mong muốn lấy phần trước ký tự @
Mình có cảm giác dùng Submatches có cảm giác sẽ tốn tài nguyên hơn !
 
Upvote 0
Hình như tác giả mong muốn lấy phần trước ký tự @
Mình có cảm giác dùng Submatches có cảm giác sẽ tốn tài nguyên hơn !
Nếu trước thì có thể dùng cái sau, cũng tương tự mà bạn
Mã:
            .Pattern = "(.*)@.*"
            s = .Replace(s, "$1")
Cái vụ tốn tài nguyên chắc mình chưa có tìm hiểu đến, khi nào viết các ứng dụng "tầm cỡ" lúc đó chắc sẽ tìm hiểu sau vậy, giờ tạm thời dùng cách truyền thống để xử lý dữ liệu trên Excel, tốc độ chậm hơn hay tốn tốn một chút chắc người dùng vẫn chưa cảm nhận được.
 
Upvote 0
Mấy cái object của vbscript đâu có phải là "truyền thống".

nếu chạy thử hàm trong cửa sổ immediate sẽ thấy lần đầu tiên hàm load lâu hơn các lần sau một chút. Đó là do vba phải load cái phần mêm sử lý regex từ vbscript. Các lần sau, phần mềm này có sẵn trong bộ nhớ cho nên nó không cần load nữa.

do vậy, dùng cái regex trong hàm tự tạo sẽ làm chậm bảng tính.

submatches chỉ là cách lấy phần tử của collection hoặc mảng. Nó không ảnh hưởng đến tài nguyên máy. Trong kỹ thuật sử lý chuỗi, replace là một trong những hàm tốn tài nguyên. Nó gồm hàm search, lấy ra collection kết quả, sau đó là cắt chuỗi, nhét phần thay thế vào, và tạo chuỗi mới. Execute chỉ search và lấy collection kết quả thôi.
 
Upvote 0
Lâu em không động tới mảng tách ký tự nên giờ mò mãi không ra. Tình hình là em có việc cần phải tách ký tự từ các địa chỉ email có sẵn.

Ví dụ 4 email này:
dinhconghoang@yahoo.com.vn
saotrentroi@gmail.com
trichxongngat@pvc.vn
talaai@hotmail.com.vn

Sau khi tách thì được kết quả:
dinhconghoang
saotrentroi
trichxongngat
talaai
=TRIM(LEFT(SUBSTITUTE(A2,"@", REPT(" ",255)),255))
góp vui thêm 1 cách
 
Upvote 0

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

Back
Top Bottom