Cần hỗ trợ code tách chuổi ra từng ký tự riêng biệt

Liên hệ QC

hunglam123

Thành viên bị đình chỉ hoạt động
Thành viên bị đình chỉ hoạt động
Tham gia
31/3/20
Bài viết
180
Được thích
43
Ví dụ tại ô B3 là 1 chuổi ( cái này là Text hoặc số và không có dấu tiếng việt ). Em muốn tách ra từng ký tự sang cột D ( bắt đầu từ ô D3 ). Mong mọi người giúp đỡ, Em xin chân thành cảm ơn Ạ
Công thức thì mình biết làm rồi. mình cần code để mình tự điều chỉnh được Đầu vào và đầu ra
Chuổi cần tách có bao nhiêu ký tự < 100 ký tự


1585819140627.png
 

File đính kèm

  • tach.xlsx
    9.8 KB · Đọc: 4
Lần chỉnh sửa cuối:
Bạn có thể sử dụng công thức đơn giản thay vì code:

=MID($B$3,ROW(A1),1)
=MID($B$3,ROW(A2),1)
 
Upvote 0
Ví dụ tại ô B3 là 1 chuổi ( cái này là Text hoặc số và không có dấu tiếng việt ). Em muốn tách ra từng ký tự sang cột D ( bắt đầu từ ô D3 ). Mong mọi người giúp đỡ, Em xin chân thành cảm ơn Ạ


View attachment 234576
Hình như đã có nhắc bạn là đính kèm file thay vì 1 cái hình.
Bạn cứ chờ sẽ có thành viên rảnh rỗi tạo file mẫu rồi viết code.
 
Upvote 0
Bạn có thể sử dụng công thức đơn giản thay vì code:

=MID($B$3,ROW(A1),1)
=MID($B$3,ROW(A2),1)

cảm ơn anh. nói chung công thức thì em làm được rồi. ý em hỏi code tại vì sau này em thay đổi vị tri B3 và thay đổi vị trí D3. Mong anh giúp em 1 đoạn code tổng quát. để em tự thay đổi được địa chỉ đầu vào và đầu ra
Bài đã được tự động gộp:

Hình như đã có nhắc bạn là đính kèm file thay vì 1 cái hình.
Bạn cứ chờ sẽ có thành viên rảnh rỗi tạo file mẫu rồi viết code.
dạ em quên Thầy ơi. em xin lổi thầy. Em đã kèm File rồi thầy ạ
 

File đính kèm

  • tach.xlsx
    9.8 KB · Đọc: 4
Upvote 0
Hình như đã có nhắc bạn là đính kèm file thay vì 1 cái hình.
Bạn cứ chờ sẽ có thành viên rảnh rỗi tạo file mẫu rồi viết code.
Nếu không chỉ riêng có 1 Cell B3 mà còn dài dài xuống nữa B3, B4...Bn và không phải 1 Cell có đúng 7 chuổi mà có thể là 6 hoặc 8 thì sao?
Nếu giải xong thì anh ơi của em nó thế này, dữ liệu của em nó thế nọ và dữ liệu không đồng nhất thì tính làm sao?
Chủ Topic hỏi nữa vời nên chạy trước cho chắc ăn.
 
Upvote 0
Nếu không chỉ riêng có 1 Cell B3 mà còn dài dài xuống nữa B3, B4...Bn và không phải 1 Cell có đúng 7 chuổi mà có thể là 6 hoặc 8 thì sao?
Nếu giải xong thì anh ơi của em nó thế này, dữ liệu của em nó thế nọ và không đồng nhất thì tính làm sao?
Chủ Topic hỏi nữa vời nên chạy trước cho chắc ăn.

Tiêu để em ghi rất rõ anh nhé. Chỉ duy nhất 1 ô tách sang nhiều ô. Chuổi cần tách là Chử và Số ( Không dấu tiếng việt ) <100 ký tự Anh nhé . Và chỉ có tách đúng 1 ô thôi B3 hoặc ô nào đó thỉ chỉ cần thay đổi đầu vào của Code
 
Upvote 0
Ví dụ tại ô B3 là 1 chuổi ( cái này là Text hoặc số và không có dấu tiếng việt ). Em muốn tách ra từng ký tự sang cột D ( bắt đầu từ ô D3 ). Mong mọi người giúp đỡ, Em xin chân thành cảm ơn Ạ
Công thức thì mình biết làm rồi. mình cần code để mình tự điều chỉnh được Đầu vào và đầu ra
Chuổi cần tách có bao nhiêu ký tự < 100 ký tự


