Tách và chuyển chuỗi ký tự như mong muốn

Liên hệ QC

minhtri.luunguyen

Thành viên mới
Tham gia
6/1/13
Bài viết
3
Được thích
0
_Chào mọi người ! Mình gặp một bài toán về tách chuỗi như thế này, mong mọi người giúp mình.

Cụ thể là sẽ chuyển một chuỗi có dạng như:

Truong.Cong.Tuan@gmail.com sang TuanTC@gmail.com
Nguyen.Van.Toan@gmail.com sang ToanNV@gmail.com
Mai.Phuong.Thuy@gmail.com sang ThuyMP@gmail.com

mình đưa ra 3 ví dụ trên chắc mọi người cũng hiểu ý mình. Mong mọi người giúp đỡ.
 

File đính kèm

  • TachChuoi.xls
    6.5 KB · Đọc: 15
_Chào mọi người ! Mình gặp một bài toán về tách chuỗi như thế này, mong mọi người giúp mình.

Cụ thể là sẽ chuyển một chuỗi có dạng như:

Truong.Cong.Tuan@gmail.com sang TuanTC@gmail.com
Nguyen.Van.Toan@gmail.com sang ToanNV@gmail.com
Mai.Phuong.Thuy@gmail.com sang ThuyMP@gmail.com

mình đưa ra 3 ví dụ trên chắc mọi người cũng hiểu ý mình. Mong mọi người giúp đỡ.
Một cách giải bằng VBA
Mã:
Public Function Tach(Cll)
    Dim Re, ReTim, I, GhepA, GhepB, Thay
    Set Re = CreateObject("vbscript.regexp")
        With Re
            .Global = True
            .Pattern = "@.*$"
            Set ReTim = .Execute(Cll)
            GhepA = ReTim.Item(0).Value
            Thay = .Replace(Cll, "")
                .Pattern = "[A-Za-z]+"
                Set ReTim = .Execute(Thay)
                GhepB = ReTim.Item(ReTim.Count - 1).Value
                    For I = 0 To ReTim.Count - 2
                        GhepB = GhepB & Left(ReTim.Item(I), 1)
                    Next I
        End With
    Tach = GhepB & GhepA
End Function
Thân
 

File đính kèm

  • TachChuoi.xls
    29 KB · Đọc: 21
_Chào mọi người ! Mình gặp một bài toán về tách chuỗi như thế này, mong mọi người giúp mình.

Cụ thể là sẽ chuyển một chuỗi có dạng như:

Truong.Cong.Tuan@gmail.com sang TuanTC@gmail.com
Nguyen.Van.Toan@gmail.com sang ToanNV@gmail.com
Mai.Phuong.Thuy@gmail.com sang ThuyMP@gmail.com

mình đưa ra 3 ví dụ trên chắc mọi người cũng hiểu ý mình. Mong mọi người giúp đỡ.

nếu muốn xài công thức thì xem đây :
 

File đính kèm

  • TachChuoi.xls
    21 KB · Đọc: 109
_Chào mọi người ! Mình gặp một bài toán về tách chuỗi như thế này, mong mọi người giúp mình.

Cụ thể là sẽ chuyển một chuỗi có dạng như:

Truong.Cong.Tuan@gmail.com sang TuanTC@gmail.com
Nguyen.Van.Toan@gmail.com sang ToanNV@gmail.com
Mai.Phuong.Thuy@gmail.com sang ThuyMP@gmail.com

mình đưa ra 3 ví dụ trên chắc mọi người cũng hiểu ý mình. Mong mọi người giúp đỡ.

Tham gia tí.

[GPECODE=vb]
Public Function ReduceEmail(cell)
Dim objRe, s1 As String, s2 As String, index As Long
index = InStr(1, cell, "@")
index = InStrRev(cell, ".", index)
s1 = Mid(cell, index + 1)
s2 = Left(cell, index)
Set objRe = CreateObject("VBScript.RegExp")
With objRe
.Global = True
.Pattern = "\B[A-Za-z]+."
s2 = .Replace(s2, "")
End With
ReduceEmail = Replace(s1, "@", s2 & "@")
End Function
[/GPECODE]

