Tách hóa đơn và số tiền theo điều kiện. (1 người xem)

Liên hệ QC

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

thinhnx22

Thành viên hoạt động
Tham gia
22/12/15
Bài viết
182
Được thích
38
Trong file đính kèm, mình cần tách số hóa đơn và số tiền. Các bạn xem và giúp mình kết quả như file, Cảm ơn các bạn.
 

File đính kèm

Upvote 0
Làm theo gợi ý của bác @HieuCD và bác @hpkhuong
PHP:
Sub test()
    Dim sArr(), dArr(1 To 1000, 1 To 4), Tmp1, Tmp2
    Dim I As Long, J As Long, K As Long, Cll As Range
    
    For Each Cll In Sheet1.Range("D5", Sheet1.Range("D5").End(xlDown))
        Cll.Value = Replace(CStr(Cll.Formula), "=", "")
    Next Cll
    
    sArr() = Sheet1.Range("A5", Sheet1.Range("A5").End(xlDown)).Resize(, 4).Value
    
    For I = 1 To UBound(sArr, 1)
        If InStr(sArr(I, 1), ",") Then
            Tmp1 = Split(sArr(I, 1), ",")
            Tmp2 = Split(sArr(I, 4), "+")
            For J = 0 To UBound(Tmp1)
                K = K + 1
                dArr(K, 1) = Tmp1(J): dArr(K, 2) = sArr(I, 2)
                dArr(K, 3) = sArr(I, 3): dArr(K, 4) = Tmp2(J)
            Next J
        Else
            K = K + 1
            For J = 1 To 4
                dArr(K, J) = sArr(I, J)
            Next J
        End If
    Next I
    Sheet2.Range("A5:D65000").ClearContents
    Sheet2.Range("A5").Resize(K, 4) = dArr
End Sub
 
Upvote 0
Làm theo gợi ý của bác @HieuCD và bác @hpkhuong
PHP:
Sub test()
    Dim sArr(), dArr(1 To 1000, 1 To 4), Tmp1, Tmp2
    Dim I As Long, J As Long, K As Long, Cll As Range
   
    For Each Cll In Sheet1.Range("D5", Sheet1.Range("D5").End(xlDown))
        Cll.Value = Replace(CStr(Cll.Formula), "=", "")
    Next Cll
   
    sArr() = Sheet1.Range("A5", Sheet1.Range("A5").End(xlDown)).Resize(, 4).Value
   
    For I = 1 To UBound(sArr, 1)
        If InStr(sArr(I, 1), ",") Then
            Tmp1 = Split(sArr(I, 1), ",")
            Tmp2 = Split(sArr(I, 4), "+")
            For J = 0 To UBound(Tmp1)
                K = K + 1
                dArr(K, 1) = Tmp1(J): dArr(K, 2) = sArr(I, 2)
                dArr(K, 3) = sArr(I, 3): dArr(K, 4) = Tmp2(J)
            Next J
        Else
            K = K + 1
            For J = 1 To 4
                dArr(K, J) = sArr(I, J)
            Next J
        End If
    Next I
    Sheet2.Range("A5:D65000").ClearContents
    Sheet2.Range("A5").Resize(K, 4) = dArr
End Sub
Kết quả sau khi chạy thì cột D sheet NGUON "biến hình" luôn.
 
Upvote 0
Làm theo gợi ý của bác @HieuCD và bác @hpkhuong
PHP:
Sub test()
    Dim sArr(), dArr(1 To 1000, 1 To 4), Tmp1, Tmp2
    Dim I As Long, J As Long, K As Long, Cll As Range
  
    For Each Cll In Sheet1.Range("D5", Sheet1.Range("D5").End(xlDown))
        Cll.Value = Replace(CStr(Cll.Formula), "=", "")
    Next Cll
  
    sArr() = Sheet1.Range("A5", Sheet1.Range("A5").End(xlDown)).Resize(, 4).Value
  
    For I = 1 To UBound(sArr, 1)
        If InStr(sArr(I, 1), ",") Then
            Tmp1 = Split(sArr(I, 1), ",")
            Tmp2 = Split(sArr(I, 4), "+")
            For J = 0 To UBound(Tmp1)
                K = K + 1
                dArr(K, 1) = Tmp1(J): dArr(K, 2) = sArr(I, 2)
                dArr(K, 3) = sArr(I, 3): dArr(K, 4) = Tmp2(J)
            Next J
        Else
            K = K + 1
            For J = 1 To 4
                dArr(K, J) = sArr(I, J)
            Next J
        End If
    Next I
    Sheet2.Range("A5:D65000").ClearContents
    Sheet2.Range("A5").Resize(K, 4) = dArr