View attachment 234576
Mã:
Sub Tach()
Dim Text
Dim Kq
Dim i, j, k
With Sheet1
    j = .Range("E1000000").End(xlUp).Row
    Text = .Range("B3")
    k = Len(Text)
    ReDim Kq(1 To k, 1 To 1)
    For i = 1 To k
        Kq(i, 1) = Mid(Text, i, 1)
    Next i
    If j < 4 Then j = 4
    .Range("E4:E" & j).ClearContents
    .Range("E4").Resize(k, 1) = Kq
End With
End Sub
 
Upvote 0
Mã:
Sub Tach()
Dim Text
Dim Kq
Dim i, j, k
With Sheet1
    j = .Range("E1000000").End(xlUp).Row
    Text = .Range("B3")
    k = Len(Text)
    ReDim Kq(1 To k, 1 To 1)
    For i = 1 To k
        Kq(i, 1) = Mid(Text, i, 1)
    Next i
    If j < 4 Then j = 4
    .Range("E4:E" & j).ClearContents
    .Range("E4").Resize(k, 1) = Kq
End With
End Sub
Cảm ơn bạn . mình đã hiểu. Mình có sữa lại 1 số đoạn để cho mình để thay đổi địa chỉ
Mã:
Sub Tach()
Dim i, k, Kq, Text
    Text = Range("B3") ' Input
    k = Len(Text)
    ReDim Kq(1 To k, 1 To 1)
    For i = 1 To k
        Kq(i, 1) = Mid(Text, i, 1)
    Next i
    
    Range("E4:E26").ClearContents  ' lam sach
    Range("E4").Resize(k, 1) = Kq ' ouput

End Sub
 
Upvote 0
Lúc nào thích mới tách, hay là muốn tách mỗi khi có dữ liệu mới?
 
Upvote 0
cảm ơn anh. nói chung công thức thì em làm được rồi. ý em hỏi code tại vì sau này em thay đổi vị tri B3 và thay đổi vị trí D3. Mong anh giúp em 1 đoạn code tổng quát. để em tự thay đổi được địa chỉ đầu vào và đầu ra
-------------------


Code tham khảo:

=SplitText("2/4/2020")

Đây là hàm mảng được viết theo kiểu trực tiếp cho Excel
-----------------------------
PHP:
Option Explicit
#If VBA7 Then
  Private Declare PtrSafe Function SetTimer Lib "user32" (ByVal hwnd As LongPtr, ByVal nIDEvent As LongPtr, ByVal uElapse As Long, ByVal lpTimerFunc As LongPtr) As LongPtr
  Private Declare PtrSafe Function KillTimer Lib "user32" (ByVal hwnd As LongPtr, ByVal nIDEvent As LongPtr) As Long
#Else
  Private Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
  Private Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
#End If
'//////////////////////////////////////////////////////////////
#If Win64 Then
  Private Pri_TimerID As LongPtr
#Else
  Private Pri_TimerID As Long
#End If
Public Function SplitText(Optional ByVal Expression As String) As String
  If Len(Expression) = 0 Then Exit Function
  On Error Resume Next
  If Pri_TimerID <> 0 Then KillTimer 0&, Pri_TimerID
  Static RA As Range, S As String
  If VBA.TypeName(Application.Caller) = "Range" Then
    SplitText = VBA.Left(Expression, 1)
    If Len(Expression) > 1 Then
      S = VBA.Mid(Expression, 2)
      Set RA = Application.Caller
      Pri_TimerID = SetTimer(0&, 0&, 0, AddressOf SplitText_callback)
    End If
  Else
    Dim I As Integer, L As Integer
    L = Len(S)
    ReDim A(1 To L, 1 To 1)
    For I = 1 To L: A(I, 1) = VBA.Mid(S, I, 1): Next
    RA(2, 1).Resize(65535).ClearContents
    RA(2, 1).Resize(L) = A
    S = ""
    Set RA = Nothing
  End If
End Function
Private Sub SplitText_callback(): Call SplitText: End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
-------------------


Code tham khảo:

=SplitText("2/4/2020")

Đây là hàm mảng được viết theo kiểu trực tiếp cho Excel, hàm này không sử dụng được trong Macro.
-----------------------------
PHP:
Option Explicit
#If VBA7 Then
  Private Declare PtrSafe Function SetTimer Lib "user32" (ByVal hwnd As LongPtr, ByVal nIDEvent As LongPtr, ByVal uElapse As Long, ByVal lpTimerFunc As LongPtr) As LongPtr
  Private Declare PtrSafe Function KillTimer Lib "user32" (ByVal hwnd As LongPtr, ByVal nIDEvent As LongPtr) As Long
