Nhờ giúp đỡ: VBA - tách dữ liệu số trong ô cell thành cột mà không dùng function split

Liên hệ QC

mira1225

Thành viên mới
Tham gia
21/2/22
Bài viết
9
Được thích
0
Chào cả nhà
Em đang gặp khó khi xử lý code VBA tạo chức năng split dữ liệu (như file đính kèm) mà trong quy định không được dùng function split...Em có tham khảo các mã code anh chị trên diễn đàn dùng trước đó đều có dùng split()
Nhờ cả nhà chỉ giáo giúp em có cách nào tách dữ liệu mà ko sài chức năng split() ko
Em cảm ơn nhiều
 

File đính kèm

  • TOPIC 17 - Website Speed - Data.xlsx
    10.7 KB · Đọc: 37
Chào cả nhà
Em đang gặp khó khi xử lý code VBA tạo chức năng split dữ liệu (như file đính kèm) mà trong quy định không được dùng function split...Em có tham khảo các mã code anh chị trên diễn đàn dùng trước đó đều có dùng split()
Nhờ cả nhà chỉ giáo giúp em có cách nào tách dữ liệu mà ko sài chức năng split() ko
Em cảm ơn nhiều
Thử code này xem:
Mã:
Option Explicit

Sub KhongSplit()
Dim sArr(), dArr(), sU1 As Long, I As Long, J As Long
Dim Val As String, Pos1 As Long, Pos2 As Long
With Sheets("Website 1")
    sArr = .Range("A1", .Cells(Rows.Count, "A").End(xlUp)).Value
    sU1 = UBound(sArr, 1)
    ReDim dArr(1 To sU1, 1 To 3)
    For I = 1 To sU1
        J = Len(sArr(I, 1)) - Len(Replace(sArr(I, 1), ";", ""))
        If J + 1 > UBound(dArr, 2) Then ReDim Preserve dArr(1 To sU1, 1 To J + 3)
        J = 0
        Val = ";" & sArr(I, 1) & ";"
        Pos1 = 1
        Do
            Pos2 = InStr(Pos1 + 1, Val, ";")
            If Pos2 = 0 Then Exit Do
            J = J + 1
            dArr(I, J) = Mid(Val, Pos1 + 1, Pos2 - Pos1 - 1)
            Pos1 = Pos2
        Loop
    Next
    .Range("B1").Resize(10000, UBound(dArr, 2)).ClearContents
    .Range("B1").Resize(sU1, UBound(dArr, 2)) = dArr
End With
End Sub
 
Upvote 0
PHP:
...
 
Lần chỉnh sửa cuối:
Upvote 0
. . . . khi xử lý code VBA tạo chức năng split dữ liệu (như file đính kèm) mà trong quy định không được dùng function split...Em có tham khảo các mã code anh chị trên diễn đàn dùng trước đó đều có dùng split()
Cái "trong qui định" của bạn không thể đem áp đặt cho GPE.COM
Hay là bạn ra đề bài đánh đố diễn đàn đó nhỉ?
 
Upvote 0
Chào cả nhà
Em đang gặp khó khi xử lý code VBA tạo chức năng split dữ liệu (như file đính kèm) mà trong quy định không được dùng function split...Em có tham khảo các mã code anh chị trên diễn đàn dùng trước đó đều có dùng split()
Nhờ cả nhà chỉ giáo giúp em có cách nào tách dữ liệu mà ko sài chức năng split() ko
Em cảm ơn nhiều
............................................
Mã:
Option Explicit

Sub Macro1()
With Sheets("Website 1")
    .Range("A1", .Range("A1").End(xlDown)).Select
    Selection.TextToColumns Destination:=Range("C1"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
        Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar _
        :=";", FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1)), _
        TrailingMinusNumbers:=True
End With
End Sub
 
Upvote 0
Chứng tỏ chưa tham khảo hết.
Tham khảo cẩu thả, dối trá. Khong biết rằng muốn nhận được trả lời của gu-ru thì phải tránh viết tắt.
Tuy nhiên, phải nhìn nhận rằng có tham khảo về hiện tượng đói bài. Một vấn đề nghịch lý (*1) thế mà cũng có khối người code thử.

Cái "trong qui định" của bạn không thể đem áp đặt cho GPE.COM
Hay là bạn ra đề bài đánh đố diễn đàn đó nhỉ?
Đánh đố đứt đuôi rồi chứ còn gì nữa.
Nhưng ở đây là để loè bạn gái, hoặc đánh cá trên bàn nhậu. Chứ chắc chắc không thực tế rồi.

(*1) nếu là những cái bên ngoài như "đít sần", "ADO", "RegEx", ... thì có thể biện hộ lý do không dùng. Bởi chúng phụ thuộc vào nền tảng và môi trường.
Split là hàm chân chính của VBA. Trước mắt là nó hiệu quả gấp bội lần các code thay thế - trừ phi người viết rất giỏi về cách lái hàm theo dữ liệu. Không dùng nó là tự làm khó mình.

