Tách chữ số

Liên hệ QC

sep_hatxel

Thành viên thường trực
Tham gia
24/5/10
Bài viết
217
Được thích
7
Mọi người giúp đỡ mình với! Mình có một bảng dữ liệu ở sheet1 cần tách thành từng chữ số sang sheet2 theo 1 cột! Mình cần tách ra từng chữ số ở sheet1 theo thứ tự từ trái sang phải và từ trên xuống dưới! Mình nhập minh hoạ ví dụ ở file gửi kèm! Những số nhập ở sheet1 là tuỳ ý! Mong GPE giúp đỡ! Cảm ơn nhiều!
 

File đính kèm

Mọi người giúp đỡ mình với! Mình có một bảng dữ liệu ở sheet1 cần tách thành từng chữ số sang sheet2 theo 1 cột! Mình cần tách ra từng chữ số ở sheet1 theo thứ tự từ trái sang phải và từ trên xuống dưới! Mình nhập minh hoạ ví dụ ở file gửi kèm! Những số nhập ở sheet1 là tuỳ ý! Mong GPE giúp đỡ! Cảm ơn nhiều!
Bạn thử sử dụng code này nhé:
PHP:
Sub TachSo()
    Dim S As String, Cll As Range
    For Each Cll In Range(Sheet1.[A2], Sheet1.[A65536].End(xlUp))
        S = S & Cll
    Next Cll
    S = Replace(S, ".", "")
    For i = 1 To Len(S)
        Sheet2.Cells(i, 1) = Mid(S, i, 1)
    Next i
End Sub
 
Upvote 0
Bạn thử sử dụng code này nhé:
PHP:
Sub TachSo()
    Dim S As String, Cll As Range
    For Each Cll In Range(Sheet1.[A2], Sheet1.[A65536].End(xlUp))
        S = S & Cll
    Next Cll
    S = Replace(S, ".", "")
    For i = 1 To Len(S)
        Sheet2.Cells(i, 1) = Mid(S, i, 1)
    Next i
End Sub
Bạn nên cho mọi thứ lọc được vào mảng, sau đó gán 1 lần vào sheet kết quả, nếu không thì tốc độ sẽ rất chậm (với dữ liệu lớn, mà dùng For theo cách thông thường, e rằng phải đi ngủ 1 giấc mới xong)
 
Upvote 0
Mọi người giúp đỡ mình với! Mình có một bảng dữ liệu ở sheet1 cần tách thành từng chữ số sang sheet2 theo 1 cột! Mình cần tách ra từng chữ số ở sheet1 theo thứ tự từ trái sang phải và từ trên xuống dưới! Mình nhập minh hoạ ví dụ ở file gửi kèm! Những số nhập ở sheet1 là tuỳ ý! Mong GPE giúp đỡ! Cảm ơn nhiều!
Nếu bạn không thích Macro thì làm cách này:
- Dùng một cột phụ và nhập công thức này vào:
Mã:
=TEXT(SUBSTITUTE(A1,".",""),REPT("0 ",LEN(SUBSTITUTE(A1,".",""))))
- Chú ý dấu "." trong hàm SUBSTITUTE() nha. Đó là dấu phân cách thập phân. Nếu máy bạn dùng dấu thập phân là dấu khác thì sửa lại cho phù hợp.
- Copy kết quả cột phụ và dán giá trị lại.
- Kéo hẹp độ rộng cột phụ lại (kéo sao cho nhỏ hơn độ rộng của 1 ký tự là được) và dùng chức năng Justify
 
Upvote 0
Bạn dùng hàm sau tốc độ nhanh hơn gần 3 lần của Nghianphuc:
Mã:
Sub SplitNum()
Dim chuoi, chuoi1, i
chuoi = Join(WorksheetFunction.Transpose(Range(Sheet1.[A2], Sheet1.[A65536].End(xlUp))), "")
chuoi = Replace(chuoi, ".", "")
For i = 1 To Len(chuoi)
chuoi1 = chuoi1 & Mid(chuoi, i, 1) & ";"
Next
Sheet2.[a1].Resize(Len(chuoi)) = WorksheetFunction.Transpose(Split(chuoi1, ";"))
End Sub
 
Upvote 0
Nếu thêm miếng mắm muối "zô" code của Thầy Sealand nó chạy "mát trời ông địa" luôn
Mã:
Sub TachSo()
    Dim S As String, Cll As Range, i, Mg(), Chu
        S = Join(WorksheetFunction.Transpose(Range(Sheet1.[A2], Sheet1.[A65536].End(xlUp))), "")
        S = Replace(S, ".", "")
            ReDim Mg(Len(S), 1)
                For i = 1 To Len(S)
                    Chu = Mid(S, i, 1)
                    Mg(i, 1) = Chu
                Next i
        Sheet2.[c1].Resize(Len(S)) = Mg
 End Sub
 
