Tách chữ và số riêng của các chuỗi dài ngắn khác nhau, thành từng cột riêng rẽ (Xin giúp đỡ)

Liên hệ QC

muaxuantriky

Thành viên mới
Tham gia
10/7/21
Bài viết
3
Được thích
0
Chào mọi người,
Nhờ mọi người giúp em tách các chuỗi từ cột một ( dài ngắn khác nhau) thành các chữ riêng ( độ dài khác nhau) và số ( độ dài khác nhau) riêng biệt theo từng cột với ạ. Như trong file ví dụ.
Em thử dùng các hàm Mid, Search ("0") mà chưa ổn vì độ dài ngắn của các chuỗi khác nhau.
EM xin cảm ơn!
 

File đính kèm

  • tachchuvaso.xlsx
    10.2 KB · Đọc: 19
  • tachchuso.png
    tachchuso.png
    24.9 KB · Đọc: 25
Chào mọi người,
Nhờ mọi người giúp em tách các chuỗi từ cột một ( dài ngắn khác nhau) thành các chữ riêng ( độ dài khác nhau) và số ( độ dài khác nhau) riêng biệt theo từng cột với ạ. Như trong file ví dụ.
Em thử dùng các hàm Mid, Search ("0") mà chưa ổn vì độ dài ngắn của các chuỗi khác nhau.
EM xin cảm ơn!
Kiểu này chắc phải dùng VBA rồi.
 
Chào mọi người,
Nhờ mọi người giúp em tách các chuỗi từ cột một ( dài ngắn khác nhau) thành các chữ riêng ( độ dài khác nhau) và số ( độ dài khác nhau) riêng biệt theo từng cột với ạ. Như trong file ví dụ.
Em thử dùng các hàm Mid, Search ("0") mà chưa ổn vì độ dài ngắn của các chuỗi khác nhau.
EM xin cảm ơn!
Dòng 7: La0.650.05Sr0.3MnO3, kết quả tách là gì?

.
 
Chào mọi người,
Nhờ mọi người giúp em tách các chuỗi từ cột một ( dài ngắn khác nhau) thành các chữ riêng ( độ dài khác nhau) và số ( độ dài khác nhau) riêng biệt theo từng cột với ạ. Như trong file ví dụ.
Em thử dùng các hàm Mid, Search ("0") mà chưa ổn vì độ dài ngắn của các chuỗi khác nhau.
EM xin cảm ơn!
Những chỗ nhập sai như sau thì tách kiểu gì?
A7 =La0.650.05Sr
A14 =La0.690.01Sr
A19 =La0.670.03Sr
 
Nếu dữ liệu không sai thì có lẽ 0.650.05 phải tách thành 0.65 và 0.05.
Nhưng nếu như có 0.60.05 hoăc 0.6510.05 thì sao?
 
Chào mọi người,
Nhờ mọi người giúp em tách các chuỗi từ cột một ( dài ngắn khác nhau) thành các chữ riêng ( độ dài khác nhau) và số ( độ dài khác nhau) riêng biệt theo từng cột với ạ. Như trong file ví dụ.
Em thử dùng các hàm Mid, Search ("0") mà chưa ổn vì độ dài ngắn của các chuỗi khác nhau.
EM xin cảm ơn!
Thử dùng code này xem sao. Hy vọng đúng ý.
Mã:
Function TachSo(chuoi As String) 'As String
    Dim i As Integer
    Dim kytu As String
   ' kytu = ""
    For i = 1 To Len(chuoi)
           If Mid(chuoi, i, 1) = "." Then
                kytu = kytu & "."
           ElseIf Not IsNumeric(Mid(chuoi, i, 1)) Or Mid(chuoi, i + 1, 1) = "." Then
                kytu = kytu & ", "
            End If
            If IsNumeric(Mid(chuoi, i, 1)) Then
                kytu = kytu & Mid(chuoi, i, 1)
            End If
    Next i
    TachSo = kytu