-----------------

to Good-Luck:

Theo tôi hiểu nếu có "Truong.Cong.Tuan@gmail.com" thì yêu cầu kết quả trả về phải là: "TuanTC@gmail.com"

công thức của bạn trả về "Tuan.TC@gmail.com"

Ngoài ra nếu e-mail là "Ton.Nu.Thi.Ninh@yahoo.com.vn" thì công thức trả về là:

Thi.Ninh.TN@yahoo.com.vn

Trong khi kết quả đúng phải là: "NinhTNT@yahoo.com.vn"

Đấy là tên có 4 từ. Ở Việt nam có tên nào 5, 6 từ không nhỉ?
 

File đính kèm

  • ReduceEmail.rar
    71.2 KB · Đọc: 17
Tham gia tí.

[GPECODE=vb]
Public Function ReduceEmail(cell)
Dim objRe, s1 As String, s2 As String, index As Long
index = InStr(1, cell, "@")
index = InStrRev(cell, ".", index)
s1 = Mid(cell, index + 1)
s2 = Left(cell, index)
Set objRe = CreateObject("VBScript.RegExp")
With objRe
.Global = True
.Pattern = "\B[A-Za-z]+."
s2 = .Replace(s2, "")
End With
ReduceEmail = Replace(s1, "@", s2 & "@")
End Function
[/GPECODE]

Em thắc mắc cái .Pattern của anh
Em thay thử .Pattern = "[^A-Z]" cũng đã chạy êm rồi mà.
 
Em thắc mắc cái .Pattern của anh
Em thay thử .Pattern = "[^A-Z]" cũng đã chạy êm rồi mà.

1. pattern có thể viết theo nhiều kiểu
2. Mình là người viết code, chỗ nào "bắt buộc" phải như thế như thế (nhất là những dữ liệu số dùng cho tính toán) thì dĩ nhiên không thể nhân nhượng được. Nhưng có những chỗ về mặt tính toán có thể chấp nhận được thì không nên khắt khe quá. Có phải dữ liệu lúc nào cũng chuẩn 100% đâu. Người nhập có thể sơ ý, do mệt mỏi, "xỉn xỉn". Con người mà. Tôi cũng đã gặp nhiều cột họ tên mà ở đâu đó ký tự đầu của tên đệm là chữ thường trong khi ở các phần còn lại là chữ hoa.
Hải thử sửa một chữ cái đầu hoặc tất cả các chữ cái đầu thành thường thì sẽ thấy code không chạy êm nữa.
Mà trường hợp tất cả các chữ cái đều thường là thường gặp ở e-mail.
Tóm lại nếu chấp nhận được thì nên viết code "chịu" được sơ suất, lường cả th dữ liệu không được chuẩn lắm.
Tất nhiên nếu dữ liệu có cả chữ số hoặc dạng hoàn toàn khác thì phải viết lại code rồi. Giúp người ta trong th sơ ý cũng chỉ có mức độ mà thôi.
 
Chuỗi email dạng nó cũng khá ổn định rồi. Chỉ cần dùng hàm split căn bản là được. Không cần phải regex cho khó hiểu.

Nguyên tắc:
- tách rời phần trước và sau dấu @
- tách rời các từ trong phần trước, qua dấu chấm
- cộng các ký tự đầu của các từ trước từ cuối cùng
- cộng từ cuối cùng, các ký tự, và phần sau dấu @

Mã:
Function SuaTen(ByVal ten As String) As String
' đổi tên trong email dạng Truong.Cong.Tuan@gmail.com sang dạng TuanTC@gmail.com
' code viết theo dạng căn bản, cần thêm những phần bắt lỗi nếu tên không chuẩn
Dim phan As Variant
Dim tenMoi As String
Dim i As Integer
phan = Split(ten, "@") ' tách ra phần tên và phần domain
tenMoi = "@" & phan(1) ' giữ phần domain lại
phan = Split(phan(0), ".") ' tách phần tên ra từng từ
' cộng họ ký tự đầu của họ và chữ lót - lưu ý cộng ngược
For i = UBound(phan) - 1 To 0 Step -1
tenMoi = Left(phan(i), 1) & tenMoi
Next i
' cộng tên và tất cả vào
SuaTen = phan(UBound(phan)) & tenMoi
End Function
 