Upvote 0
Code khủng

Tốc độ cở này hổng biết đã MAX chưa ta?
PHP:
Sub SplitNum()
  Dim Text As String, Arr, n As Long, TG As Double
  TG = Timer
  With Sheet1.Range(Sheet1.[A2], Sheet1.[A65536].End(xlUp))
    Text = Join(WorksheetFunction.Transpose(.Cells), "")
    Text = Replace(Replace(Text, ".", ""), " ", "")
  End With
  n = IIf(Len(Text) > 65535, 65535, Len(Text))
  Text = Left(Text, n)
  Arr = Split(StrConv(Text, 64), Chr(0))
  Sheet2.[A1].Resize(n) = WorksheetFunction.Transpose(Arr)
  MsgBox Timer - TG
End Sub
65535 dòng trong thời gian 0.2s
 

File đính kèm

Upvote 0
Nhân đây xin "đố vui" 1 chút về code trên:
- Các bạn để ý thấy biến n trong code trên chỉ cho phép MAX = 65535 mà thôi (65536 trở đi sẽ lỗi)
- Tức với code trên, cùng lắm ta chỉ trích ra được có 65535 dòng (thừa 1 dòng cuối)
Vậy xin hỏi: Có cách nào "xơi" luôn đến 65536 dòng hay không?
Ẹc... Ẹc..
 
Upvote 0
Nhân đây xin "đố vui" 1 chút về code trên:
- Các bạn để ý thấy biến n trong code trên chỉ cho phép MAX = 65535 mà thôi (65536 trở đi sẽ lỗi)
- Tức với code trên, cùng lắm ta chỉ trích ra được có 65535 dòng (thừa 1 dòng cuối)
Vậy xin hỏi: Có cách nào "xơi" luôn đến 65536 dòng hay không?
Ẹc... Ẹc..
1- n = IIf(Len(Text) > 65535, 65535, Len(Text))
Đổi thành IIf(Len(Text) <=65536, 65536, Len(Text))

2- Câu hỏi này.......sai box
Hihi
 
Upvote 0
nhân đây xin "đố vui" 1 chút về code trên:
- các bạn để ý thấy biến n trong code trên chỉ cho phép max = 65535 mà thôi (65536 trở đi sẽ lỗi)
- tức với code trên, cùng lắm ta chỉ trích ra được có 65535 dòng (thừa 1 dòng cuối)
vậy xin hỏi: Có cách nào "xơi" luôn đến 65536 dòng hay không?
ẹc... ẹc..

nếu bác muốn thêm thì dùng 2007 trở lên thì được hơn 63535 row. Do 2003 chỉ có 65536 rows là hết rồi
anh bill trừ lại 1 row để thở . Mà cho dù bác có dùng 2007 cũng vẫn còn 1 row
không biết có đúng không ?
CHết lại nhầm nữa rồi
 
Upvote 0
1- n = IIf(Len(Text) > 65535, 65535, Len(Text))
Đổi thành IIf(Len(Text) <=65536, 65536, Len(Text))
Đâu có được anh! Anh sửa thế nó lỗi ngay lập tức ---> Thế mới có chuyện bàn chứ
2- Câu hỏi này.......sai box
Hihi
Cũng không hẳn là SAI BOX, vì ý em muốn bàn về giải pháp tối ưu code thôi (mọi sự luôn hướng đến tính hoàn hảo)
-------------------------------

nếu bác muốn thêm thì dùng 2007 trở lên thì được hơn 63535 row. Do 2003 chỉ có 65536 rows là hết rồi
anh bill trừ lại 1 row để thở . Mà cho dù bác có dùng 2007 cũng vẫn còn 1 row
không biết có đúng không ?
Có cách thì tôi mới nói chứ... Ẹc... Ẹc...
Mấu chốt vấn đề là tìm hiểu tại sao thay số 65535 thành 65536 thì lại lỗi ---> Hiểu được sẽ tìm ra được giải pháp (đương nhiên tôi đang nói với Excel 2003)
 
