Rắc rối khi sử dụng hàm RANDBETWEEN() khi sử dụng kèm với VBA

Liên hệ QC

Mr.hieudoanxd

Thành viên thường trực
Tham gia
25/10/19
Bài viết
322
Được thích
150
Chào các bác!
Em có sử dụng hàm Randbetween() khi muốn tạo số ngẫu nhiên trong 1 sheet. Trong sheet này có sử dụng 1 code để chạy biên bản. Và rắc rối phát sinh như sau:
- khi tạo sub mới, sub không liên quan đến sub trên, thậm chí tạo modul mới, sheet mới không đề cập gì đến sheet này nhưng luôn chạy về các sub xử lý biên bản trên
(các bác xem ở sub test() em tạo trên Sheets("sheet1")) và các sub() chạy trong biên bản
Em nghĩ là do hàm Ranbtween ở trên
Vậy các bác có thể cho em biết làm cách nào để hiện tượng trên không xẩy ra. Hoặc nếu không thể chữa được thì có cách nào để khắc phục không?
Em cảm ơn các bác!
 

File đính kèm

  • test.xlsb
    189.9 KB · Đọc: 17
Hàm Randbetween() sẽ tự động chạy khi có bất kỳ sự thay đổi nào trong sheet của tất cả các file. Cách giải quyết nên thế này:
Cách 1: sau khi gán hàm Randbetween() xong thì xóa công thức, chỉ để lại giá trị.
Cách 2 dùng cách lấy giá trị randrom trong VBA, bạn xem hướng dẫn và mã nguồn tại đây.
 
Upvote 0
Em cảm ơn bác Tuân đã giúp đỡ.
Trước đây, em có làm cách tạo riêng 1 sheet để tạo dữ liệu random xong đó để giá trị bỏ công thức sau đó gọi lại bằng Vlookup. Tuy nhiên điều này làm tăng khá nhiều dung lượng File do cần nhiều ô để ghi dữ liệu random em thấy có vẻ giống cách 1 của anh.
 
Upvote 0
Em cảm ơn bác Tuân đã giúp đỡ.
Trước đây, em có làm cách tạo riêng 1 sheet để tạo dữ liệu random xong đó để giá trị bỏ công thức sau đó gọi lại bằng Vlookup. Tuy nhiên điều này làm tăng khá nhiều dung lượng File do cần nhiều ô để ghi dữ liệu random em thấy có vẻ giống cách 1 của anh.

Đúng là bạn đang làm theo cách một như mình nói. Bạn dùng Random có nghĩa cần giá trị thay đổi trước lúc tính toán? Vậy có thể khi đóng file thì xoá vùng này đi, khi mở thì tạo lại. Nếu không thể xoá thì mĩnh nghĩ phải chấp nhận file nặng còn hơn là tốc độ quá chậm bởi Random.
 
Lần chỉnh sửa cuối:
Upvote 0
Đúng là bạn đang làm theo cách một như mình nói. Bạn dùng Random có nghĩa cần giá trị thay đổi trước lúc tính toán? Vậy có thể khi đóng fike thì xoá vùng này đi, khi mở thì tạo lại. Nếu không thể xía thì mĩnh nghĩ phải chấp nhận dike nặng còn hơn là tốc độ quá chậm bởi Random.
Đúng là tốc độ xử lý file của em đang bị chậm đi rất nhiều mỗi thao tác với file gốc đang có tầm gần 2k phép tính(File em gửi lên diễn đàn là file em đã lược đi rồi ạ) thêm nữa là không thể kiểm tra Code chạy như thế nào bằng phím F8 được. Em thấy phần " xóa khi đóng file và tạo lại khi mở file" rất hay ạ. Em sẽ giải quyết theo hướng đó. Cảm ơn anh!
 
Upvote 0
làm cách nào để hiện tượng trên không xẩy ra
Tưởng gì, đọc cái biết ngay bệnh.
Cái này vặt vãnh ấy mà, cứ liên quan tới sự kiện của bảng tính là phải nhớ ngay tới câu thần chú EnableEvents chớ. Nhớ nha. Nhớ câu thần chú đó.
Khuyến mại thêm vài cái nữa, đảm bảo mọi cái mà dùng nó là siêu tốc luôn á. Bạn chép như hình là được.

