Code này viết sao lu bu quá, hổng biết chạy nỗi không. File chẳng biết có cái gì mà nặng thấy sợ (41.932kb), tôi gởi code này cho bạn xài thử nhé, gởi file lên đây tốn tài nguyên quá.Xin nhờ Anh, Chị trên GPE viết giúp Code để Copy nhiều Sheet về Sheet báo cáo theo điều kiện từng ngày từ 1 đến 31 và theo từng xe. Tôi có gửi kèm file. Xin chân thành biết ơn!
Public Sub GPE()
Application.ScreenUpdating = False
On Error Resume Next
Dim sArr(), dArr(), tArr(), Tong(1 To 1, 1 To 257), I As Long, J As Long, K As Long, N As Long, MaxD As Long, Ws As Worksheet, Cll As Range, t As Variant
t = Timer
ReDim tArr(1 To 65000, 1 To 257)
For Each Ws In ThisWorkbook.Worksheets
If Ws.Name <> "BC theo ngay" Then
sArr = Ws.Range(Ws.[A8], Ws.[A8].End(xlDown).Offset(-1)).Resize(, 257).Value
For I = 1 To UBound(sArr, 1)
K = K + 1
If sArr(I, 1) > MaxD Then MaxD = sArr(I, 1)
For J = 1 To 257
tArr(K, J) = sArr(I, J)
Next J
Next I
End If
Next
ReDim dArr(1 To UBound(tArr, 1) * 2, 1 To 257)
K = 0
For N = 1 To MaxD
For I = 1 To UBound(tArr, 1)
If tArr(I, 1) = N Then
K = K + 1
For J = 1 To 256
dArr(K, J) = tArr(I, J)
If J > 2 And J < 256 Then Tong(1, J) = Tong(1, J) + tArr(I, J)
Next J
End If
Next I
K = K + 1: dArr(K, 2) = "TOTAL:"
For J = 3 To 255
dArr(K, J) = Tong(1, J)
Tong(1, J) = 0
Next J
Next N
With Sheets("BC theo ngay")
.[A8:A65000].Resize(, 257).ClearContents
.[A8:A65000].Resize(, 257).Interior.ColorIndex = xlNone
.[A8:A65000].Resize(, 257).Font.Bold = False
.[A8].Resize(K, 257).Value = dArr
.[A8].Resize(K, 257).Borders.LineStyle = xlContinuous
For Each Cll In .[B8].Resize(K)
If Cll.Value = "TOTAL:" Then
Cll.Offset(, -1).Resize(, 257).Interior.ColorIndex = 36
Cll.Offset(, -1).Resize(, 257).Font.Bold = True
End If
Next
End With
Application.ScreenUpdating = True
MsgBox Timer - t
End Sub
Định làm cho bạn bằng ADO như file của bạn những 257 cột, vượt giới hạn ADOXin nhờ Anh, Chị trên GPE viết giúp Code để Copy nhiều Sheet về Sheet báo cáo theo điều kiện từng ngày từ 1 đến 31 và theo từng xe. Tôi có gửi kèm file. Xin chân thành biết ơn!
Bạn đã có 2 sự lựa chọn, nếu Code bài #7 chậm thì có thể chọn Code bài #6. Hay bạn còn ý gì khác?Xin chân thành biết ơn Anh Ba Tê và Anh dhn46, Code của các anh chạy rất tốt, tuy nhiên Code của anh dhn46 chạy hơi chậm, Anh xem có cách nào khắc phục nhanh hơn được không. Chúc các Anh luôn vui vẻ.
Hiên tượng File bị phình to ra là do khi gán từ mảng xuống Sheet những 65536 dòng. Có thể xử lý Code, hoặc xử lý bằng tay bằng cách bạn chọn từ dòng có dữ liệu cuối cùng tới dòng 65536 rồi Delete Row.Cám ơn dhn46. Tôi thấy khi nhập Code xong thì dung lượng của file tăng lên rất nhiều, bình thường thì chỉ có 1,68 MB, khi nhập Code xong dung lượng tăng lên đến 43,7 MB. có cách nào để giảm được dung lượng đi không?
Sub TongHop()
Application.ScreenUpdating = False
Dim iR As Long, jC As Long, k As Long, sArr, Res, QtyCar As Long, Tmp
Dim Ttal As Double, ColD As Long
Dim Ws As Worksheet, MaxD As Long
Dim Arr(1 To 65536, 1 To 257)
t = Timer
'---1 vong lap Gom du lieu cac sheet vao sArr
For Each Ws In ThisWorkbook.Worksheets
If Ws.Name <> "BC theo ngay" Then
sArr = Ws.Range(Ws.[A8], Ws.[A8].End(xlDown).Offset(-1)).Resize(, 257).Value
For iR = 1 To UBound(sArr, 1)
k = k + 1
For jC = 1 To 257
Arr(k, jC) = sArr(iR, jC)
Next
If Arr(k, 1) > MaxD Then MaxD = Arr(k, 1) 'tim so ngay lon nhat, 28,29,30,31..tuy cac thang
Next
End If
Next
'So luong xe, tuong ung voi so dong trong 1 ngay
QtyCar = ThisWorkbook.Worksheets.Count - 1
ReDim Res(1 To QtyCar + 1, 1 To 257 * MaxD)
ReDim Tmp(1 To 1, 1 To 257 * MaxD)
'---1 vong lap de tach moi ngay ra 1 cot trong mang
For iR = 1 To k
For jC = 1 To 257
If Arr(iR, 1) <> "" Then
Tmp(1, (Arr(iR, 1) - 1) * 257 + jC) = Tmp(1, (Arr(iR, 1) - 1) * 257 + jC) + 1 'Ghi nho so dong lien tuc tren moi cot
Res(Tmp(1, jC), (Arr(iR, 1) - 1) * 257 + jC) = Arr(iR, jC)
If jC > 2 And jC <> 257 Then
Res(QtyCar + 1, (Arr(iR, 1) - 1) * 257 + jC) = Res(QtyCar + 1, (Arr(iR, 1) - 1) * 257 + jC) + Arr(iR, jC)
ElseIf jC = 1 Then
Res(QtyCar + 1, (Arr(iR, 1) - 1) * 257 + jC) = "Total"
End If
End If
Next
Next
'---1 vong lap de tach cot trong Res va gan xuong sheet
Sheets("BC theo ngay").[A8:A65000].EntireRow.Delete
For c = 1 To MaxD
ReDim sArr(1 To QtyCar + 1, 1 To 257)
For iR = 1 To QtyCar + 1
For jC = 1 To 257
sArr(iR, jC) = Res(iR, (c - 1) * 257 + jC)
Next
Next
With Sheets("BC theo ngay")
.[A65536].End(3).Resize(Tmp(1, c) + 1, 257).Offset(1, 0) = sArr
.[A65536].End(3).Resize(, 257).Interior.ColorIndex = 36
.[A65536].End(3).Resize(, 257).Font.Bold = True
End With
Next
Sheets("BC theo ngay").[A8].Resize([A65536].End(3).Row, 257).Borders.LineStyle = xlContinuous
Application.ScreenUpdating = True
MsgBox Timer - t
End Sub
- Bạn không phải xin lỗi, bạn rất có trách nhiệm trong các bài trả lời, và việc tìm hiểu nguyên nhân tại sao chậm cũng là điều tôi thắc mắc.Xin lỗi dhn46, hôm trước khi nhập xong Code tôi cho chạy ngay thấy chậm hơn Code bài #6, tôi đã vội phản ảnh ngay, khi khởi động lại tôi thấy cũng không chênh lệch là bao. Cám ơn dhn46 đã viết lại Code nhưng khi tôi nhập vào bị lỗi ở vong lap de tach moi ngay ra 1 cot trong mang tại dòng 34 cụ thể: Res(QtyCar + 1, (Arr(iR, 1) - 1) * 257 + jC) = Res(QtyCar + 1, (Arr(iR, 1) - 1) * 257 + jC) + Arr(iR, jC). Nhờ bạn xem lại giúp. Xin cám ơn!
- Bạn không phải xin lỗi, bạn rất có trách nhiệm trong các bài trả lời, và việc tìm hiểu nguyên nhân tại sao chậm cũng là điều tôi thắc mắc.
- Mạn đàm một chút về thuật toán:
+/ Với bài #6: Các bước thực hiện là
1/ Duyệt qua 1 vòng các Sheet để đưa dữ liệu vào mảng (có hơn 800 dòng dữ liệu)
2/ Duyệt qua 31 ngày từ ngày 1 tới 31 của hơn 800 duòng đó => có tới 31*800 vòng lặp
3/ Gán xuống Sheet
Mất tổng 31*800 + 1 vòng lặp
+/ Với bài #7: Các bước là:
1/ Duyệt qua 1 vòng các Sheet để đưa dữ liệu vào mảng (có hơn 800 dòng dữ liệu)
2/ Duyệt 1 vòng qua 800 dòng để gắn vào mảng mỗi ngày (1-31) vào 1 cột => mảng 31 cột
3/ Duyệt 1 vòng qua 800 dòng đó tương ứng duyệt qua các cột để gán xuống sheet
Mất 3 vòng lặp
=> Từ thuật toán đó tôi "đoán" rằng tốc độ sẽ nhanh hơn, nhưng tôi không để ý 1 vấn đề đó là bài #6 gắn dữ liệu 1 lần xuống sheet còn bài #7 mất 31 lần gán, mà thao tác gắn liền với Sheet sẽ rất chậm
- Một điều nữa cả bài #6 và #7 đều chưa chú ý đó là đoạn định dạng cho vùng [A8:A65000] => đây là nguyên nhân gây ra lỗi phình to dữ liệu.
- Vậy tôi vẫn giữ nguyên thuật toán của mình chỉ chỉnh sửa đoạn định dạng vùng [A8:A65536] như bài #11. Bạn dựa vào phân tích có thể khắc phục đoạn gán lên sheet 31 trong Code để cải thiện tốc độ hơn nữa.
Xin nói thêm 1 chút về CSDL của bạn: với cách bố trí của bạn nếu có thêm 1 địa điểm vận chuyển nữa thì bạn sẽ bố trí ra sao khi mà giới hạn Ex đã hết?
Tôi Post File bạn Test và phản hồi.
Chạy trên máy của tôi office 2010 code của Bate 2,580078 của dnh46 : 4,673828 và kẻ khung thừa 7 dòng, nhưng trước đó code của thày bate làm tầp tin từ 2,55 Mb phình ra 46,7 Mb thì chay code đã lâu mà khi save lại còn lâu hơn , Phát kinh luôn . Bài toán này học các thày về code thôi, chứ bạn tulaphl bố trí dữ liệu kiểu vậy ...chạy hết "chiều dài đất nước" thì hãi quá !Tôi cũng không phân tích được cách làm việc của code, nhưng tôi vẫn làm theo cách cũ bằng code đã sửa lại như vầy, tôi cho chạy trên máy tôi thì thời gian là 0.4 giây, code của bạn 0.726 giây (và kẻ khung thừa 7 dòng dưới)
Nhờ người khác kiểm tra lại xem sao.
Bạn chạy file nào vậy?Chạy trên máy của tôi office 2010 code của Bate 2,580078 của dnh46 : 4,673828 và kẻ khung thừa 7 dòng, nhưng trước đó code của thày bate làm tầp tin từ 2,55 Mb phình ra 46,7 Mb thì chay code đã lâu mà khi save lại còn lâu hơn , Phát kinh luôn . Bài toán này học các thày về code thôi, chứ bạn tulaphl bố trí dữ liệu kiểu vậy ...chạy hết "chiều dài đất nước" thì hãi quá !
File của thày OK rồi ạ ? Khi trước copy code bài #6 dán vào module rồi chạy . Sau mở lại kiểm tra , không biết do lỗi gì mà phình ra đến giật mình . Nhà em cũng chưa đối chiếu xem thày đã sửa chỗ nào trong code hay lỗi do máy nhà em chưa biết nữa ! Nhà em đã phải nói " Nhưng trước đó ..." tức không phải file hiện tại .Bạn chạy file nào vậy?
File tôi chạy xong lưu lại vãn là 2.5Mb mà, làm gì đến 46,..Mb
DIỄN ĐÀN GIẢI PHÁP EXCEL Group 1
DIỄN ĐÀN GIẢI PHÁP EXCEL Group 2