Sao cập nhật từ form xuất sheet chậm vậy? (1 người xem)

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

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

bebeen

Thành viên thường trực
Tham gia
13/2/12
Bài viết
213
Được thích
24
Em có ví dụ này nhờ mọi người xem cho em nhé! Sao cập nhật dữ liệu từ form xuống bảng tính lại chậm đến vậy? Nguyên nhân?
Câu hỏi cụ thể trong file đính kèm!
 

File đính kèm

Khó quá! Tìm mãi mà vẫn không ra!!?
 
Upvote 0
Em có ví dụ này nhờ mọi người xem cho em nhé! Sao cập nhật dữ liệu từ form xuống bảng tính lại chậm đến vậy? Nguyên nhân?
Câu hỏi cụ thể trong file đính kèm!

VÌ bạn đã tắt màn hình cập nhập Application.ScreenUpdating=False rồi nên chỉ khi kết thúc Form KHI ĐÓ dữ liệu mới cập nhập xuống sheets.

Mặt khác listbox1 của bạn lại là liên kết Rowsource và theo name VUNG, name này lại là name động theo "countA(..) chỉ cập nhập khi có dữ liệu dưới sheet" nên vùng bị dưới hạn đến dòng cuối dữ liệu +1 (vì bạn không trừ đi tiêu đề khi điếm CountA(...) cả cột)==> bạn thấy lần đầu tiên bấm save thì có thấy list box them dòng, còn lần 2 thì không,

Túm lại không phải Sub đơ hay chậm, mà do Sheet chưa cập nhập Listbox1 thì liên kết vùng chưa cập nhập ==> bạn tưởng bị sao, chỉ khi bạn bấm Cancel đóng form (dĩ nhiên ý nghĩa của nút Cancel không đúng theo tiêu đề của nó)

Đó là lời giải thích hợp lý,


Vậy giải pháp thế nào:

Thông thường người ta không dùng Listbox với Rowsource thế - và quan trọng là trên form và tạm chứa vào 1 biến Array đã sau đó bấm nút kết thúc sẽ hỏi có cập nhập dữ liệu vừa xong không khi đó NẾU CÓ mới gán thực xuống sheets

Tuy nhiên nếu bạn vẫn muốn giữ nguyên si như code thì bạn làm các bước sau:

1- Sửa lại Name VUNG cho đúng phạm vi: sửa COUNTA(DATA!$A:$A) thành COUNTA(DATA!$A:$A)-1


2- Trong Code vì muốn màn hình cập nhập thì bạn phải bỏ hết các câu lệnh 'Application.ScreenUpdating = False đi (để luôn cập nhập màn hình)
-- hoặc tại chỗ cần cập nhập (khi bấm SAVE) thì bạn phải bật màn hình trở lại Application.ScreenUpdating = TRUE, sau đó lại tắt đi


3- Trong CODE nut save - sau khi gán xuống sheets rùi thì để cập nhập cho listbox1 thì bạn đặt lệnh này set lại Rowsource cho nó

PHP:
Listbox1.RowSource = "Vung"
vì thấy bạn viết code ngon lành rùi, nên chắc chắn bạn tự sửa được, và đó chỉ là đề xuất giải pháp tình thế thôi. còn giải pháp tốt nhất thì phải tùy vào quan niệm và cách tổ chức toàn bộ ứng dụng của bạn
 
Lần chỉnh sửa cuối:
Upvote 0
Em có ví dụ này nhờ mọi người xem cho em nhé! Sao cập nhật dữ liệu từ form xuống bảng tính lại chậm đến vậy? Nguyên nhân?
Câu hỏi cụ thể trong file đính kèm!

Nếu tôi không hiểu sai lời giải thích của vodoi2x cho bạn - nếu hiểu sai thì xin lỗi nhé- thì có chút chưa chính xác nên tôi bổ sung thêm.
Khi bạn nhấn Save thì cả dữ liệu trên sheet, Vung và trong ListBox đều cập nhật ngay tức khắc chứ không phải chưa được cập nhật. Bằng chứng là dữ liệu nhập vào bạn nhìn thấy ngay tức khắc trên ListBox. Mà bạn có Listbox1.RowSource = "Vung" nên dữ liệu xuất hiện trong ListBox là bằng chứng là dữ liệu đã có trên sheet (nên Vung thay đổi --> ListBox thay đổi). Nhưng tại sao bạn không nhìn thấy cập nhật? Cập nhật đã có nhưng màn hình không được làm mới để hiển thị nội dung đã cập nhật. Chả là bạn đã cấm làm mới màn hình rồi sao (Application.ScreenUpdating = False)? Nội dung sheet đã được cập nhật nhưng chưa có lệnh hiển thị cho bạn chiêm ngưỡng, màn hình không được làm mới - bạn cứ "nắm" thanh tiêu đề của UserForm rồi di chuyển Form thì bạn sẽ thấy màn hình không được vẽ lại.
Để nhìn thấy nội dung được cập nhật thì bạn phải "cho phép" màn hình được làm mới: Application.ScreenUpdating = TRUE, tức ở cuối CommandButton3_Click phải có dòng đó.
---------------
Thực ra nếu bạn "đập" một lúc nhiều dữ liệu xuống sheet thì mới cần cấm làm mới màn hình (Application.ScreenUpdating = False) vì nếu bạn không cấm thì trong quá trình nhập liệu xuống sheet thì màn hình liên tục được làm mới nên thời gian làm rất lâu. Trong những th như thế thì cần cấm làm mới màn hình nhưng khi nhập liệu xong thì phải có dòng cho phép làm mới màn hình: Application.ScreenUpdating = TRUE.
Tất nhiên nếu không có Application.ScreenUpdating = TRUE thì khi bạn đóng UserForm thì Excel cũng thiết lập lại Application.ScreenUpdating = TRUE mà không hỏi bạn có đồng ý hay không.
Còn th của bạn mỗi lần nhập là 1 dòng dữ liệu thì bỏ luôn Application.ScreenUpdating = False đi.
------------
Hiện nay như vodoi2x nói thì bạn xác định Vung sai. Bạn không để ý thấy vì trong ListBox có thêm dòng cuối là dòng 8 nhưng nó là dòng trống nên bạn không nhìn thấy. Bạn cứ thử nhập gì đó vào ô B8 rồi nhấn nút Update sẽ thấy.
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu tôi không hiểu sai lời giải thích của vodoi2x cho bạn - nếu hiểu sai thì xin lỗi nhé- thì có chút chưa chính xác nên tôi bổ sung thêm.
Khi bạn nhấn Save thì cả dữ liệu trên sheet, Vung và trong ListBox đều cập nhật ngay tức khắc chứ không phải chưa được cập nhật. ......

Đúng thế, dùng từ chưa chuẩn sát, nói một cách chuẩn sát là Mọi thứ đã được cập nhập nhưng chỉ riêng MÀN HÌNH (phần nhìn thấy) LÀ CHƯA ĐƯỢC CẬP NHẬP - vì trong code bebeen đã tắt cập nhập màn hình,

Vậy giải pháp sửa là bebeen chỉ cần sửa 2 bước bài #3 trên (bước 1- 2-) thui, không cần bước 3-

-------------
dùng riêng bước 3- trong trường hợp khi bạn muốn tắt CẬP NHẬP MÀN HÌNH SHEET song VẪN MUỐN THẤY CẬP NHẬP (UPDATING) CHO Listbox1

vậy bebeen cứ test đi nhé, còn việc làm theo cách nào thì tùy chọn
 
Lần chỉnh sửa cuối:
Upvote 0

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

Back
Top Bottom