Tăng tốc Copy Paste bảng tính

Liên hệ QC

vuthaiha90

Thành viên mới
Tham gia
14/6/09
Bài viết
36
Được thích
0
Giới tính
Nam
Em chào các bác ạ, em có nhu cầu muốn copy paste dữ liệu cố định từ 100 file excel (không cho đặt công thức gì, chỉ copy được thôi) vào 1 file excel bình thường khác, để lấy số liệu (+ - x : ) làm báo cáo. Em cũng đã có code chọn file và paste số liệu rồi, nhưng em bấm giờ thì làm 100 file này tầm 17, 18 phút. Vậy liệu có cách nào tối ưu hơn code em đang dùng không ạ. Em xin cảm ơn các bác trước.
P/s: Em up ví dụ 1 file, 99 file kia cấu trúc giống hệt, khác số liệu thôi ạ
 

File đính kèm

code chọn file và paste số liệu
Bình thường thao tác bằng tay thì bạn làm xong 100 files trong mấy giờ?

18 phút * 60 giây / 100 files = 10.8 giây / 1 file
Bình thường click đúp vào 1 file để mở nó cho tới khi nhìn thấy dữ liệu tốn cỡ 4 giây rồi.

Bây giờ đi mua siêu máy tính về dùng, hoặc mình cho mượn dùng ké vài hôm nhé.
 
Upvote 0
Bình thường thao tác bằng tay thì bạn làm xong 100 files trong mấy giờ?

18 phút * 60 giây / 100 files = 10.8 giây / 1 file
Bình thường click đúp vào 1 file để mở nó cho tới khi nhìn thấy dữ liệu tốn cỡ 4 giây rồi.

Bây giờ đi mua siêu máy tính về dùng, hoặc mình cho mượn dùng ké vài hôm nhé.
Thấy có bác bảo dùng Array giảm được nửa thời gian nữa nên em mới hỏi
 
Upvote 0
Thấy có bác bảo dùng Array giảm được nửa thời gian nữa nên em mới hỏi
Nhưng bây giờ ý bạn là vẫn dùng chức năng tương tự nhưng tăng tốc độ chạy code hay là muốn gì khác nửa? nếu muốn tăng tốc thì có thể thử vầy xem sao?
Mã:
Sub TongHop()
    Application.ScreenUpdating = False
    Dim i As Long
    Dim nFile As Long
    nFile = S01.Range("B1000").End(xlUp).Row
    Dim Wb As Workbook
    Dim Ws As Worksheet
    With S02
        .Cells.ClearContents
        .Range("A1") = S01.Range("A1")
        .Range("A2") = S01.Range("A2")
        For i = 1 To nFile
            Set Wb = Workbooks.Open(S01.Range("B" & i))
            Set Ws = Wb.Worksheets("G035841")
            .Cells(2, i * 2) = S01.Range("A3")
            .Cells(2, i * 2 + 1) = S01.Range("A4")
            .Cells(1, i * 2) = Ws.Range("C3")
            If i = 1 Then .Range("A3:A817").Value = Ws.Range("B19:B834").Value
            .Range("B3").Offset(, (i - 1) * 2).Resize(816, 2).Value = Ws.Range("H19:K835").Value
            Wb.Close False
            Set Wb = Nothing
        Next
        .Range("A3:A818").Resize(, i * 2 + 1).NumberFormat = "_(* #,##0_);_(* (#,##0);_(* ""-""_);_(@_)"
        .Range("A3:A818").Resize(, i * 2 + 1).EntireColumn.AutoFit
        Application.ScreenUpdating = True
    End With
MsgBox "Xong"
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Cũng có thể thêm Function này vào module. excel sẽ tắt tính năng tự động tính toán trong cell khi chạy code đi, có thể sẽ nhanh hơn được đôi giây đó :)
Mã:
Function GetSpeed(doIt As Boolean)
Application.ScreenUpdating = Not (doIt)
Application.EnableEvents = Not (doIt)
Application.Calculation = IIf(doIt, xlCalculationManual, xlCalculationAutomatic)
End Function
 