End Sub
Hay quá vanthinh ơi! Nhưng mà chạy code xong thì bảng dữ liệu gốc phần sotien bị biến thành chuỗi
 
Upvote 0
Upvote 0
Để xử lý cái này thì có thể làm 1 cột phụ bên cạnh cột D.
Sau khi xong việc thì xóa cột phụ đi --> như vậy là dữ liệu gốc sẽ nguyên trạng
Cam ơn VanThinh và tất cả các bác đã giúp đỡ nhé. File dùng để đối chiếu so sánh nên dữ liệu nguồn biến dạng chút cũng không sao.
 
Upvote 0
Hổng làm cột phụ, để nguyên bảng nguồn vậy thử xem.
em đang nghĩ cách đây ạ.
Nếu cột phụ thì em làm như sau:
PHP:
Sub test()
    Dim sArr(), dArr(1 To 1000, 1 To 4), Tmp1, Tmp2
    Dim I As Long, J As Long, K As Long
    Dim Rng As Range, Cll As Range
    
    Set Rng = Sheet1.Range("D5", Sheet1.Range("D5").End(xlDown))
    Rng.Offset(, 1) = Rng.Formula
    
    For Each Cll In Rng.Offset(, 1)
        Cll.Value = Replace(CStr(Cll.Formula), "=", "")
    Next Cll
    
    sArr() = Rng.Offset(, -3).Resize(, 5).Value
    Rng.Offset(, 1).EntireColumn.Delete
    Set Rng = Nothing
    
    For I = 1 To UBound(sArr, 1)
        If InStr(sArr(I, 1), ",") Then
            Tmp1 = Split(sArr(I, 1), ",")
            Tmp2 = Split(sArr(I, 5), "+")
            For J = 0 To UBound(Tmp1)
                K = K + 1
                dArr(K, 1) = Tmp1(J): dArr(K, 2) = sArr(I, 2)
                dArr(K, 3) = sArr(I, 3): dArr(K, 4) = Tmp2(J)
            Next J
        Else
            K = K + 1
            For J = 1 To 4
                dArr(K, J) = sArr(I, J)
            Next J
        End If
    Next I
    Sheet2.Range("A5:D65000").ClearContents
    Sheet2.Range("A5").Resize(K, 4) = dArr
    
    MsgBox "Done", vbInformation, "GPE"
End Sub
 
Upvote 0
em đang nghĩ cách đây ạ.
Nếu cột phụ thì em làm như sau:
PHP:
Sub test()
    Dim sArr(), dArr(1 To 1000, 1 To 4), Tmp1, Tmp2
    Dim I As Long, J As Long, K As Long
    Dim Rng As Range, Cll As Range
   
    Set Rng = Sheet1.Range("D5", Sheet1.Range("D5").End(xlDown))
    Rng.Offset(, 1) = Rng.Formula
   
    For Each Cll In Rng.Offset(, 1)
        Cll.Value = Replace(CStr(Cll.Formula), "=", "")
    Next Cll
   
    sArr() = Rng.Offset(, -3).Resize(, 5).Value
    Rng.Offset(, 1).EntireColumn.Delete
    Set Rng = Nothing
   
    For I = 1 To UBound(sArr, 1)
        If InStr(sArr(I, 1), ",") Then
            Tmp1 = Split(sArr(I, 1), ",")
            Tmp2 = Split(sArr(I, 5), "+")
            For J = 0 To UBound(Tmp1)
                K = K + 1
                dArr(K, 1) = Tmp1(J): dArr(K, 2) = sArr(I, 2)
                dArr(K, 3) = sArr(I, 3): dArr(K, 4) = Tmp2(J)
            Next J
        Else
            K = K + 1
            For J = 1 To 4
                dArr(K, J) = sArr(I, J)
            Next J
        End If
    Next I
    Sheet2.Range("A5:D65000").ClearContents
    Sheet2.Range("A5").Resize(K, 4) = dArr
   
    MsgBox "Done", vbInformation, "GPE"
