Tách toàn bộ ký tự đầu của một chuỗi

Liên hệ QC

tttngoc2021

Thành viên mới
Tham gia
14/10/21
Bài viết
8
Được thích
3
Mình muốn tách toàn bộ ký tự đầu để tạo chuỗi có hàm nào không xin chỉ giúp: Phan Thanh Nhan tách thành PTN (chỉ giữ ký tự đầu). Cảm ơn
 
Mình muốn tách toàn bộ ký tự đầu để tạo chuỗi có hàm nào không xin chỉ giúp: Phan Thanh Nhan tách thành PTN (chỉ giữ ký tự đầu). Cảm ơn
Nếu bạn sử dụng Excel 2016 trở lên thì bạn làm cách này nhanh lắm nè bạn:
1634196064587.png
 
Cảm ơn bạn nhé
Nếu bạn sử dụng Excel 2016 trở lên thì bạn làm cách này nhanh lắm nè bạn:
View attachment 267726
cảm ơn bạn nhé
Bài đã được tự động gộp:

Cảm ơn bạn nhé

cảm ơn bạn nhé
Mà mình office 2010 thì làm sao nhỉ
Bài đã được tự động gộp:

Nếu bạn sử dụng Excel 2016 trở lên thì bạn làm cách này nhanh lắm nè bạn:
View attachment 267726
Bạn nếu Excel 2010 thì làm như thế nào xin chỉ giúp
 
Lần chỉnh sửa cuối:
Mình muốn tách toàn bộ ký tự đầu để tạo chuỗi có hàm nào không xin chỉ giúp: Phan Thanh Nhan tách thành PTN (chỉ giữ ký tự đầu). Cảm ơn
Flash fill như xuongrongdat là tốt nhất trong trường hợp này rồi nhưng lại có từ version 2016 trở lên
Hàm thì nó không tối ưu bằng VBA, nhưng nếu tên không dài thì dùng tạm hàm này vậy.
 

File đính kèm

  • Tách ký tự đầu.xlsx
    9.1 KB · Đọc: 12
Bạn nếu Excel 2010 thì làm như thế nào xin chỉ giúp
Với excel đồ cổ thì việc nối ký tự luôn là một mớ bòng bong, đi gỡ oải lắm. Xài tạm hàm chạy bằng cơm vậy, tên viết tắt chắc dài không quá 5 ký đâu nhỉ (dài hơn chạy bằng cơm cho nhanh) A4 là ô chứa dữ liệu.
Mã:
=LEFT(A4;1)&MID(A4;FIND(" ";A4)+1;1)&IF(ISERR(FIND(" ";A4;FIND(" ";A4)+1));"";MID(A4;FIND(" ";A4;FIND(" ";A4)+1)+1;1))&IF(ISERR(FIND(" ";A4;FIND(" ";A4;FIND(" ";A4)+1)+1));"";MID(A4;FIND(" ";A4;FIND(" ";A4;FIND(" ";A4)+1)+1)+1;1))&IF(ISERR(FIND(" ";A4;FIND(" ";A4;FIND(" ";A4;FIND(" ";A4)+1)+1)+1));"";MID(A4;FIND(" ";A4;FIND(" ";A4;FIND(" ";A4;FIND(" ";A4)+1)+1)+1)+1;1))
 
Với excel đồ cổ thì việc nối ký tự luôn là một mớ bòng bong, đi gỡ oải lắm. Xài tạm hàm chạy bằng cơm vậy, tên viết tắt chắc dài không quá 5 ký đâu nhỉ (dài hơn chạy bằng cơm cho nhanh) A4 là ô chứa dữ liệu.
Mã:
=LEFT(A4;1)&MID(A4;FIND(" ";A4)+1;1)&IF(ISERR(FIND(" ";A4;FIND(" ";A4)+1));"";MID(A4;FIND(" ";A4;FIND(" ";A4)+1)+1;1))&IF(ISERR(FIND(" ";A4;FIND(" ";A4;FIND(" ";A4)+1)+1));"";MID(A4;FIND(" ";A4;FIND(" ";A4;FIND(" ";A4)+1)+1)+1;1))&IF(ISERR(FIND(" ";A4;FIND(" ";A4;FIND(" ";A4;FIND(" ";A4)+1)+1)+1));"";MID(A4;FIND(" ";A4;FIND(" ";A4;FIND(" ";A4;FIND(" ";A4)+1)+1)+1)+1;1))
cảm ơn bạn nhé
Flash fill như xuongrongdat là tốt nhất trong trường hợp này rồi nhưng lại có từ version 2016 trở lên
Hàm thì nó không tối ưu bằng VBA, nhưng nếu tên không dài thì dùng tạm hàm này vậy.
cảm ơn nhé
 
