Ở ô thành tiền nếu hiển thị có dấu "+" thì mới làm được nhé.
Ở ô thành tiền nếu hiển thị có dấu "+" thì mới làm được nhé.
Thử lệnhNếu vậy mình cũng có thể làm được.
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.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ỗiLà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
Để xử lý cái này thì có thể làm 1 cột phụ bên cạnh cột D.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
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.Để 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
em đang nghĩ cách đây ạ.Hổng làm cột phụ, để nguyên bảng nguồn vậy thử xem.
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.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
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.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
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ổiThậ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
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.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