Giúp đỡ tính tổng bằng VBA !!!

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

Ninosami

Thành viên mới
Tham gia
16/12/22
Bài viết
6
Được thích
0
Em muốn tỉnh tổng ở các ô bôi vàng bằng Macro nhưn đã loay hoay mấy ngày nay vẫn không được. Nhờ anh/ chị hỗ trợ giúp ạ. Em cám ơn nhiều
 

File đính kèm

  • TONG.png
    TONG.png
    231 KB · Đọc: 45
Sau khi đọc đoạn này, Chợt nhận ra bản thân cháu cũng đang mập mờ chỗ này.
...
Rõ ràng cũng dùng kiểu này mà lơ ngơ lẫn cả 2 cái luôn.
Theo tôi thì chú thích (comment) sai.
Chỗ đó đáng lẽ phải là Reset số dòng. Hiển nhiên biến K là biến đếm số dòng kết quả. Lệnh ReDim ở trên tạo mảng với cỡ lớn nhất có thể xảy ra (tức là cứ mỗi dòng đàu vào sẽ tạo ra mọt dòng đầu ra (quan hệ 1-1).
 
Lần chỉnh sửa cuối:
Upvote 0
Theo tôi thì chú thích (comment) sai.
Chỗ đó đáng lẽ phải là Reset số dòng. Hiển nhiên biến K là biến đếm số dòng kết quả. Lệnh ReDim tạo mảng với cỡ max có thể xảy ra (tức là cứ mỗi dòng đàu vào sẽ tọa ra mọt dòng đầu ra.
Ban đầu cháu không có cái dòng Earse và Redim đâu ạ. Thấy nó ra kết quả sai.Bởi thấy nó vẫn lưu kết quả trước đó. Rồi cho thêm 2 dòng đó vào. Trước khi đọc cái bài trên của chú. Mới phát hiện ra mình cũng đang bị vấn đề mà như chú nói ở trên ấy ạ
 
Upvote 0
Lý thuyết:
VBA không phải là ngôn ngữ dịch ra exe rồi chạy. Code VBA phải chạy trên nền tảng VBA.

Chạy trên nền tảng đặc thù thì chậm hơn code exe trên nền tảng chủ của máy (Windows, MacOS, Linux,...) nhiều. Đó là lý do chính tại sao C++ chạy nhanh hơn Java rất nhiều lần, và C nếu viết giỏi sẽ chạy nhanh gần bằng code ASM (code máy).

Một trong những cái lợi của nền tảng đặc thù là bọn này có cỗ máy dọn rác cho nên tránh được lỗi rò bộ nhớ. Nếu bạn nào đã từng viết C/C++ rồi sẽ thấy đó là cái bug đáng gờm nhất của hai ngôn ngữ này. Đổi lại, như tôi nói trên chúng có tốc độ khong thể chối cãi. Nếu bạn đọc bài của tôi nhiều sẽ thấy tôi có từng nói Pyhton dựa vào các thư viện viết bằng C cho neentoocs độ đáng nẻ, chứ chính nó chạy trên nền tảng đặc thù.

Cỗ máy dọn rác (garbage collector) là gì?
Là một phần mềm có nhiệm vụ đi gồm thâu lại những mảnh trong bộ nhớ không dùng tới nữa. Chỗ gồm thâu này sẽ lại trở thành free, các lệnh cần bộ nhớ như lệnh tạo chuỗi, lệnh tạo đối tượng (object) sẽ có nhiều chỗ trống hơn để làm việc.

Khi nào thì cỗ máy biết đấy là rác để gom về dùng lại?
Khi vùng nhớ ấy không còn cái gì trỏ vào.
Đối với chuỗi, nếu bạn gán chuỗi với trị khác thì vùng nhớ chứa trị cũ sẽ được giải nhiệm. Cỗ dọn rác chiếu vào đấy để đưa vùng nhớ này vào vùng free agents. Vì vậy, gặp chương trình dùng chuỗi quá dài thì người ta tiết kiệm biooj nhớ bằng cách dùng xong ròi thì gán "" cho nó.
Đối với mảng động thì khi bạn dùng lệnh Erase. VBA sẽ tách tên mảng ra khỏi cái vùng nhớ trên. Vùng nhớ trước đó là mảng, bây giờ là con vô thừa nhận. Và cỗ máy sẽ nhận ra chúng.
Đối với đối tượng thì khi bạn dùng lệnh Set a = đối tượng nào đó thì VBA sẽ trỏ biến a vào đối tượng ấy, cũng như ký hợp đồng mướn người. Sau đó bạn Set a= Nothing thì lệnh này tách tên biến khỏi đối tượng. Khi đôi tượng không còn biến nào trỏ vào nữa thì nó không còn ràng buộc hợp đồng nào và trở thành thất nghiệp. Và cỗ dọn rác sẽ đưa vùng nhớ của nó vào chỗ "thằng này heets xài rồi, cứ việc xiết nhà đát của nó cho thằng khác đi. Vì vậy nếu bạn đọc các code viết cẩn thận sẽ thấy người ta Set Nothing sau khi không cần dùng biến ấy nữa.

Chú thích: khi Sub/Function chạy đến lệnh Exit/End thì VBA sẽ hủy các biến khai báo nội (ngầm hay rõ gì cũng vây) trong Sub/Function. Còng việc hủy này tự động tách rời chúng ra khỏi các vùng nhớ, - trừ oại biến không bị hủy là biến Static. Việc thâu hồi vùng nhớ sau đấy vẫn theo luật tôi nêu trên.

Chú thích 2: về việc nhiều biến trỏ vào 1 đối tượng (quan hệ N-1). Đối tượng trong trường hợp này chỉ có 1. Nếu mọt trong những cong việc gây tai nạn cho nó thì các chủ hợp đòng khác sẽ thấy nó đang bị thương. Nếu nó có cái xe tải mùa bóng đá vừa rôi cầm cố mất thì tất cả chủ hợp đồng sẽ thấy nó chả tải hàng cho ai cả. Việc nó có hy vọng tiếp tục hay không tùy vào chỗ có ngân hàng nào ký với nó một cái hợp đồng cho vay tiền chuộc xe. Việc nó không khả năng tiếp tục hợp đồng cũng chả lien quan đến nó thất nghiệp hay không. Các chủ phải tự biết mà chờ nó chuộc xe hay giúp nó chuộc xe hay hủy hợp đ\ồng. Khi mọi chủ đều tuyên bố hoàn tất hoặc hủy hợp đồng thì nó mới chính thức thất nghiệp.
 
Lần chỉnh sửa cuối:
Upvote 0
Lý thuyết:
VBA không phải là ngôn ngữ dịch ra exe rồi chạy. Code VBA phải chạy trên nền tảng VBA.

Chạy trên nền tảng đặc thù thì chậm hơn code exe trên nền tảng chủ của máy (Windows, MacOS, Linux,...) nhiều. Đó là lý do chính tại sao C++ chạy nhanh hơn Java rất nhiều lần, và C nếu viết giỏi sẽ chạy nhanh gần bằng code ASM (code máy).

Một trong những cái lợi của nền tảng đặc thù là bọn này có cỗ máy dọn rác cho nên tránh được lỗi rò bộ nhớ. Nếu bạn nào đã từng viết C/C++ rồi sẽ thấy đó là cái bug đáng gờm nhất của hai ngôn ngữ này. Đổi lại, như tôi nói trên chúng có tốc độ khong thể chối cãi. Nếu bạn đọc bài của tôi nhiều sẽ thấy tôi có từng nói Pyhton dựa vào các thư viện viết bằng C cho neentoocs độ đáng nẻ, chứ chính nó chạy trên nền tảng đặc thù.

Cỗ máy dọn rác (garbage collector) là gì?
Là một phần mềm có nhiệm vụ đi gồm thâu lại những mảnh trong bộ nhớ không dùng tới nữa. Chỗ gồm thâu này sẽ lại trở thành free, các lệnh cần bộ nhớ như lệnh tạo chuỗi, lệnh tạo đối tượng (object) sẽ có nhiều chỗ trống hơn để làm việc.

Khi nào thì cỗ máy biết đấy là rác để gom về dùng lại?
Khi vùng nhớ ấy không còn cái gì trỏ vào.
Đối với chuỗi, nếu bạn gán chuỗi với trị khác thì vùng nhớ chứa trị cũ sẽ được giải nhiệm. Cỗ dọn rác chiếu vào đấy để đưa vùng nhớ này vào vùng free agents. Vì vậy, gặp chương trình dùng chuỗi quá dài thì người ta tiết kiệm biooj nhớ bằng cách dùng xong ròi thì gán "" cho nó.
Đối với mảng động thì khi bạn dùng lệnh Erase. VBA sẽ tách tên mảng ra khỏi cái vùng nhớ trên. Vùng nhớ trước đó là mảng, bây giờ là con vô thừa nhận. Và cỗ máy sẽ nhận ra chúng.
Đối với đối tượng thì khi bạn dùng lệnh Set a = đối tượng nào đó thì VBA sẽ trỏ biến a vào đối tượng ấy, cũng như ký hợp đồng mướn người. Sau đó bạn Set a= Nothing thì lệnh này tách tên biến khỏi đối tượng. Khi đôi tượng không còn biến nào trỏ vào nữa thì nó không còn ràng buộc hợp đồng nào và trở thành thất nghiệp. Và cỗ dọn rác sẽ đưa vùng nhớ của nó vào chỗ "thằng này heets xài rồi, cứ việc xiết nhà đát của nó cho thằng khác đi. Vì vậy nếu bạn đọc các code viết cẩn thận sẽ thấy người ta Set Nothing sau khi không cần dùng biến ấy nữa.

Chú thích: khi Sub/Function chạy đến lệnh Exit/End thì VBA sẽ hủy các biến khai báo nội (ngầm hay rõ gì cũng vây) trong Sub/Function. Còng việc hủy này tự động tách rời chúng ra khỏi các vùng nhớ, - trừ oại biến không bị hủy là biến Static. Việc thâu hồi vùng nhớ sau đấy vẫn theo luật tôi nêu trên.

Chú thích 2: về việc nhiều biến trỏ vào 1 đối tượng (quan hệ N-1). Đối tượng trong trường hợp này chỉ có 1. Nếu mọt trong những cong việc gây tai nạn cho nó thì các chủ hợp đòng khác sẽ thấy nó đang bị thương. Nếu nó có cái xe tải mùa bóng đá vừa rôi cầm cố mất thì tất cả chủ hợp đồng sẽ thấy nó chả tải hàng cho ai cả. Việc nó có hy vọng tiếp tục hay không tùy vào chỗ có ngân hàng nào ký với nó một cái hợp đồng cho vay tiền chuộc xe. Việc nó không khả năng tiếp tục hợp đồng cũng chả lien quan đến nó thất nghiệp hay không. Các chủ phải tự biết mà chờ nó chuộc xe hay giúp nó chuộc xe hay hủy hợp đ\ồng. Khi mọi chủ đều tuyên bố hoàn tất hoặc hủy hợp đồng thì nó mới chính thức thất nghiệp.
Em đọc hết rồi nhưng chưa đủ khả năng để hiểu.
 
Upvote 0
Em đọc hết rồi nhưng chưa đủ khả năng để hiểu.
Nếu bạn không cần biết lý thuyết, hoặc tự cho rằng mình không đủ trình độ để hiểu thì cứ để dó. Lý thuyết này chỉ quan trọng đối với dân chuyên lập trình.

Là dân viết ứng dụng VBA (với dữ liệu khủng như ở GPE này) thì bạn chỉ cần biết các kiểu như thế nào là giải phóng bộ nhớ. Nhất là vùng nhớ của mảng.
- mảng chiếm hữu một vùng nhớ kiên tục trong bộ nhớ (đó là lý do chính tại sao nó hoạt động rất hiệu quả về tốc độ lẫn code.
- mảng được khai báo chứa kiểu căn bản (integer, long, single, double) thì các trị nằm đúng vị trí của phần tử trong mảng.
- các kiểu dữ liệu khác thì chỉ chứa con trỏ vào trị thật của chúng. Điển hình mảng chuỗi sẽ giành ra 10 bytes (hay 8bytes gì đó, hiện tại quên mất con số) cho mỗi phần tử để trỏ vào vùng nhớ chính thức (độ dài của chuỗi). Sau đó nếu bạn gán trị cho chuỗi thì số bytes chiếm ngự sẽ cộng thêm.
Khi bạn xóa mảng thì mọi chuỗi trở về "", các vùng chứa trị các chuỗi được giải phóng. Nếu bạn dùng lệnh Erase để xóa chuỗi thì ngoài việc giải phóng chuỗi, VBA sẽ cho giải phóng luôn cái vùng chứa con trỏ. Tùy theo người viết cân nhắc muốn xóa theo phương pháp nào.
- Chuỗi tĩnh (chuỗi được định cỡ lúc khai báo) cũng như mảng tĩnh không thể giải phóng vùng nhớ. Chúng được compiler giành chỗ rồi.

Và nếu biết sự hiện hữu của cỗ mày dọn rác thì cũng biết rằng lệnh giải phóng bộ nhớ không hẳn lập tức chuyển nó thành free. Vùng nhớ thải ra còn phải để cỗ máy dọn rác đi ngang mới hoàn toàn giải phóng. Có thể chậm hơn lúc code thực hiện 1 chút.
 
Upvote 0
Nếu bạn không cần biết lý thuyết, hoặc tự cho rằng mình không đủ trình độ để hiểu thì cứ để dó. Lý thuyết này chỉ quan trọng đối với dân chuyên lập trình.

Là dân viết ứng dụng VBA (với dữ liệu khủng như ở GPE này) thì bạn chỉ cần biết các kiểu như thế nào là giải phóng bộ nhớ. Nhất là vùng nhớ của mảng.
- mảng chiếm hữu một vùng nhớ kiên tục trong bộ nhớ (đó là lý do chính tại sao nó hoạt động rất hiệu quả về tốc độ lẫn code.
- mảng được khai báo chứa kiểu căn bản (integer, long, single, double) thì các trị nằm đúng vị trí của phần tử trong mảng.
- các kiểu dữ liệu khác thì chỉ chứa con trỏ vào trị thật của chúng. Điển hình mảng chuỗi sẽ giành ra 10 bytes (hay 8bytes gì đó, hiện tại quên mất con số) cho mỗi phần tử để trỏ vào vùng nhớ chính thức (độ dài của chuỗi). Sau đó nếu bạn gán trị cho chuỗi thì số bytes chiếm ngự sẽ cộng thêm.
Khi bạn xóa mảng thì mọi chuỗi trở về "", các vùng chứa trị các chuỗi được giải phóng. Nếu bạn dùng lệnh Erase để xóa chuỗi thì ngoài việc giải phóng chuỗi, VBA sẽ cho giải phóng luôn cái vùng chứa con trỏ. Tùy theo người viết cân nhắc muốn xóa theo phương pháp nào.
- Chuỗi tĩnh (chuỗi được định cỡ lúc khai báo) cũng như mảng tĩnh không thể giải phóng vùng nhớ. Chúng được compiler giành chỗ rồi.

Và nếu biết sự hiện hữu của cỗ mày dọn rác thì cũng biết rằng lệnh giải phóng bộ nhớ không hẳn lập tức chuyển nó thành free. Vùng nhớ thải ra còn phải để cỗ máy dọn rác đi ngang mới hoàn toàn giải phóng. Có thể chậm hơn lúc code thực hiện 1 chút.
Em cảm ơn anh ạ.
 
Upvote 0
Web KT

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

Back
Top Bottom