End Function
Function TachKyTu(chuoi As Range) 'As String
    Dim i As Integer
    Dim kytu As String
    kytu = ""
    For i = 1 To Len(chuoi)
        If i < Len(chuoi) Then
            If Not IsNumeric(Mid(chuoi, i, 1)) Then
                kytu = kytu & Mid(chuoi, i, 1)
            End If
        Else
            If IsNumeric(Mid(chuoi, i, 1)) Then
                kytu = kytu & Mid(chuoi, i, 1)
            End If
        End If
    Next i
    TachKyTu = kytu
End Function


Sub XYZ()
Dim Arr(), KQ(), S, Sp
Dim i&, j&, t&, Lr&
Dim Tmp, Temp
With Sheet1
    Lr = .Cells(Rows.Count, 1).End(3).Row
'    Arr = Range("A2:A" & Lr).Value
    ReDim KQ(1 To Lr, 1 To 60)
For j = 3 To Lr 'UBound(Arr)
t = 0
    Tmp = TachSo(.Cells(j, 1))
        S = Split(Replace(Tmp, ",", " "))
            For i = 0 To UBound(S) - 2
                If S(i) <> Empty Then
                    t = t + 1
                    KQ(j - 2, t * 2) = S(i)
                End If
            Next i
    Temp = TachKyTu(.Cells(j, 1))
        Sp = Split(Replace(Temp, ".", " "))
        k = 0
            For i = 0 To UBound(Sp)
                If Sp(i) <> Empty Then
                   k = k + 1
                   KQ(j - 2, k * 2 - 1) = Sp(i)
                End If
            Next i
Next j
.[B3].Resize(j, 60).ClearContents
.[B3].Resize(j, 60) = KQ
End With
MsgBox "Xong"
End Sub

Hãy nhấn nút CHẠY CODE để xem và kiểm tra kết quả. Có thể thay, thêm dữ liệu vào cột A và chạy code kiêm tra lại nhé. tôi nhác kiểm tra (mắt toét ra rồi).
 

File đính kèm

  • tachchuvaso.xlsm
    24.4 KB · Đọc: 6
Lần chỉnh sửa cuối:
Chào mọi người,
Nhờ mọi người giúp em tách các chuỗi từ cột một ( dài ngắn khác nhau) thành các chữ riêng ( độ dài khác nhau) và số ( độ dài khác nhau) riêng biệt theo từng cột với ạ. Như trong file ví dụ.
Em thử dùng các hàm Mid, Search ("0") mà chưa ổn vì độ dài ngắn của các chuỗi khác nhau.
EM xin cảm ơn!
Đoán đại

---
Các số dính liền được coi là thiếu ký tự => Ô kết quả để trống
Mã:
Sub tach()
Dim nguon
Dim tam
Dim kq
Dim rws, cls
Dim i, j, k, x, z, t

nguon = Sheet1.Range("A3", Sheet1.Range("A3").End(xlDown))
rws = UBound(nguon)
ReDim kq(1 To rws, 1 To 1)
For i = 1 To rws
    tam = Split(Replace(Left(nguon(i, 1), Len(nguon(i, 1)) - 2), "0.", " 0."))
    cls = UBound(tam)
    If UBound(kq, 2) < cls * 2 Then ReDim Preserve kq(1 To rws, 1 To cls * 2)
    kq(i, 1) = tam(0)
    k = 2
    For j = 1 To cls
        If IsNumeric(tam(j)) Then
            kq(i, k) = tam(j)
           
        Else
            For z = 3 To Len(tam(j))
                If IsNumeric(Mid(tam(j), z, 1)) = False Then
                    kq(i, k) = Left(tam(j), z - 1)
                    kq(i, k + 1) = Right(tam(j), Len(tam(j)) - z + 1)
                    Exit For
                End If
            Next z
        End If
        k = k + 2
    Next j
