Giúp e sửa lại code làm sao cho nhanh hơn với ạ

  • Thread starter Thread starter duhero
  • Ngày gửi Ngày gửi
Liên hệ QC

duhero

Thành viên chính thức
Tham gia
8/10/10
Bài viết
69
Được thích
1
Em có file dữ liệu khá lớn 150MB, khi e nhập liệu vào lệnh tự động chạy tìm kiếm để kiểm tra tên khá là chậm
Ở đây e có xóa bớt dữ liệu trong sheet và xóa cơ số sheet đi để up lên diễn đàn.

Các bác xem file cho e cao kiến với ạ.
 

File đính kèm

Em có file dữ liệu khá lớn 150MB, khi e nhập liệu vào lệnh tự động chạy tìm kiếm để kiểm tra tên khá là chậm
Ở đây e có xóa bớt dữ liệu trong sheet và xóa cơ số sheet đi để up lên diễn đàn.

Các bác xem file cho e cao kiến với ạ.

Thử cách này. Mỗi lần kích hoạt sheet TT thì code hoạt động
 

File đính kèm

Đến đoạn aaaaaaaaaaaaaaaaaaaaaaa là dừng lại là sao vậy anh ơi
 
Ái da nặng lắm bác ạ, vì mỗi khi mở lại file nhập tiếp nó load lại. Hoặc là khi nhập mới thì nó ko tự động load mà phải nhấn sang sheet bên cạnh rồi nhấn trở về nó mới chạy, như vậy lại mất công load lại những thằng bên trên
 
Như file của e cứ nhập 10 thằng 1 rồi chạy lệnh ở cột E,F thôi, ko là treo. Những thằng trên đã đúng tên, thì e xóa bỏ lệnh để cho nhẹ
 
Vậy code này vẫn chậm à? Nói chung là không hiểu.
Dạ vâng chậm vì khi Active nó lại load 1 loạt thì phải ạ, có cách nào những người đã nhập rồi thì lần sau khi mở file hoặc active sheet TT thì nó ko load lại nữa ko ạ, và khi mình nhập nó ra kết quả luôn ấy ạ
 
Theo mình có thể áp dụng một cách tiếp cận dùng bộ nhớ dạng Cache đối với bài toán này, cách thức như sau:
1. Khi mở file, kích hoạt một lần duy nhất việc nạp vào bộ nhớ danh sách không trùng của msvt vào một biến;
2. Mỗi khi có thay đổi số liệu thì sẽ thực hiện việc tính toán, tìm kiếm đối với ô có dữ liệu nguồn thay đổi so với biến đã xác định trong bước 1.
Nếu làm như vậy thì việc tính toán sẽ chỉ diễn ra với các số liệu thay đổi mà không phải làm lại từ đầu đối với tất cả các ô số liệu.
 
Theo mình có thể áp dụng một cách tiếp cận dùng bộ nhớ dạng Cache đối với bài toán này, cách thức như sau:
1. Khi mở file, kích hoạt một lần duy nhất việc nạp vào bộ nhớ danh sách không trùng của msvt vào một biến;
2. Mỗi khi có thay đổi số liệu thì sẽ thực hiện việc tính toán, tìm kiếm đối với ô có dữ liệu nguồn thay đổi so với biến đã xác định trong bước 1.
Nếu làm như vậy thì việc tính toán sẽ chỉ diễn ra với các số liệu thay đổi mà không phải làm lại từ đầu đối với tất cả các ô số liệu.
hic đó là cả 1 vấn đề đấy ạ
 
Dạ vâng chậm vì khi Active nó lại load 1 loạt thì phải ạ, có cách nào những người đã nhập rồi thì lần sau khi mở file hoặc active sheet TT thì nó ko load lại nữa ko ạ, và khi mình nhập nó ra kết quả luôn ấy ạ
Vấn đề là cốc có hiểu ý nhau.
Nếu hiểu được những thao tác của bạn thì may ra... thôi hỏng chơi nữa.
 