Lần chỉnh sửa cuối:
Upvote 0
Nhân đây xin "đố vui" 1 chút về code trên:
- Các bạn để ý thấy biến n trong code trên chỉ cho phép MAX = 65535 mà thôi (65536 trở đi sẽ lỗi)
- Tức với code trên, cùng lắm ta chỉ trích ra được có 65535 dòng (thừa 1 dòng cuối)
Vậy xin hỏi: Có cách nào "xơi" luôn đến 65536 dòng hay không?
Ẹc... Ẹc..
Có code "củ chuối" này thấy nó làm được, không biết có đúng nguyên tắc không.
PHP:
Sub SplitNum()
  Dim Text As String, Arr, n As Long, m As Byte, TG As Double
  TG = Timer
  With Sheet1.Range(Sheet1.[A2], Sheet1.[A65536].End(xlUp))
    Text = Join(WorksheetFunction.Transpose(.Cells), "")
    Text = Replace(Replace(Text, ".", ""), " ", "")
  End With
  m = IIf(Len(Text) > 65535, Mid(Text, 65536, 1), 0)
  n = IIf(Len(Text) > 65535, 65535, Len(Text))
  Text = Left(Text, n)
  Arr = Split(StrConv(Text, 64), Chr(0))
  Sheet2.[A1:A65536].ClearContents
  Sheet2.[A1].Resize(n) = WorksheetFunction.Transpose(Arr)
  If m > 0 Then
  Sheet2.[A65536] = m
  End If
  MsgBox Timer - TG
End Sub
 
Upvote 0
Có code "củ chuối" này thấy nó làm được, không biết có đúng nguyên tắc không.
PHP:
Sub SplitNum()
  Dim Text As String, Arr, n As Long, m As Byte, TG As Double
  TG = Timer
  With Sheet1.Range(Sheet1.[A2], Sheet1.[A65536].End(xlUp))
    Text = Join(WorksheetFunction.Transpose(.Cells), "")
    Text = Replace(Replace(Text, ".", ""), " ", "")
  End With
  m = IIf(Len(Text) > 65535, Mid(Text, 65536, 1), 0)
  n = IIf(Len(Text) > 65535, 65535, Len(Text))
  Text = Left(Text, n)
  Arr = Split(StrConv(Text, 64), Chr(0))
  Sheet2.[A1:A65536].ClearContents
  Sheet2.[A1].Resize(n) = WorksheetFunction.Transpose(Arr)
  If m > 0 Then
  Sheet2.[A65536] = m
  End If
  MsgBox Timer - TG
End Sub
Thật ra nếu hiểu hàm Split(StrConv(Text, 64), Chr(0)) thì sẽ dễ dàng tìm ra giải pháp ---> Nó tạo ra 1 mảng mà phần tử cuối cùng là rổng ---> Khi ta có chuổi có độ dài 65536 ký tự thì qua hàm trên sẽ cho kết quả 65567 phần tử (có thể thí nghiệm bằng lệnh MsgBox UBound(Arr) )
Vậy nên ta chỉ cần ReDim Preserve Arr(n - 1) là xong
Cụ thế:
PHP:
Sub SplitNum()
  Dim Text As String, Arr, n As Long, TG As Double
  TG = Timer
  With Sheet1.Range(Sheet1.[A2], Sheet1.[A65536].End(xlUp))
    Text = Join(WorksheetFunction.Transpose(.Cells), "")
    Text = Replace(Replace(Text, ".", ""), " ", "")
  End With
  n = IIf(Len(Text) > Cells.Rows.Count, Cells.Rows.Count, Len(Text))
  Text = Left(Text, n)
  Arr = Split(StrConv(Text, 64), Chr(0))
  MsgBox UBound(Arr)
  ReDim Preserve Arr(n - 1)
  Sheet2.[A1].Resize(n) = WorksheetFunction.Transpose(Arr)
  MsgBox Timer - TG
End Sub
 
Upvote 0
Đâu có được anh! Anh sửa thế nó lỗi ngay lập tức ---> Thế mới có chuyện bàn chứ

Cũng không hẳn là SAI BOX, vì ý em muốn bàn về giải pháp tối ưu code thôi (mọi sự luôn hướng đến tính hoàn hảo)
-------------------------------

Có cách thì tôi mới nói chứ... Ẹc... Ẹc...
Mấu chốt vấn đề là tìm hiểu tại sao thay số 65535 thành 65536 thì lại lỗi ---> Hiểu được sẽ tìm ra được giải pháp (đương nhiên tôi đang nói với Excel 2003)
thì tôi thêm tý vào nè
PHP:
Sub SplitNum()
Dim Text As String, Arr, n As Long, TG As Double
TG = Timer
With Sheet1.Range(Sheet1.[A2], Sheet1.[A65536].End(xlUp))
Text = Join(WorksheetFunction.Transpose(.Cells), "")
Text = Replace(Replace(Text, ".", ""), " ", "")
End With
n = IIf(Len(Text) > 65535, 65535, Len(Text))
Text = Left(Text, n)
Arr = Split(StrConv(Text, 64), Chr(0))
Sheet2.[A1].Resize(n) = WorksheetFunction.Transpose(Arr)
If n > 65535 Then
Sheet2.[A65536] = Left(n, 1)
End If
MsgBox Timer - TG
End Sub
không biết có đúng không ?
 