Next i
With Sheet1
    .Range("C3").Resize(UBound(kq), UBound(kq, 2)).Clear
    .Range("C3").Resize(UBound(kq), UBound(kq, 2)) = kq
    .Range("C3").Resize(UBound(kq), UBound(kq, 2)).Columns.AutoFit
End With
End Sub
 

File đính kèm

  • tachchuvaso.xlsb
    15.8 KB · Đọc: 9
Lần chỉnh sửa cuối:
Chào mọi người,
Nhờ mọi người giúp em tách các chuỗi từ cột một ( dài ngắn khác nhau) thành các chữ riêng ( độ dài khác nhau) và số ( độ dài khác nhau) riêng biệt theo từng cột với ạ. Như trong file ví dụ.
Em thử dùng các hàm Mid, Search ("0") mà chưa ổn vì độ dài ngắn của các chuỗi khác nhau.
EM xin cảm ơn!
Tôi tách 0.650.50 thành 0.65 và 0.50 chứ không thêm gì giữa chúng
Rich (BB code):
Sub TachChuoi()
Dim arr, arrKQ
Dim i&, k&, c&, L&, V&
Dim NoS As Boolean
Dim Chrs$, VSplit$

arr = Range("A3:A" & Range("A" & Rows.Count).End(xlUp).Row)
ReDim arrKQ(1 To UBound(arr), 1 To 50)
For i = 1 To UBound(arr)
    VSplit = Left(arr(i, 1), Len(arr(i, 1)) - 2)
    For k = 1 To Len(VSplit)
T1:     If NoS = False And Mid(VSplit, k, 1) <> "." Then
            If IsNumeric(Mid(VSplit, k, 1)) = False Then
                Chrs = Chrs & Mid(VSplit, k, 1)
            Else
                c = c + 1: arrKQ(i, c) = Chrs: Chrs = ""
                NoS = True: GoTo T2
            End If
        End If
T2:     If NoS = True Or Mid(VSplit, k, 1) = "." Then
            If IsNumeric(Mid(VSplit, k, 1)) = True Or Mid(VSplit, k, 1) = "." Then
                Chrs = Chrs & Mid(VSplit, k, 1)
            Else
                If InStr(InStr(1, Chrs, ".") + 1, Chrs, ".") Then
                    V = InStr(InStr(1, Chrs, ".") + 1, Chrs, ".") - 2
                    c = c + 1: arrKQ(i, c) = Mid(Chrs, 1, V)
                    c = c + 1: arrKQ(i, c) = Mid(Chrs, V + 1)
                Else
                    c = c + 1: arrKQ(i, c) = Chrs
                End If
                Chrs = "": NoS = False: GoTo T1
            End If
        End If
        If k = Len(VSplit) Then
            c = c + 1: arrKQ(i, c) = Chrs
        End If
    Next
    If L < c Then L = c
    c = 0: Chrs = "": NoS = False
Next
Range("B3").Resize(UBound(arr), 50).ClearContents
Range("B3").Resize(UBound(arr), L) = arrKQ
End Sub
Bài đã được tự động gộp:

Đoán đại

---
Các số dính liền được coi là thiếu ký tự => Ô kết quả để trống
Tôi chưa tìm hiểu vì sao nhưng khi đưa dòng La0.650.05Sr0.3MnO3 lên đầu tiên thì code bạn bị lỗi
 
Góp vui, đúng sai thì hên xui!
PHP:
Public Sub Test()
Dim i As Long, r As Long, j As Long
Dim arrData, arrDec, temp

arrData = Range("A3:A" & Range("A" & Rows.Count).End(xlUp).Row).Value
r = UBound(arrData, 1)
ReDim arrDec(1 To r, 1 To 50)
For i = 1 To r
    temp = SplitText(arrData(i, 1))
    For j = 0 To UBound(temp)
        arrDec(i, j + 1) = temp(j)
    Next j