Upvote 0
Cũng có thể thêm Function này vào module. excel sẽ tắt tính năng tự động tính toán trong cell khi chạy code đi, có thể sẽ nhanh hơn được đôi giây đó :)
Mã:
Function GetSpeed(doIt As Boolean)
Application.ScreenUpdating = Not (doIt)
Application.EnableEvents = Not (doIt)
Application.Calculation = IIf(doIt, xlCalculationManual, xlCalculationAutomatic)
End Function
Kinh nhỉ, chưa thấy cái này bao giờ
 
Upvote 0
Mình có câu hỏi ngu ngơ đến chủ bài đăng:

Sao không là trăm trang tính trên 1 bảng tính mà fải là trăm file làm vậy?
 
Upvote 0
Nhưng bây giờ ý bạn là vẫn dùng chức năng tương tự nhưng tăng tốc độ chạy code hay là muốn gì khác nửa? nếu muốn tăng tốc thì có thể thử vầy xem sao?
Em đã thử và rất nhanh, mất có mấy chục giây cho toàn bộ 100 file cần lấy số liệu. Em cảm ơn ạ
Bài đã được tự động gộp:

Mình có câu hỏi ngu ngơ đến chủ bài đăng:

Sao không là trăm trang tính trên 1 bảng tính mà fải là trăm file làm vậy?
vì em là người tổng hợp báo cáo, 100 file là 100 bảng cân đối của 100 cơ sở khác nhau, mẫu giống nhau thôi chứ bắt họ làm cùng vào 1 file sao được
Bài đã được tự động gộp:

Cũng có thể thêm Function này vào module. excel sẽ tắt tính năng tự động tính toán trong cell khi chạy code đi, có thể sẽ nhanh hơn được đôi giây đó :)
Em cũng đưa luôn code bác vào kết hợp, nhanh ấy ạ
 
Upvote 0
vì em là người tổng hợp báo cáo, 100 file là 100 bảng cân đối của 100 cơ sở khác nhau, mẫu giống nhau thôi chứ bắt họ làm cùng vào 1 file sao được
Đúng là không thể bắt họ làm cùng vô 1 file;
Nhưng chuyện chép từ 100 file vô 1 bảng tính gồm trăm trang bạn có làm được không?
 
Upvote 0
Đúng là không thể bắt họ làm cùng vô 1 file;
Nhưng chuyện chép từ 100 file vô 1 bảng tính gồm trăm trang bạn có làm được không?
Đâu có đâu bác, em lấy mỗi dữ liệu cuối kỳ, và mỗi cơ sở tốn 2 cột (Nợ, Có) thôi mà bác, 200 cột xếp liên tiếp (cùng 1 sheet), sheet sau thì em có các công thức của em để tính các chỉ tiêu nhất định. Em chỉ cần hỗ trợ Copy và Paste nhanh thôi ạ
 
Upvote 0
Cũng có thể thêm Function này vào module. excel sẽ tắt tính năng tự động tính toán trong cell khi chạy code đi, có thể sẽ nhanh hơn được đôi giây đó :)
Mã:
Function GetSpeed(doIt As Boolean)
Application.ScreenUpdating = Not (doIt)
Application.EnableEvents = Not (doIt)
Application.Calculation = IIf(doIt, xlCalculationManual, xlCalculationAutomatic)
End Function
Function này còn thiếu, chưa hoàn chỉnh.
Thêm dòng này vào cuối, trước End Function:
GetSpeed = Application.ScreenUpdating

Đầu sub, đặt dòng này để gọi function:
tatTinhNangTuDong = GetSpeed(True)

Cuối sub, đặt dòng này để bật các chức năng trở lại:
GetSpeed(tatTinhNangTuDong)
 
Lần chỉnh sửa cuối:
Upvote 0
Cuối sub, đặt dòng này để bật các chức năng trở lại:
GetSpeed(tatTinhNangTuDong)
Điều này đương nhiên anh. Như em đã nói rõ đó là một function thì sẽ cần gọi nó đúng vị trí trong sub để có được hiệu quả như mong muốn ạ. Ai chưa biết thì đọc kỹ lưu ý của anh Việt rồi thực hành nhé.
 
Upvote 0
Web KT

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

Back
Top Bottom