Cảm ơn mọi người đã đóng góp giúp đỡ. Nhưng cho mình hỏi một vấn đề này, đó là các post viết bằng code ở trên có sử dụng được trong excel không, vì mình thấy các hàm hơi lạ vì hiện tại mình có danh sách rất nhiều các email cần chuyển về dạng này trong excel nên mình vẫn chưa hiểu lắm về các hàm trên, trông như là code thì phải.
 
Cảm ơn mọi người đã đóng góp giúp đỡ. Nhưng cho mình hỏi một vấn đề này, đó là các post viết bằng code ở trên có sử dụng được trong excel không, vì mình thấy các hàm hơi lạ vì hiện tại mình có danh sách rất nhiều các email cần chuyển về dạng này trong excel nên mình vẫn chưa hiểu lắm về các hàm trên, trông như là code thì phải.

Dùng được bạn làm theo hướng dẫn sau :( cách tạo mới 1 hàm tự định nghĩa)

1. Khởi động VBAIDE. Trong trình đơn Tools, chọn mục Macro ->Visual Basic Editor;
2. Trong trình đơn Insert, chọn mục Module để tạo một mô-đun mới, nơi sẽ chứa hàm do người dùng định nghĩa.
3. Trong trình đơn Insert, chọn mục Procedure… để hiển thị hộp thoại Add Procedure. Sau đó điền tên hàm vào mục Name, chọn kiểu chương trình con là Function và phạm vi là Public.
Cuối cùng chọn OK;