(*2) lái hàm theo dữ liệu để tối ưu hoá hiệu quả: tôi không tin là trên GPE này có người đạt trình độ này, kể cả tôi. Ở đây có một tay rất giỏi về tối ưu hoá code, và có khả năng viết các hàm phụ bằng ngôn ngữ tối ưu. Nhưng tôi không tin là ngwoif này đủ kinh nghiệm về dữ liệu để "nắn" hàm.
 
Upvote 0
Chào cả nhà
Em đang gặp khó khi xử lý code VBA tạo chức năng split dữ liệu (như file đính kèm) mà trong quy định không được dùng function split...Em có tham khảo các mã code anh chị trên diễn đàn dùng trước đó đều có dùng split()
Nhờ cả nhà chỉ giáo giúp em có cách nào tách dữ liệu mà ko sài chức năng split() ko
Em cảm ơn nhiều
Mình thắc mắc tại sao bạn lại không muốn dùng hàm Split.
Tuy nhiên với yêu cầu của bạn cũng chỉ là trò chơi ABC thôi
Mã:
Sub Tach_Khong_Split()
Columns("A:A").TextToColumns Range("B1"), xlDelimited
End Sub
****************
Gởi bài rồi mới thấy bài số 6 có cùng cách xử lý
Bài đã được tự động gộp:

Cái "trong qui định" của bạn không thể đem áp đặt cho GPE.COM
Hay là bạn ra đề bài đánh đố diễn đàn đó nhỉ?
Bớt khó chút đi bác. Kệ đi. Cuối cùng cũng đều như nhau thôi mà.
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn @Nhattanktnn đã hỗ trợ, chắc em thiếu sót trong câu hỏi vì đề bài yêu cầu không dùng Excel function luôn ạ. Có thể đây là một câu hỏi cơ bản nhưng vì mới học VBA nên rất mong cả nhà hỗ trợ.
Trong code @Nhattanktnn chia sẻ lại có InStr() ạ ...
Thử code này xem:
Mã:
Option Explicit

Sub KhongSplit()
Dim sArr(), dArr(), sU1 As Long, I As Long, J As Long
Dim Val As String, Pos1 As Long, Pos2 As Long
With Sheets("Website 1")
    sArr = .Range("A1", .Cells(Rows.Count, "A").End(xlUp)).Value
    sU1 = UBound(sArr, 1)
    ReDim dArr(1 To sU1, 1 To 3)
    For I = 1 To sU1
        J = Len(sArr(I, 1)) - Len(Replace(sArr(I, 1), ";", ""))
        If J + 1 > UBound(dArr, 2) Then ReDim Preserve dArr(1 To sU1, 1 To J + 3)
        J = 0
        Val = ";" & sArr(I, 1) & ";"
        Pos1 = 1
        Do
            Pos2 = InStr(Pos1 + 1, Val, ";")
            If Pos2 = 0 Then Exit Do
            J = J + 1
            dArr(I, J) = Mid(Val, Pos1 + 1, Pos2 - Pos1 - 1)
            Pos1 = Pos2
        Loop
    Next
    .Range("B1").Resize(10000, UBound(dArr, 2)).ClearContents
    .Range("B1").Resize(sU1, UBound(dArr, 2)) = dArr
End With
End Sub
 
Upvote 0
Cảm ơn @Nhattanktnn đã hỗ trợ, chắc em thiếu sót trong câu hỏi vì đề bài yêu cầu không dùng Excel function luôn ạ. Có thể đây là một câu hỏi cơ bản nhưng vì mới học VBA nên rất mong cả nhà hỗ trợ.
Trong code @Nhattanktnn chia sẻ lại có InStr() ạ ...
Xong, các thầy:unknw: bị bom :D
Chắc đi học VBA, được ông thầy nào bắt làm tách chuỗi, không được sử dụng các hàm dựng sẵn, chỉ được dùng vòng lặp.
:1a:
 
Lần chỉnh sửa cuối:
Upvote 0
Các thầy/cô nhà ta hay cấm xài cái này hay cái kia trong đề bài của mình nhỉ;
Thay vì thế nên ghi trong đề bài là:
1./ Nếu xài Split thì đạt 2 điểm (của câu này)
2./ Nếu không thì đạt 5 điểm khi đạt kết quả theo iêu cầu đề ra.
Còn cách ngăn cấm kiến thức này nọ cũng giống thời ngăn sông cấm chợ mà thôi, bỏ đi!
 
Upvote 0
Xong, các thầy:unknw: bị bom :D
Chắc đi học VBA, được ông thầy nào bắt làm tách chuỗi, không được xử dụng các hàm dựng sẵn, chỉ được dùng vòng lặp.
:1a:
Thầy/cô kém khả năng trình bày câu hỏi, không biết cách diễn tả điều kiện bài tập.
Nhưng cũng có thể thầy/cô nói rất rõ, chỉ do học sinh diễn đạt lại mất ý nghĩa.

Các thầy/cô nhà ta hay cấm xài cái này hay cái kia trong đề bài của mình nhỉ;
...
Như trên, do thầy/cô hoặc học sinh kém khả năng chứ không phải do cấm xài này nọ.
Đề bài chỉ cần nói: Viết hàm dùng phương pháp duyệt từng ký tự để tách chuỗi, kết quả tương tự như dùng hàm Split.
Loại bài tập ép duyệt chuỗi này đối với học lập trình là bình thường. Tuy rằng nếu tôi dạy thì tôi ra kiểu khác, kích động óc sáng tạo hơn, kiểu này máy móc quá.

Tuy nhiên, bài này muốn chơi loè thầy cô thì dùng RegEx. :p
 
Upvote 0
Cảm ơn @CHAOQUAY đã hỗ trợ, nhưng nếu không sử dụng Texttocolumns (ko dùng function trong excel) luôn thì có code vòng lặp nào chạy được ko ạ ?
Em cảm ơn
............................................
Mã:
Option Explicit

Sub Macro1()
With Sheets("Website 1")
    .Range("A1", .Range("A1").End(xlDown)).Select
    Selection.TextToColumns Destination:=Range("C1"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
        Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar _
        :=";", FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1)), _
        TrailingMinusNumbers:=True
End With
End Sub
Bài đã được tự động gộp:

Mình thắc mắc tại sao bạn lại không muốn dùng hàm Split.
Tuy nhiên với yêu cầu của bạn cũng chỉ là trò chơi ABC thôi
Mã:
Sub Tach_Khong_Split()
Columns("A:A").TextToColumns Range("B1"), xlDelimited
End Sub
****************
Gởi bài rồi mới thấy bài số 6 có cùng cách xử lý
Bài đã được tự động gộp:


Bớt khó chút đi bác. Kệ đi. Cuối cùng cũng đều như nhau thôi mà.
Cảm ơn bác @quang Hải đã hỗ trợ, nhưng nếu code ko dùng function excel luôn (như texttocolumns) luôn thì có cách nào khác không ạ ?
Xin cảm ơn
 
Upvote 0
Nói rồi. Hỏi bài mà hời hợt, dùng tiếng viết tắt thì gu-ru chê, hổng thèm làm.
 
Upvote 0
Rồi, rồi: Trúng mánh rồi 2uang Hải ơi! Xin chúc mừng chú mày nha.
 
Upvote 0
Dùng hàm dựng sẵn còn không cho. Anh xúi dùng thư viện thì khả năng cao là bị đuổi học. :cray:
RegEx nói là thách đố nhau chơi chứ không phải code giùm cho thớt kiếm điểm.

Theo như cách nói chuyện thì thớt đâu phải không biết code. Có lẽ chỉ nhát, không muốn tự làm lấy thôi.
 
Upvote 0
@VetMini không biết việc xin giúp đỡ từ mọi người trên diễn đàn lần đầu ghé thăm có gì sai sót không, nhưng qua cách nói chuyện của @VetMini nhiều lần khiến mình cảm thấy mình không thể im lặng bỏ qua tiếp.
1. Mình cảm ơn sự góp ý nếu nó thiện chí, đặc biệt các anh chị ở trên đã chia sẻ
2. Code mình đã tự mò và thử làm rồi, chạy tốt vì có dùng function excel Split() và TexttoColumns để tách dữ liệu. Nếu lười biếng thì mình đã không hiểu được những gì anh chị trên đã chia sẻ, không phaỉ sao?. Tuy nhiên giáo viên lại không cho phép, và yêu cầu không dùng chức năng excel, điều đó làm mình bối rối nên mới xin hỗ trợ từ mọi người
3. Thái độ của @VetMini trong comment thật khiến mình "mở rộng tầm mắt", bạn có thể phớt lờ bài đăng của mình nếu bạn không muốn trả lời, vì mình cần sự giúp đỡ thực sự, không phải là sự đánh giá từ bạn

Xin lỗi anh chị em khác trong diễn đàn vì kéo dài bài viết vì điều này
 
Upvote 0
... nhiều lần khiến mình cảm thấy mình không thể im lặng bỏ qua tiếp.
Đã nhắc hai lần rồi. Chỉ cần chỉnh lại những chỗ viết tắt thôi.
Là người có khả năng ra công giúp, tôi tự cho mình có quyền đòi hỏi bên kia phải dùng tiếng Việt nghiêm chỉnh.
Viết tiếng Việt đầy đủ thì chỉ tăng cái nhìn văn hoá thôi chứ có giảm đâu mà phải lằng nhằng.
Nếu tôi là người cần học thì tôi thi gan thẳng với vấn đề, với code chứ cãi lý thì cuối cùng học được gì?
 
Upvote 0
Web KT

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

Back
Top Bottom