Next i
Range("C3").Resize(r, 50) = arrDec
End Sub
PHP:
Public Function SplitText(ByVal s As String) As Variant
Dim i As Long
For i = Len(s) To 2 Step -1
    If (Mid(s, i, 1) Like "[0-9.]") + (Mid(s, i - 1, 1) Like "[0-9.]") = -1 Then
        s = Left(s, i - 1) & " " & Mid(s, i)
    End If
Next i
SplitText = Split(s, " ")
End Function
 
Mượn lệnh của @Phuocam góp thêm cách khác
Mã:
Sub ABC()
  Dim sArr(), res(), S, sRow&, i&, j&, k&
 
  sArr() = Range("A3:A" & Range("A" & Rows.Count).End(xlUp).Row).Value
  sRow = UBound(sArr, 1)
  ReDim res(1 To sRow, 1 To 50)
  For i = 1 To sRow
    S = sArr(i, 1)
    For j = Len(S) To 2 Step -1
      If Mid(S, j, 1) = "." Then
        If k = 0 Then
          k = j
        Else
          S = Left(S, k - 1) & "  " & Mid(S, k - 1)
          k = 0
        End If
      ElseIf (Mid(S, j, 1) Like "[0-9.]") <> (Mid(S, j - 1, 1) Like "[0-9.]") Then
        S = Left(S, j - 1) & " " & Mid(S, j)
        k = 0
      End If
    Next j
    S = Split(S, " ")
    For j = 0 To UBound(S)
        res(i, j + 1) = S(j)
    Next j
  Next i
  Range("C3").Resize(sRow, 50) = res
End Sub
 
Kiểu này chắc phải dùng VBA rồi.
Vâng, dùng VBA cũng đc bác, miễn là được kết quả theo yêu cầu thôi bác
Bài đã được tự động gộp:

Nếu dữ liệu không sai thì có lẽ 0.650.05 phải tách thành 0.65 và 0.05.
Nhưng nếu như có 0.60.05 hoăc 0.6510.05 thì sao?
Vâng dữ liệu em lập thủ công nên đánh thiếu 1 con chữ đó b, nó là 0.65K0.05
Bài đã được tự động gộp:

Góp vui, đúng sai thì hên xui!
PHP:
Public Sub Test()
Dim i As Long, r As Long, j As Long
Dim arrData, arrDec, temp

arrData = Range("A3:A" & Range("A" & Rows.Count).End(xlUp).Row).Value
r = UBound(arrData, 1)
ReDim arrDec(1 To r, 1 To 50)
For i = 1 To r
    temp = SplitText(arrData(i, 1))
    For j = 0 To UBound(temp)
        arrDec(i, j + 1) = temp(j)
    Next j
Next i
Range("C3").Resize(r, 50) = arrDec
End Sub
PHP:
Public Function SplitText(ByVal s As String) As Variant
Dim i As Long
For i = Len(s) To 2 Step -1
    If (Mid(s, i, 1) Like "[0-9.]") + (Mid(s, i - 1, 1) Like "[0-9.]") = -1 Then
        s = Left(s, i - 1) & " " & Mid(s, i)
    End If
Next i
SplitText = Split(s, " ")
End Function
Cảm ơn bác, để e thử
Bài đã được tự động gộp:

cho
Những chỗ nhập sai như sau thì tách kiểu gì?
A7 =La0.650.05Sr
A14 =La0.690.01Sr
A19 =La0.670.03S
mấy chỗ nhập sai đó, t sẽ dùng tay nhập lại ban đầu thôi bạn. vì nó thiếu một hoặc hai chữ cái ở giữa hai con số.
Bài đã được tự động gộp:

cho
Những chỗ nhập sai như sau thì tách kiểu gì?
A7 =La0.650.05Sr
A14 =La0.690.01Sr
A19 =La0.670.03S
mấy chỗ nhập sai đó, t sẽ dùng tay nhập lại ban đầu thôi bạn. vì nó thiếu một hoặc hai chữ cái ở giữa hai con số.
Bài đã được tự động gộp:

