Tôi có 1 thắc mắc như sau:
Lập trình bằng VBA trong exell: - Thấy trên diễn đàn chúng ta các anh chị có kinh nghiệm đều khai báo Dùng Biến đối tượng worksheet (bằng lệnh set). Sau đó tùy biến sheet thông qua biến đối tượng này (ví dụ chèn dòng, điền dữ liệu, định dạng ô...).
- Tuy nhiên việc khai báo rắc rối (theo tôi nghĩ vì phải qua trung gian), lại phải giải phóng biến sau khi dùng (set bien = nothing)
1. Vậy tại sao không lập trình trực tiếp trên sheet mà phải thông qua biến?
2. Phải chăng là dùng biến sẽ làm code chạy nhanh hơn?
Mong được giải đáp. Chân thành cảm ơn!
Chúc anh chị sức khỏe!
Theo mình nghỉ thì người & máy xài 2 ngôn ngữ khác nhau, nếu ta không làm tốt chuyện của ta là viết tường minh, thì máy sẽ nhận việc đó thôi, chúng ta tránh rắc rối, thì máy fải lãnh rắc rối thôi, trên sa mạc chỉ có 2 ta thì anh không tìm nước thì tôi fải đi tìm HOH thôi, hay chờ mưa từ trời?
Theo mình nên khai báo biến đối tượng loại này cũng là đỡ sai về chính tả khi fải viết tên trang tính trong chương trình, nhứt là vài người còn xài tiếng Việt với đủ loại font nữa chứ?
Nói là đỡ sai chính ta vì 1 khi đã có biến đối tượng thì chỉ viết tên trang tính gán cho đối tượng có 1 lần duy nhứt; Sai đúng gì cũng thấy ngay;
Còn khi không có nó, ta fải ghi nhiều lần, đó là công việc nhàm chán, & từ đó dễ sai chính tả hơn bội fần
Mình tin thôi, chứ chưa thể chứng minh: Làm việc với biến sẽ nhanh hơn với khi làm việc với trang tính
Theo mình làm việc với biến chắc chắn sẽ chậm hơn trực tiếp trên sheet cũng giống như điểm danh bằng tên và điểm danh bằng số thẻ.
Nhưng với biến nó có lợi là cơ động hơn nếu vùng động, sử lý lệnh nhanh hơn khi viết Code.
Hì, "Nhân vo thập toàn" mà. Tuỳ cơ ứng biến thôi.
Thật khó nói gì với những tranh luận dạng này... Có bài toán cụ thể với dữ liệu thật lớn, ta đo thời gian là biết thôi
Tôi thì cứ làm sao cho code thật gọn gàng là được rồi
Biến là địa chỉ bộ nhớ lưu các giá trị người dùng. Biến đối tượng lưu con trỏ hay địa chỉ của một đối tượng.
Ví dụ Excel khởi tạo đối tượng (bản chất là biến) Sheet1 để chúng ta khai thác thì Sheet1 được lưu trong một địa chỉ nhớ ví dụ là &HA1
Ta dùng biến đối tượng wshSale, gán địa chỉ của Sheet1 cho nó Set wshSale = Sheet1
Như vậy việc chúng ta dùng Sheet1 hay wshSale đều trỏ tới địa chỉ nhớ là &HA1 , không phải dùng wshSale thông qua Sheet1 rồi mới đến địa chỉ &HA1
mà là
wshSale->&HA1
Sheet1->&HA1
Khi không dùng biến wshSale nữa thì ta gán địa chỉ rỗng cho nó bằng cách Set wshSale = nothing như vậy đến giờ thì chỉ còn thằng Sheet1->&HA1
Tại sao dùng biến đối tượng phải Set obj = Nothing khi không dùng?
Các đối tượng được tạo ra và chiếm dụng trong RAM, Resource của Windows, trong VB/VBA các hàm tạo là CreateObject() hay Set obj = New ... hay Dim obj As New ...
Khi ta không dùng đối tượng obj thì giải phóng nó bằng cách Set obj = Nothing, khi đó bộ nhớ RAM vResource không còn bị chiếm dụng nữa. Gần như tất cả các đối tượng/Class các nhà lập trình đều quy ước nó được giải phóng hết khi có lệnh Destroy <-> Set = Nothing.
Ngoại lệ:
Quay lại phần đầu tiên các đối tượng mà Office tạo ra thuộc các thành phần của Application như Worksheet, Workbook, Range,...không bị giải phóng bới người dùng mà phải do Application xử lý, chính vì thế khi ta giải phóng biến đối tượng: Set wshSale = nothing thì đơn giản không gán địa chỉ &HA1 cho wshSale thôi, vùng nhớ &HA1 vẫn còn nguyên và Sheet1 vẫn khai thác nó. Các đối tượng chỉ được giải phóng khi Application.Quit --> Đây là quy định của Office!
Ví dụ khác là trong Excel ta chạy ứng dụng Winword
Mã:
Sub RunWord()
Dim objWord As Object
Set objWord = CreateObject("Word.Application")
objWord.Visible = True
MsgBox objWord.Caption
[COLOR="#FF0000"]objWord.Quit[/COLOR]
Set objWord = Nothing
End Sub
Nếu chúng ta không dùng lệnh objWord.Quit thì mặc dù đã Set objWord = Nothing nhưng Word vâcn đang chạy.
Trượng hợp khác là chúng ta dùng ADODB lập trình CSDL.
Khởi tạo đối tượng (tiếng anh hay dùng từ Instance) Connection
Set cnn = CreateObject("ADODB.Connection") hoặc Set cnn = New ADODB.Connection
Vùng nhớ của đối tượng Connection được tạo ra trong RAM, Resource và địa chỉ nhớ được lưu vào biến cnn để người dùng sử dụng.
Khi giải phóng nó, bắt buộc phải là
cnn.Close --> Đóng các CSDL đang mở
Set cnn = Nothing
Nếu chúng ta chỉ gán Set cnn = Nothing không thôi thì RAM và Resource vẫn còn lưu trữ Instance của Connection. Đây là quy định của ADODB!
Như vậy ta có thể kết luận:
1. Việc dùng biến đối tượng do người dùng tạo ra hay do chương trình tạo ra không ảnh hưởng tới tốc độ vì bản chất chúng chỉ lưu địa chỉ vùng nhớ và cùng trỏ trực tiếp vào địa chỉ này.
2. Khi không dùng đối tượng thì nên dùng Set obj = Nothing. Đây là quy ước chung cho các đối tượng được giải phóng khỏi bộ nhớ.
3. Có những trường hợp đặc biệt của Class, trước khi Set = Nothing thì phải chạy thủ tục đóng/xóa trước nhứ Quit(), Close().
Hy vọng bài viết này giúp các bạn hiểu rõ hơn về lập trình đối tượng trong Windows nói chung và Office nói riêng.
(Hơi lan man sang nội dung khác vì chúng có chút liên quan)
Đây đúng là Pro và câu trả lời cho điều tôi đang quan tâm. Chân thành cảm ơn và cảm phục sự chuyên sâu và trả lời rất chuyên nghiệp và tận tình chu đáo của bạn. Chúc bạn Pro luôn thành công!