Tách chuỗi có 4 ngôn ngữ bằng VBA

Liên hệ QC

bibabiboh

Thành viên mới
Tham gia
9/4/20
Bài viết
1
Được thích
0
Chào mọi người,
Em muốn tách tiếng Việt, tiếng Trung, tiếng Anh, tiếng Hàn mà nó bị dính vào, ví dụ:
tách cột đầu tiên làm sao cho ra được 4 cột kia. Em đã thử Flash Fill nhưng không được nên muốn làm bằng VBA, mọi người giúp em với ạ.

27. Có tính lây nhiễm transmissibility; infectivity 传染性 전염성27. Có tính lây nhiễmtransmissibility; infectivity传染性전염성
30. Đau đầu headache 头疼 두통
30. Đau đầu
headache头疼 두통

Cảm ơn mọi người rất nhiều.
 

File đính kèm

  • File từ vựng.xlsx
    9.3 KB · Đọc: 24
Những từ như the, run, men, ... thì biết là tiếng Việt hay tiếng Anh?
 
Chào mọi người,
Em muốn tách tiếng Việt, tiếng Trung, tiếng Anh, tiếng Hàn mà nó bị dính vào, ví dụ:
tách cột đầu tiên làm sao cho ra được 4 cột kia. Em đã thử Flash Fill nhưng không được nên muốn làm bằng VBA, mọi người giúp em với ạ.

27. Có tính lây nhiễm transmissibility; infectivity 传染性 전염성27. Có tính lây nhiễmtransmissibility; infectivity传染性전염성
30. Đau đầu headache 头疼 두통
30. Đau đầu
headache头疼두통

Cảm ơn mọi người rất nhiều.
Áp dụng cho dữ liệu trong file và chỉ đúng đối với những dữ liệu ở trong 1 ô.
Mã:
B1=TRIM(MID(SUBSTITUTE($A1,"  ",REPT(" ",LEN($A1))),LEN($A1)*(COLUMN(A1)-1)+1,LEN($A1)))
 
Chào mọi người,
Em muốn tách tiếng Việt, tiếng Trung, tiếng Anh, tiếng Hàn mà nó bị dính vào, ví dụ:
tách cột đầu tiên làm sao cho ra được 4 cột kia. Em đã thử Flash Fill nhưng không được nên muốn làm bằng VBA, mọi người giúp em với ạ.

27. Có tính lây nhiễm transmissibility; infectivity 传染性 전염성27. Có tính lây nhiễmtransmissibility; infectivity传染性전염성
30. Đau đầu headache 头疼 두통
30. Đau đầu
headache头疼두통

Cảm ơn mọi người rất nhiều.

Áp dụng Unicode chữ Trung: 11904-12031, chữ Hàn 44032-55203
Công thức tách cụm chữ Trung và chữ Hàn ra trước, công thức B1:
Mã:
=IFERROR(RIGHT(A1,LEN(A1)-AGGREGATE(15,6,ROW($1:$1000)/(UNICODE(MID($A1,ROW($1:$1000),1))>11903)/(UNICODE(MID($A1,ROW($1:$1000),1))<55204),1)+1),"")
Tác chữ Hàn trong B1, công thức D1:
Mã:
=IFERROR(TRIM(RIGHT(B1,LEN(B1)-AGGREGATE(15,6,ROW($1:$1000)/(UNICODE(MID(B1,ROW($1:$1000),1))>44031)/(UNICODE(MID(B1,ROW($1:$1000),1))<55204),1)+1)),"")
Tách chữ Trung trong B1, công thức C1:
Mã:
=LEFT(B1,LEN(B1)-LEN(D1))
Phần chữ Latin còn lại (chữ Anh và Việt), tách theo công thức ở bài #3, một số dữ liệu 4 ngôn ngữ tràn qua 2 ô chưa giải quyết.
 

File đính kèm

  • File từ vựng.xlsx
    13.1 KB · Đọc: 40
Chào mọi người,
Em muốn tách tiếng Việt, tiếng Trung, tiếng Anh, tiếng Hàn mà nó bị dính vào, ví dụ:
tách cột đầu tiên làm sao cho ra được 4 cột kia. Em đã thử Flash Fill nhưng không được nên muốn làm bằng VBA, mọi người giúp em với ạ.

27. Có tính lây nhiễm transmissibility; infectivity 传染性 전염성27. Có tính lây nhiễmtransmissibility; infectivity传染性전염성
30. Đau đầu headache 头疼 두통
30. Đau đầu
headache头疼두통

Cảm ơn mọi người rất nhiều.
Bạn thử xem cách này để tách tiếng trung và tiếng hàng
Mình sử dụng Regex để làm
 

File đính kèm

  • File từ vựng.xlsm
    19.6 KB · Đọc: 55
Bạn dùng tạm code này, copy vào module, và gán macro vào button.


------------------------------
PHP:
Sub Tach()
  Dim RE As Object, i As Long, k As Long, ik As Long, t As Integer, j As Integer
  Dim S As String, S1 As String, S2 As String, Rng As Range
  Dim L1 As Integer, L2 As Integer
  On Error Resume Next
  Set RE = VBA.CreateObject("VBScript.RegExp")
  With RE
      .Global = True
      .IgnoreCase = True
      .Pattern = "([^\u4e00-\u9eff]*)([^\uac00-\ud7af]*[,\/. ]*[^\uac00-\ud7af]*)(.*)"
  End With
  Set Rng = Range("A2").Resize(Range("A" & Rows.Count).End(3).Row)
  Dim a, aa(), sp$(), ij As Boolean
  a = Rng.Value
  ReDim aa(1 To UBound(a), 1 To 6)
  For i = 1 To UBound(a)
    L1 = Len(a(i, 1))
    If IsNumeric(Left(a(i, 1), 2)) Then
      S = a(i, 1)
      If i < UBound(a) Then
        ij = Not IsNumeric(Left(a(i + 1, 1), 2))
        If ij Then S = S & " " & a(i + 1, 1)
      End If
      ik = i - k
      L2 = Len(S)
      S2 = Replace(S, "  ", "")
      If L2 - Len(S2) = 6 Then
        t = 0: t = InStr(S, ". ")
        aa(ik, 2) = Left(S, t)
        sp = Split(Mid(S, t + 2), "  ")
        For j = 3 To 6
          aa(ik, j) = sp(j - 3)
        Next
      Else
        t = 0: t = InStr(S, "  ")
        If t Then
          S1 = Left(S, t - 1)
          S2 = Mid(S, t + 2)
          t = 0: t = InStr(a(i, 1), ".")
          aa(ik, 2) = Left(S1, t - 1)
          aa(ik, 3) = Mid(S1, t + 2)
          If RE.test(S2) Then
            With RE.Execute(S2)(0)
              aa(ik, 4) = VBA.Trim(.SubMatches(0))
              aa(ik, 5) = VBA.Trim(.SubMatches(1))
              aa(ik, 6) = VBA.Trim(.SubMatches(2))
            End With
          End If
        End If
      End If
      aa(ik, 1) = S
      If ij Then ij = False: k = k + 1
    End If
  Next i
  Rng(1, 2).Resize(UBound(a), 6) = aa
End Sub
 
Web KT
Back
Top Bottom