Góp vui công thức dùng cho Excel 2016 trở lên có hàm TEXTJOIN()
Giả sử Họ tên ở ô A3:
PHP:
=TEXTJOIN("",TRUE,IFERROR(MID(" "&A3,FIND("@",SUBSTITUTE(" "&A3," ","@",ROW($A$1:$A$10)))+1,1),""))
Ctrl + Shift + Enter

Thêm 1 cách sử dụng VBA:
PHP:
Function GetFirstCharacters(SourceString As String)
    Dim Temp, Res()
    Dim I As Byte, K As Byte
    
    Temp = Split(" " & SourceString, " ")
    For I = LBound(Temp) To UBound(Temp)
        If Len(Temp(I)) Then
            K = K + 1
            ReDim Preserve Res(1 To K)
            Res(K) = Left(Temp(I), 1)
        End If
    Next I
    GetFirstCharacters = Join(Res, "")
End Function
 
Thêm 1 cách khác
Mã:
=CONCAT(REPLACE(FILTERXML("<m><n>"&SUBSTITUTE($A1," ","</n><n>")&"</n></m>","//n"),2,20,""))
 
...
Thêm 1 cách sử dụng VBA:
PHP:
Function GetFirstCharacters(SourceString As String)
    Dim Temp, Res()
    Dim I As Byte, K As Byte
   
    Temp = Split(" " & SourceString, " ")
    For I = LBound(Temp) To UBound(Temp)
        If Len(Temp(I)) Then
            K = K + 1
            ReDim Preserve Res(1 To K)
            Res(K) = Left(Temp(I), 1)
        End If
    Next I
    GetFirstCharacters = Join(Res, "")
End Function
Code này rắc rối và nhiều kẽ hở lắm.
Điều đáng ghi nhớ: nếu split với dấu cách thì nên trim chuỗi trước. Trừ phi cần giữ lại đúng số dấu cách.

Dim e
For Each e in Split(Application.Trim(SourceString), " ")
GetFirstCharacters = GetFirstCharacters & Left(e, 1)
Next e
 