#Else
  Private Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
  Private Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
#End If
'//////////////////////////////////////////////////////////////
#If Win64 Then
  Private Pri_TimerID As LongPtr
#Else
  Private Pri_TimerID As Long
#End If
Public Function SplitText(Optional ByVal Expression As String) As String
  If Len(Expression) = 0 Then Exit Function
  On Error Resume Next
  If Pri_TimerID <> 0 Then KillTimer 0&, Pri_TimerID
  Static RA As Range, S As String
  If VBA.TypeName(Application.Caller) = "Range" Then
    SplitText = VBA.Left(Expression, 1)
    If Len(Expression) > 1 Then
      S = VBA.Mid(Expression, 2)
      Set RA = Application.Caller
      Pri_TimerID = SetTimer(0&, 0&, 0, AddressOf SplitText_callback)
    End If
  Else
    Dim I As Integer, L As Integer
    L = Len(S)
    ReDim A(1 To L, 1 To 1)
    For I = 1 To L: A(I, 1) = VBA.Mid(S, I, 1): Next
    RA(2, 1).Resize(65535).ClearContents
    RA(2, 1).Resize(L) = A
    S = ""
    Set RA = Nothing
  End If
End Function
Private Sub SplitText_callback(): Call SplitText: End Sub

Mã:
Sub TACHA()
Dim k As Long, so As String
so = Range("a1").Value

For k = 1 To Len(so)
       Range("b" & k).Value = Mid(so, k, 1)
Next k

End Sub
Bài đã được tự động gộp:

Lúc nào thích mới tách, hay là muốn tách mỗi khi có dữ liệu mới?

Mã:
Sub TACHA()
Dim k As Long, so As String
so = Range("a1").Value

For k = 1 To Len(so)
       Range("b" & k).Value = Mid(so, k, 1)
Next k

End Sub
Bài đã được tự động gộp:

Mã:
Sub Tach()
Dim Text
Dim Kq
Dim i, j, k
With Sheet1
    j = .Range("E1000000").End(xlUp).Row
    Text = .Range("B3")
    k = Len(Text)
    ReDim Kq(1 To k, 1 To 1)
    For i = 1 To k
        Kq(i, 1) = Mid(Text, i, 1)
    Next i
    If j < 4 Then j = 4
    .Range("E4:E" & j).ClearContents
    .Range("E4").Resize(k, 1) = Kq
End With
End Sub
Cái này đơn giản hơn nek anh

Mã:
Sub TACHA()
Dim k As Long, so As String
so = Range("a1").Value

For k = 1 To Len(so)
       Range("b" & k).Value = Mid(so, k, 1)
Next k

End Sub
 
Upvote 0
Cái này ở diễn đàn đã có nhiều code chuyển chuỗi thành mảng. Bi giờ chỉ việc copy mảng ra chỗ cần bằng Appplication.Transpose
Chuỗi có giới hạn ngắn, lại là chuỗi ASSCII, code rất là đơn giản.

Vấn đề chỉ là thớt muốn thực hiện ra sao thôi.
Sub NgangThanhDoc(byVal Src As Range, byVal Des As Range)
' chẻ chuỗi ở Src ra từng ký tự và chép chúng vào ô bắt đầu ở Des
Dim a
a = Split(StrConv(Src.Value, vbUnicode), Chr(0)) ' phần tử cuối sẽ là ""
Redim Preserve a(UBound(a)-1)
Des.Resize(Des.End(xlDown).Row - Des.Row + 1, 1).Clearcontents ' clear kết quả trước
Des.Resize(UBound(a)-LBound(a)+1) = Application.Transpose(a)

End Sub

Code chỉ minh hoạ phần chép kết quả ra thôi (tô đậm). Phần đổi chuỗi thành mảng ai thích gì dùng nấy.
 
Upvote 0
Bạn ấy làm bên y tế, quen cầm bơm tiêm để tiêm vào mông bệnh nhân thôi, không phải học sinh.
Bạn ấy đang cần việc trên để hỗ trợ công việc trong khu cách ly.

 
Upvote 0
Bạn ấy làm bên y tế, quen cầm bơm tiêm để tiêm vào mông bệnh nhân thôi, không phải học sinh.
Bạn ấy đang cần việc trên để hỗ trợ công việc trong khu cách ly.
...
Hình như không có cầm bơm tiêm đâu. Theo xu hướng mấy bài hỏi thì có lẽ gần gủi với người quen cầm si mát phôn, ngồi xe máy lạnh,...
 
Upvote 0
Web KT
Back
Top Bottom