Thử dùng code này xem sao. Hy vọng đúng ý.
Mã:
Function TachSo(chuoi As String) 'As String
    Dim i As Integer
    Dim kytu As String
   ' kytu = ""
    For i = 1 To Len(chuoi)
           If Mid(chuoi, i, 1) = "." Then
                kytu = kytu & "."
           ElseIf Not IsNumeric(Mid(chuoi, i, 1)) Or Mid(chuoi, i + 1, 1) = "." Then
                kytu = kytu & ", "
            End If
            If IsNumeric(Mid(chuoi, i, 1)) Then
                kytu = kytu & Mid(chuoi, i, 1)
            End If
    Next i
    TachSo = kytu
End Function
Function TachKyTu(chuoi As Range) 'As String
    Dim i As Integer
    Dim kytu As String
    kytu = ""
    For i = 1 To Len(chuoi)
        If i < Len(chuoi) Then
            If Not IsNumeric(Mid(chuoi, i, 1)) Then
                kytu = kytu & Mid(chuoi, i, 1)
            End If
        Else
            If IsNumeric(Mid(chuoi, i, 1)) Then
                kytu = kytu & Mid(chuoi, i, 1)
            End If
        End If
    Next i
    TachKyTu = kytu
End Function


Sub XYZ()
Dim Arr(), KQ(), S, Sp
Dim i&, j&, t&, Lr&
Dim Tmp, Temp
With Sheet1
    Lr = .Cells(Rows.Count, 1).End(3).Row
'    Arr = Range("A2:A" & Lr).Value
    ReDim KQ(1 To Lr, 1 To 60)
For j = 3 To Lr 'UBound(Arr)
t = 0
    Tmp = TachSo(.Cells(j, 1))
        S = Split(Replace(Tmp, ",", " "))
            For i = 0 To UBound(S) - 2
                If S(i) <> Empty Then
                    t = t + 1
                    KQ(j - 2, t * 2) = S(i)
                End If
            Next i
    Temp = TachKyTu(.Cells(j, 1))
        Sp = Split(Replace(Temp, ".", " "))
        k = 0
            For i = 0 To UBound(Sp)
                If Sp(i) <> Empty Then
                   k = k + 1
                   KQ(j - 2, k * 2 - 1) = Sp(i)
                End If
            Next i
Next j
.[B3].Resize(j, 60).ClearContents
.[B3].Resize(j, 60) = KQ
End With
MsgBox "Xong"
End Sub

Hãy nhấn nút CHẠY CODE để xem và kiểm tra kết quả. Có thể thay, thêm dữ liệu vào cột A và chạy code kiêm tra lại nhé. tôi nhác kiểm tra (mắt toét ra rồi).
Vĩ đại, cảm ơn bạn nhiều
Bài đã được tự động gộp:

Số liệu bài 1 code chạy đúng chứ bạn?
cảm ơn bạn, t sẽ sửa lại mấy dòng nhập lỗi đó và thử code của bạn, xin cảm ơn xin cảm ơn
Bài đã được tự động gộp:

Mượn lệnh của @Phuocam góp thêm cách khác
Mã:
Sub ABC()
  Dim sArr(), res(), S, sRow&, i&, j&, k&
 
  sArr() = Range("A3:A" & Range("A" & Rows.Count).End(xlUp).Row).Value
  sRow = UBound(sArr, 1)
  ReDim res(1 To sRow, 1 To 50)
  For i = 1 To sRow
    S = sArr(i, 1)
    For j = Len(S) To 2 Step -1
      If Mid(S, j, 1) = "." Then
        If k = 0 Then
          k = j
        Else
          S = Left(S, k - 1) & "  " & Mid(S, k - 1)
          k = 0
        End If
      ElseIf (Mid(S, j, 1) Like "[0-9.]") <> (Mid(S, j - 1, 1) Like "[0-9.]") Then
        S = Left(S, j - 1) & " " & Mid(S, j)
        k = 0
      End If
    Next j
    S = Split(S, " ")
    For j = 0 To UBound(S)
        res(i, j + 1) = S(j)
    Next j
  Next i
  Range("C3").Resize(sRow, 50) = res