Mình muốn tách toàn bộ ký tự đầu để tạo chuỗi có hàm nào không xin chỉ giúp: Phan Thanh Nhan tách thành PTN (chỉ giữ ký tự đầu). Cảm ơn
Dùng hàm tự tạo trên GPE.
Mã:
Option Explicit
Function AbbName(ByVal Text As String, Optional ByVal Delimiter As String = vbNullString, Optional ByVal IncName As Boolean = False) As String
  Dim sPart1 As String, sPart2 As String, sp As String, lPos As Long
  sp = Space(1)
  If InStr(1, Text, sp) Then
    With WorksheetFunction
      sPart1 = .Trim(Text)
      lPos = InStrRev(sPart1, Space(1))
      sPart2 = Mid(sPart1, lPos + 1, Len(sPart1))
      sPart1 = Mid(sPart1, 1, lPos - 1)
      sPart1 = "{""" & Replace(sPart1, " ", """;""") & """}"
      sPart1 = Join(Evaluate("Transpose(LEFT(" & sPart1 & ",1))"), Delimiter)
    End With
    AbbName = sPart1 & Delimiter & IIf(IncName, Left(sPart2, 1), sPart2)
  End If
End Function
Cú pháp:
Mã:
=AbbName(C3,"",TRUE)
 

File đính kèm

  • TenTat.xls
    35 KB · Đọc: 5
Code này rắc rối và nhiều kẽ hở lắm.
Điều đáng ghi nhớ: nếu split với dấu cách thì nên trim chuỗi trước. Trừ phi cần giữ lại đúng số dấu cách.

Dim e
For Each e in Split(Application.Trim(SourceString), " ")
GetFirstCharacters = GetFirstCharacters & Left(e, 1)
Next e
Em cám ơn bác đã chỉ dạy.
 
Góp vui công thức dùng cho Excel 2016 trở lên có hàm TEXTJOIN()
Giả sử Họ tên ở ô A3:
PHP:
=TEXTJOIN("",TRUE,IFERROR(MID(" "&A3,FIND("@",SUBSTITUTE(" "&A3," ","@",ROW($A$1:$A$10)))+1,1),""))
Ctrl + Shift + Enter

Thêm 1 cách sử dụng VBA:
PHP:
Function GetFirstCharacters(SourceString As String)
    Dim Temp, Res()
    Dim I As Byte, K As Byte
 
    Temp = Split(" " & SourceString, " ")
    For I = LBound(Temp) To UBound(Temp)
        If Len(Temp(I)) Then
            K = K + 1
            ReDim Preserve Res(1 To K)
            Res(K) = Left(Temp(I), 1)
        End If
    Next I
    GetFirstCharacters = Join(Res, "")
End Function
Cái hàm này sao bạn lại chọn hướng redim preserve rồi join lại mình thấy hơi cồng kềnh.
Vì chỉ xử lý chuỗi nên mình nghĩ khai báo biến txt, sau đó txt = txt & left(temp(i),1). kết quả hàm GetFirstCharacters = txt là được.
Mà theo mình biết, nếu có hướng làm khác thì không nên redim preserve mảng từng phần tử
 
Cái hàm này sao bạn lại chọn hướng redim preserve rồi join lại mình thấy hơi cồng kềnh.
Vì chỉ xử lý chuỗi nên mình nghĩ khai báo biến txt, sau đó txt = txt & left(temp(i),1). kết quả hàm GetFirstCharacters = txt là được.
Mà theo mình biết, nếu có hướng làm khác thì không nên redim preserve mảng từng phần tử
Cám ơn bạn đã góp ý.
Bài #12, bác @VetMini cũng nêu vấn đề đó ra rồi.
Tôi xin được cảm ơn và tiếp thu.
 
@SA_DQ : đây là 1 trong những bước để con tạo Mã nhân viên cho công ty con theo cách bác gợi ý á. Con làm thủ công 1 lần. hi
Sớm nay mình mới tình cờ đọc được bài này của bạn & mình rất vui!
Sẵn đây xin mạn phép anh em (chắc trong DĐ không có chị nào lớn tuổi hơn mình!) mã nhân viên luôn có 2 phần; Mình tạm gọi 1 phần là đặc tính & phần định trị;
Phần đầu luôn gồm 3 ký tự & phần sau gồm 2 ký số (hay/& ký tự - nếu danh sách nhân viên cỡ vạn người)
Ví dụ:

STTMã NVHọ & Tên
1TTT01Trần Thành Trai
2TTT00Từ Thanh Tuấn
3TMH04Trần Thị Minh Hà
4TMH03Tạ Thị Minh Hà
5TMH02Trần Minh Hà
6TMH01Từ Mạnh Hóa
7TMH00Trần Minh Hồng
8TJD00Trần Dương
9THH00Trần Minh Hồng Hà
10NHB92Nhữ Thái Hải Hà
11NHBAZNgô Thị Hòa Biền
12NHB00Nguyễn Hòa Bình
13LTF00Lê Công Thành Đạt

Chỉ cần các bạn nhìn vô 4 mã được tô đậm thì ta nghiệm ra được qui luật tạo mã.Ở đây sẽ có vài trường hợp diễn ra:
(1) Danh sách đã có mã, muốn chuyển sang hệ mã như trên;
(2) Đã có DS theo hệ mã này & bổ sung người mới 'đến'
. . . . .

Rất vui lòng giải đáp các câu hỏi của các bạn, nếu có!

Thân chào & chúc các bạn luôn khỏe!
 
Với excel đồ cổ thì việc nối ký tự luôn là một mớ bòng bong, đi gỡ oải lắm. Xài tạm hàm chạy bằng cơm vậy, tên viết tắt chắc dài không quá 5 ký đâu nhỉ (dài hơn chạy bằng cơm cho nhanh) A4 là ô chứa dữ liệu.
Mã:
=LEFT(A4;1)&MID(A4;FIND(" ";A4)+1;1)&IF(ISERR(FIND(" ";A4;FIND(" ";A4)+1));"";MID(A4;FIND(" ";A4;FIND(" ";A4)+1)+1;1))&IF(ISERR(FIND(" ";A4;FIND(" ";A4;FIND(" ";A4)+1)+1));"";MID(A4;FIND(" ";A4;FIND(" ";A4;FIND(" ";A4)+1)+1)+1;1))&IF(ISERR(FIND(" ";A4;FIND(" ";A4;FIND(" ";A4;FIND(" ";A4)+1)+1)+1));"";MID(A4;FIND(" ";A4;FIND(" ";A4;FIND(" ";A4;FIND(" ";A4)+1)+1)+1)+1;1))
Cảm ơn bạn nhiều nhé
Bài đã được tự động gộp:

Cảm ơn mọi người mình đã làm đc rồi
 
Web KT
Back
Top Bottom