4. Chương trình sẽ tự động phát sinh đoạn mã lệnh như sau:
Public Function name()
End Function
5. Thay đoạn mã lệnh trên bằng đoạn mã lệnh mà bạn muốn sử dụng
ví dụ :
Mã:
[COLOR=#000000]Public Function Tach(Cll)
[/COLOR]............................( đoạn code của pác [I][B]concogia[/B][/I])
 [COLOR=#000000]End Function[/COLOR]


6. Trong trình đơn File, chọn mục Close and Return to Microsoft Excel để quay trở về màn hình chính của Excel;
7. Lúc này, hàm mà ta vừa xây dựng, có tên là Tach, đã có thể được sử dụng bình thường như các hàm khác của Excel.
vd : tại 1 ô cell , bạn nhập = tach ( A1 ) - trong đó A1 cell chứa giá trị tên mà bạn muốn tách
 
Lần chỉnh sửa cuối:
_Chào mọi người ! Mình gặp một bài toán về tách chuỗi như thế này, mong mọi người giúp mình.

Cụ thể là sẽ chuyển một chuỗi có dạng như:

Truong.Cong.Tuan@gmail.com sang TuanTC@gmail.com
Nguyen.Van.Toan@gmail.com sang ToanNV@gmail.com
Mai.Phuong.Thuy@gmail.com sang ThuyMP@gmail.com

mình đưa ra 3 ví dụ trên chắc mọi người cũng hiểu ý mình. Mong mọi người giúp đỡ.
Anh chị thử công thức của em xem!
B2=MID(SUBSTITUTE($A2,"@",LEFT($A2)&MID($A2,FIND(".",$A2)+1,1)&"@"),FIND(".",$A2,FIND(".",$A2)+1)+1,LEN(A2)+2-FIND(".",$A2,FIND(".",$A2)+1))
 
Anh chị thử công thức của em xem!
B2=MID(SUBSTITUTE($A2,"@",LEFT($A2)&MID($A2,FIND(".",$A2)+1,1)&"@"),FIND(".",$A2,FIND(".",$A2)+1)+1,LEN(A2)+2-FIND(".",$A2,FIND(".",$A2)+1))

Nói chung là bài này đừng suy nghĩ sẽ dùng công thức để giải quyết chi cho mất công. Vì thực chất ta đâu có biết tên người có bao nhiêu từ mà tính
Đặt trường hợp chuổi là: Truong.Hoang.Cong.Tuan@gmail.com thì bạn tính sao? Hoặc giả chuổi có tên 5 từ, 6 từ chẳng hạn?
 
Dùng được bạn làm theo hướng dẫn sau :( cách tạo mới 1 hàm tự định nghĩa)

1. Khởi động VBAIDE. Trong trình đơn Tools, chọn mục Macro ->Visual Basic Editor;
2. Trong trình đơn Insert, chọn mục Module để tạo một mô-đun mới, nơi sẽ chứa hàm do người dùng định nghĩa.
3. Trong trình đơn Insert, chọn mục Procedure… để hiển thị hộp thoại Add Procedure. Sau đó điền tên hàm vào mục Name, chọn kiểu chương trình con là Function và phạm vi là Public.
Cuối cùng chọn OK;

4. Chương trình sẽ tự động phát sinh đoạn mã lệnh như sau:
Public Function name()
End Function
5. Thay đoạn mã lệnh trên bằng đoạn mã lệnh mà bạn muốn sử dụng
ví dụ :
Mã:
[COLOR=#000000]Public Function Tach(Cll)
[/COLOR]............................( đoạn code của pác [I][B]concogia[/B][/I])
 [COLOR=#000000]End Function[/COLOR]


6. Trong trình đơn File, chọn mục Close and Return to Microsoft Excel để quay trở về màn hình chính của Excel;
7. Lúc này, hàm mà ta vừa xây dựng, có tên là Tach, đã có thể được sử dụng bình thường như các hàm khác của Excel.
vd : tại 1 ô cell , bạn nhập = tach ( A1 ) - trong đó A1 cell chứa giá trị tên mà bạn muốn tách

_Em thật sự chỉ biết mỗi excel thôi, nên vẫn chưa hiểu cách phải khởi động VBAIDE của bạn nói là như thế nào? Bạn có thể chỉ mình rõ thêm 1 chút được ko ? Xin cảm ơn
 
_Em thật sự chỉ biết mỗi excel thôi, nên vẫn chưa hiểu cách phải khởi động VBAIDE của bạn nói là như thế nào? Bạn có thể chỉ mình rõ thêm 1 chút được ko ? Xin cảm ơn

Bạn không dùng VBA cũng được. Nhưng phải xác định tối đa số từ trong tên.

Dùng phương pháp tách chuỗi thành từng cột ít sai hơn dùng một chuỗi hàm dài.

vd email Nguyen.Thi.Be@gmail.com ở cột A

- Chọn cột A:
data > text to columns : delimiter là @, và destination là B1 --> tên (Nguyen.Thi.Be) ở B và domain (gmail.com) ở C
- Chọn cột B:
data > text to columns : delimiter là ".", và destination là D1 --> tên được tách ra thành từng từ riêng ở mỗi cột kể từ cột D
- Dò tất cả các dòng dữ liệu xem tên nào dài nhất (nhiều từ nhất). Chọn cột kế đó. Ví dụ tên dài nhất 5 từ thì từ cuối cùng ở cột H, chọn cột I. Công thức:
=OFFSET(H1,0,-COUNTBLANK(D1:H1)) -> công thức này cho ra tên
& LEFT(LEFT(D1,1)&LEFT(E1,1)&LEFT(F1,1)&LEFT(G1,1)&LEFT(H1,1),4-COUNTBLANK(D1:H1)) -> đoạn này cho ra phần họ và lót viết tắt
** con số 4 ở trên là do 5 cột (tên dài nhất) trừ đi 1 (chỉ lấy họ và lót, bỏ tên)
Nếu cộng trở lại tên domain, công thức cuối cùng là:
=OFFSET(H1,0,-COUNTBLANK(D1:H1)) & LEFT(LEFT(D1,1)&LEFT(E1,1)&LEFT(F1,1)&LEFT(G1,1)&LEFT(H1,1),4-COUNTBLANK(D1:H1)) & "@" & C1

Đương nhiên là cách tạo công thức này cũng phải lệ thuộc vào dộ dài của tên họ. Tuy nhiên ở đây bạn được lợi điểm là chỉ phải sửa ô cuối cùng của công thức nếu cần.
 
Lần chỉnh sửa cuối:
Web KT
Back
Top Bottom