End Sub
Cảm ơn các bác nhiều, em mới học VBA được 5 buổi nên đọc code chỗ hiểu chỗ không hiểu, nhưng mục đích thì coi như đã ổn rồi.
Bài đã được tự động gộp:

Đoán đại

---
Các số dính liền được coi là thiếu ký tự => Ô kết quả để trống
Mã:
Sub tach()
Dim nguon
Dim tam
Dim kq
Dim rws, cls
Dim i, j, k, x, z, t

nguon = Sheet1.Range("A3", Sheet1.Range("A3").End(xlDown))
rws = UBound(nguon)
ReDim kq(1 To rws, 1 To 1)
For i = 1 To rws
    tam = Split(Replace(Left(nguon(i, 1), Len(nguon(i, 1)) - 2), "0.", " 0."))
    cls = UBound(tam)
    If UBound(kq, 2) < cls * 2 Then ReDim Preserve kq(1 To rws, 1 To cls * 2)
    kq(i, 1) = tam(0)
    k = 2
    For j = 1 To cls
        If IsNumeric(tam(j)) Then
            kq(i, k) = tam(j)
          
        Else
            For z = 3 To Len(tam(j))
                If IsNumeric(Mid(tam(j), z, 1)) = False Then
                    kq(i, k) = Left(tam(j), z - 1)
                    kq(i, k + 1) = Right(tam(j), Len(tam(j)) - z + 1)
                    Exit For
                End If
            Next z
        End If
        k = k + 2
    Next j
Next i
With Sheet1
    .Range("C3").Resize(UBound(kq), UBound(kq, 2)).Clear
    .Range("C3").Resize(UBound(kq), UBound(kq, 2)) = kq
    .Range("C3").Resize(UBound(kq), UBound(kq, 2)).Columns.AutoFit
End With
End Sub
Code này thì những dòng như A12 là La0.6Pr0.1Ba0.3MnO3 sẽ không tách được cột Mn riêng và O3 riêng bạn à.
 
Lần chỉnh sửa cuối:
Đoán đại

---
Các số dính liền được coi là thiếu ký tự => Ô kết quả để trống
Mã:
Sub tach()
Dim nguon
Dim tam
Dim kq
Dim rws, cls
Dim i, j, k, x, z, t

nguon = Sheet1.Range("A3", Sheet1.Range("A3").End(xlDown))
rws = UBound(nguon)
ReDim kq(1 To rws, 1 To 1)
For i = 1 To rws
    tam = Split(Replace(Left(nguon(i, 1), Len(nguon(i, 1)) - 2), "0.", " 0."))
    cls = UBound(tam)
    If UBound(kq, 2) < cls * 2 Then ReDim Preserve kq(1 To rws, 1 To cls * 2)
    kq(i, 1) = tam(0)
    k = 2
    For j = 1 To cls
        If IsNumeric(tam(j)) Then
            kq(i, k) = tam(j)
          
        Else
            For z = 3 To Len(tam(j))
                If IsNumeric(Mid(tam(j), z, 1)) = False Then
                    kq(i, k) = Left(tam(j), z - 1)
                    kq(i, k + 1) = Right(tam(j), Len(tam(j)) - z + 1)
                    Exit For
                End If
            Next z
        End If
        k = k + 2
    Next j
Next i
With Sheet1
    .Range("C3").Resize(UBound(kq), UBound(kq, 2)).Clear
    .Range("C3").Resize(UBound(kq), UBound(kq, 2)) = kq
    .Range("C3").Resize(UBound(kq), UBound(kq, 2)).Columns.AutoFit
End With
End Sub
code của b là đúng cái em cần nhất, em cảm ơn nhé
 
Web KT
Back
Top Bottom