Thế thì bạn gửi rõ yêu cầu ra đi để chúng ta thử tìm giải pháp hợp lý nhá! Tuy nhiên, tôi có một vài chia sẻ:
1. Thường thì nếu là bài toán xử lý số liệu lớn hàng vạn dòng, việc dùng Excel sẽ là điều nên tránh vì có nhiều hạn chế (các bạn pro-excel đừng ném đá nhé). Nếu là tôi thì chuyển sang dùng hệ quản trị số liệu khác (fox, access...) sẽ là điều nên làm.

2. Nếu bắt buộc phải dùng Excel thì tính toán theo điều kiện và cách tiếp cận sẽ là chỉ tính toán với các số liệu có phát sinh, khi cần sẽ sử dụng công cụ tính toán toàn diện.
Với cách này, có thể có cách tiếp cận như sau:
+ Ngay khi mở file, xây dựng danh mục kiểm tra cho vào bộ nhớ.
+ Thiết lập hàm có 2 chế độ tính toán
- Tính khi có thay đổi số liệu và chỉ tính với số liệu đó thôi;
- Tính toàn diện khi điều kiện thỏa mãn
Trong trường hợp này sẽ cần có một biến ghi lại tình trạng tính toán để không tính toán toàn diện ngay từ khi mở file. Chỉ kích hoạt hàm với ô có số liệu thay đổi. Như thế sự kiện Worksheet_Change sẽ được sử dụng để ghi nhận xem ô nào có số liệu thay đổi để hàm nói trên chỉ tính toán với ô số liệu đó thôi.
Xin chia sẻ sơ sơ như thế.
 
Lần chỉnh sửa cuối:
Ái da nặng lắm bác ạ, vì mỗi khi mở lại file nhập tiếp nó load lại. Hoặc là khi nhập mới thì nó ko tự động load mà phải nhấn sang sheet bên cạnh rồi nhấn trở về nó mới chạy, như vậy lại mất công load lại những thằng bên trên

theo tôi thì bạn ko nên sử dụng sự kiện. làm một cái nút nhấn, khi nào cần kiểm tra thì nhấn cái nút đó cho nó chạy (dùng code anh QuangHai bài #2)
như vây tránh thì trạng code chạy khi ko cần thiết
 
Bác làm đúng ý em rồi đấy ạ. Chỉ có điều là nó vẫn chậm thui ạ hi hi

Ọc ọc ọc mình code hết khả năng rồi. Chắc không thể nhanh hơn.
Thử chiêu này xem sao
PHP:
Public Dic As Object
Sub Auto_Open()
Dim data(), sh As Worksheet, i, k
Set Dic = CreateObject("scripting.dictionary")
For Each sh In Worksheets
   If sh.Name <> "TT" Then
      data = sh.Range("B4", sh.[C65536].End(3)).Value
      For i = 1 To UBound(data)
         Dic(data(i, 1)) = data(i, 2)
      Next
   End If
Next
End Sub
Sub Main()
Dim Res(), tam(), i
If Dic.Count = 0 Then Auto_Open
With Sheets("TT")
   tam = .Range("B2", .[C65536].End(3)).Value
   ReDim Res(1 To UBound(tam), 1 To 2)
   For i = 1 To UBound(tam)
      If Dic.exists(tam(i, 2)) Then
         If Dic.Item(tam(i, 2)) = tam(i, 1) Then
            Res(i, 1) = tam(i, 1)
            Res(i, 2) = "y"
         Else
            Res(i, 1) = Dic.Item(tam(i, 2))
            Res(i, 2) = Res(i, 1)
         End If
      End If
   Next
   .[E2].Resize(i - 1, 2) = Res
 End With
 MsgBox "Done"
End Sub
 

File đính kèm

Web KT

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

Back
Top Bottom