End Sub
Thử với cái này rồi chỉ dùng nó thôi.
PHP:
sArr = Sheets("NGUON").Range("A5", Sheets("NGUON").Range("A5").End(xlDown)).Resize(, 4).Formula
 
Upvote 0
Thử với cái này rồi chỉ dùng nó thôi.
PHP:
sArr = Sheets("NGUON").Range("A5", Sheets("NGUON").Range("A5").End(xlDown)).Resize(, 4).Formula
Thật là tuyệt vời, em có thêm 1 kiến thức mới.
Em cám ơn bác nhiều.
Mã:
Sub test1()
    Dim sArr(), dArr(1 To 1000, 1 To 4), Tmp1, Tmp2
    Dim I As Long, J As Long, K As Long, Cll As Range
   
    sArr() = Sheet1.Range("A5", Sheet1.Range("A5").End(xlDown)).Resize(, 4).Formula
   
    For I = 1 To UBound(sArr, 1)
        If InStr(sArr(I, 1), ",") Then
            Tmp1 = Split(sArr(I, 1), ",")
            Tmp2 = Split(Replace(sArr(I, 4), "=", ""), "+")
            For J = 0 To UBound(Tmp1)
                K = K + 1
                dArr(K, 1) = Tmp1(J): dArr(K, 2) = sArr(I, 2)
                dArr(K, 3) = sArr(I, 3): dArr(K, 4) = Tmp2(J)
            Next J
        Else
            K = K + 1
            For J = 1 To 4
                dArr(K, J) = sArr(I, J)
            Next J
        End If
    Next I
    Sheet2.Range("A5:D65000").ClearContents
    Sheet2.Range("A5").Resize(K, 4) = dArr
   
    MsgBox "Done", vbInformation, "GPE"
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Thật là tuyệt vời, em có thêm 1 kiến thức mới.
Mã:
Sub test1()
    Dim sArr(), dArr(1 To 1000, 1 To 4), Tmp1, Tmp2
    Dim I As Long, J As Long, K As Long, Cll As Range
   
    sArr() = Sheet1.Range("A5", Sheet1.Range("A5").End(xlDown)).Resize(, 4).Formula
   
    For I = 1 To UBound(sArr, 1)
        If InStr(sArr(I, 1), ",") Then
            Tmp1 = Split(sArr(I, 1), ",")
            Tmp2 = Split(Replace(sArr(I, 4), "=", ""), "+")
            For J = 0 To UBound(Tmp1)
                K = K + 1
                dArr(K, 1) = Tmp1(J): dArr(K, 2) = sArr(I, 2)
                dArr(K, 3) = sArr(I, 3): dArr(K, 4) = Tmp2(J)
            Next J
        Else
            K = K + 1
            For J = 1 To 4
                dArr(K, J) = sArr(I, J)
            Next J
        End If
    Next I
    Sheet2.Range("A5:D65000").ClearContents
    Sheet2.Range("A5").Resize(K, 4) = dArr
   
    MsgBox "Done", vbInformation, "GPE"
End Sub
Muốn gọn code, có thể bỏ lệnh "If" bằng cách thêm Delimiter vào trước chuổi
Mã:
    For I = 1 To UBound(sArr, 1)
        Tmp1 = Split("," & sArr(I, 1), ",")
        Tmp2 = Split("+" & Replace(sArr(I, 4), "=", ""), "+")
        For J = 1 To UBound(Tmp1)
            K = K + 1
            dArr(K, 1) = Tmp1(J): dArr(K, 2) = sArr(I, 2)
            dArr(K, 3) = sArr(I, 3): dArr(K, 4) = Tmp2(J)
        Next J
    Next I
 
Upvote 0
Muốn gọn code, có thể bỏ lệnh "If" bằng cách thêm Delimiter vào trước chuổi
Mã:
    For I = 1 To UBound(sArr, 1)
        Tmp1 = Split("," & sArr(I, 1), ",")
        Tmp2 = Split("+" & Replace(sArr(I, 4), "=", ""), "+")
        For J = 1 To UBound(Tmp1)
            K = K + 1
            dArr(K, 1) = Tmp1(J): dArr(K, 2) = sArr(I, 2)
            dArr(K, 3) = sArr(I, 3): dArr(K, 4) = Tmp2(J)
        Next J
    Next I
Em cám ơn bác đã chỉ bảo.
 
Upvote 0
Web KT

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

Back
Top Bottom