Nhắc lại nha: Nhớ câu thần chú kia nha. Không nhớ thì chán lắm ớ.

1630510420950.png
 
Upvote 0
Tưởng gì, đọc cái biết ngay bệnh.
Cái này vặt vãnh ấy mà, cứ liên quan tới sự kiện của bảng tính là phải nhớ ngay tới câu thần chú EnableEvents chớ. Nhớ nha. Nhớ câu thần chú đó.
Khuyến mại thêm vài cái nữa, đảm bảo mọi cái mà dùng nó là siêu tốc luôn á. Bạn chép như hình là được.

Nhắc lại nha: Nhớ câu thần chú kia nha. Không nhớ thì chán lắm ớ.

View attachment 265242
Rất tiếc là không phải vậy nha bạn. Bạn để ý trong modules Main_function mình chưa xóa hết, mình có để function Speedvba cũng có EnableEvents = false nhé. Bạn thử tại file của mình về bổ sung sub của bạn hoặc thêm speedvba(true) sau đó ấn F8 chạy thử sub test() xem nó luôn luôn quay lại các sub ở main_function (do hàm randbetween kia).
 
Upvote 0
Vâng, Anh cho em xem đi ạ!
Lần sau thay vì kêu người khác thử thì mình tự cho tay vào làm nhé. Bởi người đưa câu trả lời lên đã kiểm tra, thử nghiệm vài lần và chí ít với thử nghiệm đó đã thành công rồi.

Thấy tìm từ khóa EnableEvents rồi đọc mấy thớt liền rồi mà không làm đi, không chép cái bài trên kia vào đi, lại còn kêu "rất tiếc không phải". @@


 
Upvote 0
Lần sau thay vì kêu người khác thử thì mình tự cho tay vào làm nhé. Bởi người đưa câu trả lời lên đã kiểm tra, thử nghiệm vài lần và chí ít với thử nghiệm đó đã thành công rồi.
Thấy tìm từ khóa EnableEvents rồi đọc mấy thớt liền rồi mà không làm đi, không chép cái bài trên kia vào đi, lại còn kêu "rất tiếc không phải". @@
Sao lúc nãy em có chạy mà không thấy được nhỉ. Không phải em lười đâu ạ. Lúc anh bảo EnableEvent em đã search trên diễn đàn của bác ndu.. hướng dẫn. em thử không được mà. Giờ lại thành được.
Rất cảm ơn anh, tận tâm quá!
Em đóng bài đăng ạ
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Việc code VBA dùng mấy thuộc tính của Applciation để chặn sự kiện cập nhật màn hình và tính toán ngày nay trên GPE hay đâu đó nhiều người vận dụng, không như cách đây nhiều năm nhiều người còn chưa biết. Tuy nhiên nó chỉ là áp dụng cứng, nếu không có kinh nghiệm mà chỉ nhăm nhe dùng nó rồi mà quên đi tư duy tổng quát thì lại không đạt được hiệu quả mong muốn đâu. Với bài của bạn đã đụng phải một dạng hàm đặc biệt của Excel là RANDBETWEEN(). Như tôi nói ở trên, bất kể một giá trị nào được nhập vào bất kỳ file nào thì hàm này tính toán lại (dù nó đang ở đâu) và chế độ tự động tính toán của Excel đang để tự động. Việc bạn chạy code và dùng lệnh để chặn sự kiện Excel chỉ giúp khi bạn chạy code lúc đó mà thôi, những tháo tác nhập liệu bằng tay của người dùng sẽ bị thằng Random kia gây ảnh hưởng lớn về tốc độ. Khi một công thức mà trong đó nhiều phép toán thực hiện và liên lụy tới hàm Random, khi hàm này chạy thì kéo theo cả công thức đó chạy, cả công thức ô đó chạy sẽ kéo theo tất cả các nơi tham chiếu đến nó chạy lại. Như vậy, nếu khối lượng hàm như Random nhiều mà bạn vẫn để sống thì sớm muộn sẽ bị người dùng kêu chậm. Vậy tùy vào mục tiêu của bạn để xem xét hoàn thiện nó hơn.