Lần chỉnh sửa cuối:
Upvote 0
thì tôi thêm tý vào nè
Sub SplitNum()
Dim Text As String, Arr, n As Long, TG As Double
TG = Timer
With Sheet1.Range(Sheet1.[A2], Sheet1.[A65536].End(xlUp))
Text = Join(WorksheetFunction.Transpose(.Cells), "")
Text = Replace(Replace(Text, ".", ""), " ", "")
End With
n = IIf(Len(Text) > 65535, 65535, Len(Text))
Text = Left(Text, n)
Arr = Split(StrConv(Text, 64), Chr(0))
Sheet2.[A1].Resize(n) = WorksheetFunction.Transpose(Arr)
If n > 65535 Then
Sheet2.[A65536] = Left(n, 1)
End If
MsgBox Timer - TG
End Sub
không biết có đúng không ?
Vì đoạn code trên:
n = IIf(Len(Text) > 65535, 65535, Len(Text))
nên n luôn luôn <= 65535
Và do đó, đoạn dưới
If n > 65535 Then
hoàn toàn không có ý nghĩa gì
 
Upvote 0
Mình có files dữ liệu dính kèm muốn nhớ các chuyên gia GPE chỉ giáo mình muốn thay thế dữ liệu ở cột A thành dữ liệu ở cột B.
Cảm ơn các bạn nhiều!
 

File đính kèm

Upvote 0
Mình có files dữ liệu dính kèm muốn nhớ các chuyên gia GPE chỉ giáo mình muốn thay thế dữ liệu ở cột A thành dữ liệu ở cột B.
Cảm ơn các bạn nhiều!
Cái vụ này cũng hơi bị "lạ", làm thí đại bằng công thức rồi tính sau nhé.
(Xem Cột I)
------------
Mà hình như bài này bị post sai chỗ thì phải?
 

File đính kèm

Upvote 0
Cái vụ này cũng hơi bị "lạ", làm thí đại bằng công thức rồi tính sau nhé.
(Xem Cột I)
------------
Mà hình như bài này bị post sai chỗ thì phải?

Cám ơn Ba Tê nhiều, công thức này viết rất ok đạt theo yêu cầu.Mình chỉ cần thế là tốt rồi viết cao siêu hơn nữa thì bó tay luôn.
 
Upvote 0
Cái vụ này cũng hơi bị "lạ", làm thí đại bằng công thức rồi tính sau nhé.
(Xem Cột I)
------------
Mà hình như bài này bị post sai chỗ thì phải?
Công thức Bạn Ba Tê viết lấy ra kết quả đúng nhưng ở đây mình chỉ đính chính lại chút xíu là cột C và cột D là không có. Mình chỉ giải thích thôi chứ
không phải lấy trong vùng bôi vàng để dò tìm đâu.
Bạn thử nghiên cứu viết lại xem sao.Cảm ơn bạn nhiều!
 
Upvote 0
Công thức Bạn Ba Tê viết lấy ra kết quả đúng nhưng ở đây mình chỉ đính chính lại chút xíu là cột C và cột D là không có. Mình chỉ giải thích thôi chứ
không phải lấy trong vùng bôi vàng để dò tìm đâu.
Bạn thử nghiên cứu viết lại xem sao.Cảm ơn bạn nhiều!
Đổi công thức:
PHP:
=IF(AND(--MID(A1;2;2)>=70;--MID(A1;2;2)<=75);"_"&VLOOKUP(--MID(A1;2;2);$C$2:$D$7;2;0) & --MID(A1;5;2)&"%"& MID(A1;7;3);A1)
thành thế này xem sao:
PHP:
=IF(AND(--MID(A1;2;2)>=70;--MID(A1;2;2)<=75);"_" & LOOKUP(--MID(A1;2;2);{70;71;72;73;74;75};{"P";"Q";"R";"S";"T";"U"}) & --MID(A1;5;2)&"%"& MID(A1;7;3);A1)
Chú ý dấu { }, các dấu chấm phẩy hoặc dấu phẩy là tùy theo từng máy tính.
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom