Tách số liệu trong công thức cộng ra các hàng (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

truonggiang73

Thành viên hoạt động
Tham gia
27/6/09
Bài viết
113
Được thích
35
Chào cả nhà.
Tôi có biểu nhập số đầu vào gồm :
EX :
Cell A4 nhập những ngày PS : 12/1;15/4;30/7... (VD 3 lần PS)
Cell B4 nhập các giá trị phát sinh : =200000+300000+400000...(nt)
Nhờ mọi người giúp cho :
Tách ngày phát sinh và giá trị phát sinh tương ứng ra các dòng.
TG73 xin cảm ơn.
 

File đính kèm

Lần chỉnh sửa cuối:
Chào cả nhà.
Tôi có biểu nhập số đầu vào gồm :
EX :
Cell A4 nhập những ngày PS : 12/1;15/4;30/7... (VD 3 lần PS)
Cell B4 nhập các giá trị phát sinh : =200000+300000+400000...(nt)
Nhờ mọi người giúp cho :
Tách ngày phát sinh và giá trị phát sinh tương ứng ra các dòng.
TG73 xin cảm ơn.
Mình thấy trong file bạn có dùng từ range--> chắc bạn cũng biết vba
Bạn thử tham khảo theo code sau :
Mã:
Sub tacksolieu()    
    Dim i As Long, Dat(), Ps(), item, arr1, arr2
        ActiveSheet.AutoFilterMode = False
        Range("C2 :D1000").ClearContents
        Dat = Range("A2", [A65536].End(3).Offset(1)).Value
        Ps = Range("B2", [B65536].End(3).Offset(1)).Value
        For Each item In Dat
            i = i + 1
            If Len(item) And Len(Ps(i, 1)) Then
                arr1 = Split(item, ";")
                arr2 = Split(Ps(i, 1), "+")
                [C65536].End(3).Offset(1).Resize(UBound(arr1) + 1) _
                                    = WorksheetFunction.Transpose(arr1)
                [D65536].End(3).Offset(1).Resize(UBound(arr1) + 1) _
                                    = WorksheetFunction.Transpose(arr2)
            End If
        Next
End Sub
 
Upvote 0
Chào cả nhà.
Tôi có biểu nhập số đầu vào gồm :
EX :
Cell A4 nhập những ngày PS : 12/1;15/4;30/7... (VD 3 lần PS)
Cell B4 nhập các giá trị phát sinh : =200000+300000+400000...(nt)
Nhờ mọi người giúp cho :
Tách ngày phát sinh và giá trị phát sinh tương ứng ra các dòng.
TG73 xin cảm ơn.
Thử cái này coi ra sao
PHP:
Sub tach()
Dim data(), i, Res(1 To 65536, 1 To 2), J, k, tam1, tam2, ngay
[B:B].Replace "=", ""
data = Range([A4], [B65536].End(3)).Value
For i = 1 To UBound(data)
   tam1 = Split(data(i, 1), ";")
   tam2 = Split(data(i, 2), "+")
   For J = 0 To UBound(tam1)
      k = k + 1
      ngay = Split(tam1(J), "/")
      Res(k, 1) = CDate(ngay(1) & "-" & ngay(0) & "- 2012")
      Res(k, 2) = tam2(J)
   Next
Next
[d4].Resize(k, 2) = Res
End Sub
 
Upvote 0
Cảm ơn bạn Hungpecc1. Mình cũng đã tham khảo các bài cùng đề tài nhưng không làm được nên "--> chắc bạn cũng biết vba" có lẽ hơi quá.
Giải pháp bạn đưa ra đã gần đúng ý rồi, tuy nhiên tại cell B4 có dấu "=" để tổng hợp nên chỉ hiện thị tổng số là 900000.
Tôi đã thử Copy Formular cái tổng đó sang cell khác đã được định dạng text vẫn ra kết quả là 900.000 (như VD) và vẫn là dữ liệu kiểu số. Sau đó ấn F2 mới ra : =200000+300000+400000.
Phiền bạn giúp mình theo yều cầu trên có được không? Tức là ở Cell B4 có kết quả là 900.000

Cảm ơn bạn QuangHai1969. Vấn đề mình vừa nêu đã được bạn giải quyết rồi.
 
Lần chỉnh sửa cuối:
Upvote 0
dhn46 đóng góp Code dùng RegExp
Mã:
Sub Tach1()
    Dim i As Long, j As Long, ArrData, Arr(1 To 65536, 1 To 2)
    ArrData = Range([a4], [B65536].End(3)).Formula
    With CreateObject("vbscript.regexp")
        .Global = True
        For j = 1 To UBound(ArrData, 1)
            .Pattern = "\d+\/\d+"
            For i = 0 To .Execute(ArrData(j, 1)).Count - 1
                Arr(i + 1, 1) = Format(.Execute(ArrData(j, 1)).Item(i) & "/" & 2012, "mm/dd/yyyy")
            Next
            '---------------------------------
            .Pattern = "\d+"
            For i = 0 To .Execute(ArrData(j, 2)).Count - 1
                Arr(i + 1, 2) = .Execute(ArrData(j, 2)).Item(i)
            Next
        Next


    End With
    [d4].Resize(i, 2) = Arr
End Sub
Code anh QuangHai em Test thấy ngày đầu tiên không phải là ngày 12/1/2012 mà là ngày 1/12/2012 (chỉ bị với dữ liệu đầu tiên)
 
Upvote 0
dhn46 đóng góp Code dùng RegExp
Mã:
Sub Tach1()
    Dim i As Long, j As Long, ArrData, Arr(1 To 65536, 1 To 2)
    ArrData = Range([a4], [B65536].End(3)).Formula
    With CreateObject("vbscript.regexp")
        .Global = True
        For j = 1 To UBound(ArrData, 1)
            .Pattern = "\d+\/\d+"
            For i = 0 To .Execute(ArrData(j, 1)).Count - 1
                Arr(i + 1, 1) = Format(.Execute(ArrData(j, 1)).Item(i) & "/" & 2012, "mm/dd/yyyy")
            Next
            '---------------------------------
            .Pattern = "\d+"
            For i = 0 To .Execute(ArrData(j, 2)).Count - 1
                Arr(i + 1, 2) = .Execute(ArrData(j, 2)).Item(i)
            Next
        Next


    End With
    [d4].Resize(i, 2) = Arr
End Sub
Code anh QuangHai em Test thấy ngày đầu tiên không phải là ngày 12/1/2012 mà là ngày 1/12/2012 (chỉ bị với dữ liệu đầu tiên)
Thì rõ ràng rồi, vậy mà chủ topic nói là ok mới ghê chứ.

Bổ sung đầy đủ cho chủ topic xài cho ngọt chút. Nó phải là vầy nè

PHP:
Sub tach()
Dim data(), i, Res(1 To 65536, 1 To 2), J, k, tam1, tam2, ngay
data = Range([A4], [B65536].End(3)).Formula
For i = 1 To UBound(data)
   tam1 = Split(data(i, 1), ";")
   tam2 = Split(data(i, 2), "+")
   For J = 0 To UBound(tam1)
      k = k + 1
      ngay = Split(tam1(J), "/")
      Res(k, 1) = CDate(ngay(0) & "-" & ngay(1) & "- 2012")
      Res(k, 2) = tam2(J)
   Next
Next
[d4].Resize(k, 2) = Res
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Khi test mình vẫn biết là vậy nhưng nghĩ là lỗi do nhầm lẫn khi định dạng ngày tháng, mình hiểu và mọi người cũng hiểu và sửa dễ dàng nên OK luôn. Mong bạn QuangHai1969 đừng hiểu nhầm nhé.
Hoặc nếu dùng lâu dài cho nhiều năm thì bỏ luôn & "- 2012" thì đúng cho năm hiện tại.
TG73 thành thật cảm ơn.
 
Upvote 0
Khi test mình vẫn biết là vậy nhưng nghĩ là lỗi do nhầm lẫn khi định dạng ngày tháng, mình hiểu và mọi người cũng hiểu và sửa dễ dàng nên OK luôn. Mong bạn QuangHai1969 đừng hiểu nhầm nhé.
Hoặc nếu dùng lâu dài cho nhiều năm thì bỏ luôn & "- 2012" thì đúng cho năm hiện tại.
TG73 thành thật cảm ơn.
Về lâu dài thì chỉnh lại thế này sẽ lấy năm hiện hành
PHP:
Sub tach()
Dim data(), i, Res(1 To 65536, 1 To 2), J, k, tam1, tam2, ngay
data = Range([A4], [B65536].End(3)).Formula
For i = 1 To UBound(data)
   tam1 = Split(data(i, 1), ";")
   tam2 = Split(data(i, 2), "+")
   For J = 0 To UBound(tam1)
      k = k + 1
      ngay = Split(tam1(J), "/")
      Res(k, 1) = CDate(ngay(0) & "-" & ngay(1) & "-" & Year(Date))
      Res(k, 2) = tam2(J)
   Next
Next
[d4].Resize(k, 2) = Res
End Sub
 
Upvote 0

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

Back
Top Bottom