Bạn nào muốn thử cái tôi vừa nói, hãy copy công thức có hàm RANDBETWEEN() cho nhiều ô, sau đó nhập liệu file khác sẽ thấy ảnh hưởng. Với file của bạn đặt câu hỏi trên thì tôi đã thấy có độ trễ rồi dù file này vẫn còn ít công thức. Nếu ai dùng hàm OFFSET cũng có chung đặc tính với hàm Random này.
 
Lần chỉnh sửa cuối:
Upvote 0
Lúc anh bảo EnableEvent em đã search trên diễn đàn
Nhân tiện cái vụ Envent này cho bạn TỪ KHÓA SIÊU HỊN để lần sau tìm cho dễ, gặp tới là nhớ ngay và luôn câu thần chú trên nhá.
Mấy cái hàm mà gây nên hiện tượng động đậy kia á, người ta gọi là Volatile Function.
Nhớ từ khóa đó nhá. Từ khóa chuẩn chỉ là quan trọng lắm á. Dùng mấy từ khóa linh tinh, lung tung, không chuẩn là tìm không ra vấn đề đâu.
Lấy giấy bút ghi vào cho nhớ nha.

1630517574514.png
 
Upvote 0
Bạn nào muốn thử cái tôi vừa nói, hãy copy công thức có hàm RANDBETWEEN() cho nhiều ô, sau đó nhập liệu file khác sẽ thấy ảnh hưởng. Với file của bạn đặt câu hỏi trên thì tôi đã thấy có độ trễ rồi dù file này vẫn còn ít công thức. Nếu ai dùng hàm OFFSET cũng có chung đặc tính với hàm Random này.
:(( em rất hay dùng hàm Offset trong file em ví dụ cũng có offset trong NameManager đấy ạ. Em vẫn đi theo hướng bài #5 thôi ạ bởi vì ngoài việc check code chạy ntn em còn không UNDO lại thao tác... khác phiền hà. Em muốn hỏi thêm việc em giấu hàm offset trong Name Manager có bị tính là hàm tự tính toán không ạ?
Đã ghi bút đỏ rồi đây ạ :D mấy hàm này em cũng hay dùng lắm. :((
Chân thành cảm ơn các anh!
 
Lần chỉnh sửa cuối:
Upvote 0
Hàm Randbetween() sẽ tự động chạy khi có bất kỳ sự thay đổi nào trong sheet của tất cả các file. Cách giải quyết nên thế này:
Cách 1: sau khi gán hàm Randbetween() xong thì xóa công thức, chỉ để lại giá trị.
Cách 2 dùng cách lấy giá trị randrom trong VBA, bạn xem hướng dẫn và mã nguồn tại đây.
Cao thủ cho em hỏi chút ạ. Trong bảng tính của e có nhiều ô dữ liệu bây giờ muốn tìm ô nào do công thức tạo ra được không. ví dụ: ô A1: có số 1 do nhập thủ công vào; ô A2: có số 2 do hàm =A1+1; ô A3 có số 3 do VBA khi chạy code ghi vào. Vậy em muốn tìm trong bảng tính những ô do hàm tính như A2 thì có cách nào không ạ? (không thể dò từng ô để xem vì bảng tính quá lớn). Vì khi chạy code VBA rất chậm, chắc có ô công thức nào đó cản trở, muốn tìm và xóa đi. Cảm ơn cao thủ đã chỉ giáo ạ. Thank
 
Lần chỉnh sửa cuối:
Upvote 0
Tìm xong bạn muốn làm gì với nó?
Ví dụ, tô màu nền các ô chứa công thức:
PHP:
Sub timCongthuc()
With ActiveSheet.UsedRange.SpecialCells(xlCellTypeFormulas)
    .Interior.ColorIndex = 3
End With
End Sub
 
Upvote 0
Bài #15 liên quan gì đến Randbetween?
 
Upvote 0
Bài #15 liên quan gì đến Randbetween?
Dạ lúc đầu em cũng nghĩ như anh, sau nghĩ lại thấy cũng có liên quan.
Trong các ô đấy có chứa hàm, mà các hàm đó và randbetween đều cùng 1 họ nhà hàm của MS Excel ạ.

Kakaka
(Đói bài quá...)
 
Upvote 0
Web KT

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

Back
Top Bottom