Dim là từ viết tắt của Dimension sử dụng để khai báo các biến trong VBA. Bài viết sau đây Học Excel Online sẽ dành để hướng dẫn đầy đủ về sử dụng câu lệnh VBA Dim.
Xem nhanh
Description | Format | Example |
Biến đơn giản | Dim [Tên biến] As [Kiểu dữ liệu] | Dim count As Long
Dim amount As Currency Dim name As String Dim visible As Boolean |
Khai báo chuỗi cố định | Dim [Tên biến] As String * [kích thước biến] | Dim s As String * 4
Dim t As String * 10 |
Variant | Dim [Tên biến] As Variant
Dim [Tên biến] |
Dim var As Variant
Dim var |
Khai báo đối tượng Object | Dim [tên biến] As New [object type] | Dim coll As New Collection
Dim coll As New Class1 |
Object using Dim, Set and New | Dim [tên biến] As [object type]
Set [Tên biến] = New [object type] |
Dim coll As Collection
Set coll = New Collection Dim coll As Class1 Set coll = New Class1 |
Khai báo mảng cố định (mảng tĩnh) | Dim [Tên biến]([first] To [last] ) As [Type] | Dim arr(1 To 6) As Long |
Khai báo mảng động | Dim [Tên biến]() As [Type]
ReDim [Tên biến]([first] To [last]) |
Dim arr() As Long
ReDim arr(1 To 6) |
External Library
(Early Binding)* |
Dim [Tên biến] As New [item] | Dim dict As New Dictionary |
External Library
(Early Binding using Set)* |
Dim [Tên biến] As [item]
Set [Tên biến] = New [item] |
Dim dict As Dictionary
Set dict = New Dictionary |
External Library
(Late Binding) |
Dim [Tên biến] As Object
Set [Tên biến] = CreateObject(“[library]”) |
Dim dict As Object
Set dict = CreateObject(“Scripting.Dictionary”) |
Dim là từ viết tắt của Dimension sử dụng để khai báo các biến trong VBA. Có 4 loại câu lệnh Dim và khá giống nhau về cú pháp :
Định dạng như sau:
Dưới đây là các ví dụ về việc sử dụng các định dạng khác nhau:
Có thể khai báo nhiều biến trong một câu lệnh Dim:
Nếu chúng ta bỏ qua kiểu biến thì VBA sẽ tự động đặt kiểu thành Variant. Chúng ta sẽ xem thêm về Variant sau:
Khi khai báo nhiều biến cần chỉ định loại biến cụ thể:
Có thể đặt bao nhiêu biến tùy thích trong một câu lệnh Dim nhưng hơn hết là 3 hoặc 4 biến để dễ đọc.
Câu lệnh Dim có thể được đặt ở bất kỳ đâu nhưng phải trước các dòng biến được sử dụng. Nếu biến đứng trước câu lệnh Dim thì sẽ gặp lỗi “Variable not defined”.
Khi định vị câu lệnh Dim có thể thực hiện hai cách, có thể đặt tất cả các câu lệnh Dim ở đầu mã như sau:
Hoặc có thể khai báo biến ngay lập tức trước khi sử dụng:
Đặt câu lệnh Dim trong vòng lặp không ảnh hướng đến các biến. Khi VBA bắt đầu một Sub hoặc hàm thì điều đầu tiên là tạo tất cả các biến được khai báo trong câu lệnh Dim.
2 đoạn mã sau đây gần giống nhau. Đầu tiên, biến Count được khai báo trước vòng lặp. Trong mã thứ hai biến được khai báo trong vòng lặp:
Mã sẽ hoạt động giống hệt nhau vì VBA sẽ tạo các biến khi nó nhập vào Sub.
Trong C ++, C # và Java, chúng ta có thể khai báo và gán các biến trên cùng một dòng:
Điều này không thể làm trong VBA mà thay vào đó sẽ sử dụng toán tử dâu hai chấm để đặt ở các dòng khai báo và gán trên cùng một dòng:
Hoặc có thể đặt chúng hai dòng riêng biệt:
Hoặc đặt 3 dòng mã trên một dòng bằng cách sử dụng dấu hai chấm:
VBA không yêu cầu bắt buộc sử dụng câu lệnh Dim, tuy nhiên nếu không sử dụng có thể phát sinh một số vấn đề:
Vì vậy sử dụng Dim sẽ hữu ích cho mã. Chúng ta thực hiện bằng cách sử dụng lệnh Option Explicit. Nói chúng Vai trò của câu lệnh Dim trong VBA là tùy trường hợp
Chúng ta có thể đặt Dim trong một module bằng cách nhập Option Explicit ở đầu module. Để điều này xảy ra tự động trong mỗi module mới có thể làm như sau : Tool–>Options và chọn Require Variable Declaration.Sau đó, khi chèn module mới thì Option Explicit sẽ tự đồng thêm vào.
Tiếp theo là một số lỗi nếu không sử dụng lệnh Dim.
Lỗi biến trong VBA thì sao? Trong đoạn mã dưới đây, chúng tôi sử dụng biến Total mà không sử dụng câu lệnh Dim.
Nếu chúng ta đánh nhầm Total thì VBA sẽ coi là một biến mới. Ví dụ như mã dưới đây viết sai Total thành Totall:
VBA sẽ không phát hiện bất kỳ lỗi nào trong mã và sẽ in một giá trị không chính xác.
Chúng ta sẽ thêm Option Explicit và thử lại:
Khi chạy mã sẽ nhận lỗi “Variable not defined” (Biến không được xác định). Để ngăn lỗi này chúng ta cần sử dụng Dim cho biến.
Đây là lỗi điển hình thứ 2. Khi mã chạy sẽ thay đổi phông chữ ô A1 thành màu xanh lam nhưng khi chạy không có gì xảy ra.
Lỗi rgblue phải là rgbBlue. Nếu bạn thêm Option Explicit vào mô-đun, lỗi variable not defined sẽ xuất hiện. Điều này làm cho việc giải quyết vấn đề dễ dàng hơn nhiều.
VBA sử dụng các kiểu kiến tương tự như trong Excel.
Tuy nhiên các biến chính được sử dụng :
Type | Storage | Range | Mô tả |
Boolean | 2 bytes | True or False | Biến này có thể là True hoặc False. |
Long | 4 bytes | -2,147,483,648 to 2,147,483,647 | Long là viết tắt của Long Integer. Sử dụng kiểu này thay vì kiểu Integer *. |
Currency | 8 bytes | -1.79769313486231E308 to-4.94065645841247E-324 for negative values; 4.94065645841247E-324 to 1.79769313486232E308 for positive values | Tương tự như Double nhưng chỉ có 4 chữ số thập phân |
Double | 8 bytes | -922,337,203,685,477.5808 to 922,337,203,685,477.5807 | |
Date | 8 bytes | January 1, 100 to December 31, 9999 | |
String | varies | 0 to approximately 2 billion | Giữ nguyên văn bản |
*Ban đầu, chúng tôi sẽ sử dụng kiểu Long thay vì Integrate (số nguyên) vì biến này là 16-bit và do đó phạm vi từ -32,768 đến 32,767, khá nhỏ đối với nhiều trường hợp.
Tuy nhiên, trên hệ thống 32 bit (hoặc cao hơn), Integer được tự động chuyển đổi thành Long. Vì Windows đã có 32 bit kể từ Windows 9 \NT nên không có ích gì khi sử dụng Integer.
Tóm lại, luôn sử dụng Long cho kiểu số nguyên trong VBA.
Khi chúng ta tạo một chuỗi bình thường trong VBA thì chúng ta có thể thêm văn bản và VBA sẽ tự động thay đổi kích thước chuỗi:
Tuy nhiên chuỗi cố định là chuỗi không bao giờ được thay đổi kích thước. Chuỗi này sẽ luôn có cùng kích thước bất kể bạn gán cho nó là gì. Ví dụ:
Khi chúng tôi khai báo một biến là một variant, VBA sẽ quyết định loại biến trong thời gian chạy.
Chúng tôi khai báo các biến thể như sau:
Có vẻ đây là điều lý tưởng:
Tuy nhiên, việc sử dụng variant có thể gây ra một số vấn đề như sau:
Lỗi run time
Ví dụ: nếu có một bảng điểm của học sinh và bô tình dấu bằng văn bản thay thế bằng một dữ liệu không phù hợp Nếu sử dụng variant thì sẽ không xảy ra lỗi:
Tuy nhiên nếu dùng biến Long thì VBA sẽ cảnh báo lỗi “Type Mismatch” nếu dữ liệu là văn bản. Ví dụ:
Sử dụng trình biên dịch để kiểm tra lỗi rất hiệu quả. Nó sẽ kiểm tra tất cả các mã để tìm các vấn đề trước khi chạy. Sử dụng trình biên dịch bằng cách chọn Debug-> Compile VBAProject từ menu.
Trong đoạn mã sau, có một lỗi. Hàm Square được dự đoán sẽ là biến long integer nhưng chúng ta đang truyền một chuỗi (ví dụ biến name ):
Nếu chúng tôi sử dụng Debug–>Biên dịch trên mã này, VBA sẽ hiển thị cho chúng tôi lỗi:
Có thể sửa lỗi này ngay lập tức, tuy nhiên nếu khai báo tham số là Value là một variant thì Debug.Compile sẽ không coi đây là một lỗi. Lỗi vẫn còn đó nhưng nó không bị phát hiện.
Truy cập Intellisense
Intellisense là một tính năng tuyệt vời của VBA, cung cấp các tùy chọn có sẵn dựa trên kiểu biến đã tạo.
Giả sử bạn khai báo một biến worksheet bằng cách sử dụng Dim :
Khi sử dụng biến wk có dấu thập phân, VBA sẽ tự động hiển thị các tùy chọn có sẵn cho biến.
Nếu bạn sử dụng Variant làm biến thì Intellisense sẽ không khả dụng vì VBA sẽ xác định loại biến cho đến thời gian chạy.
Kích thước của một variant là 16 byte. Nếu biến là Long thì nó sẽ chỉ chiếm 4 byte. Tuy nhiên, không giống như những năm 1990, giờ đây có những máy tính có rất nhiều bộ nhớ và sẽ hoạt động hiệu quả kể cả khi bạn đang sử dụng một lượng lớn các biến.
Có 3 loại đối tượng:
Lưu ý: Đối tượng Bộ sưu tập VBA được sử dụng theo cách tương tự như cách sử dụng đối tượng Mô-đun lớp.
Các đối tượng Excel như workbook, worksheet, range, v.v. không sử dụng New vì chúng được tạo tự động bởi Excel.
Khi một workbook được tạo hoặc mở thì Excel sẽ tự động tạo đối tượng được liên kết.
Ví dụ, trong đoạn mã dưới đây, chúng ta mở một workbook. VBA sẽ tạo đối tượng và hàm Open sẽ trả về một workbook mà chúng ta có thể lưu trữ trong một biến:
Nếu chúng ta tạo một trang tính mới, điều tương tự cũng xảy ra. VBA sẽ tự động tạo nó và cung cấp quyền truy cập sử dụng cho đối tượng.
Chúng tôi không cần sử dụng New keyword cho các đối tượng Excel này.
Chúng ta chỉ gán biến cho hàm tạo một đối tượng mới hoặc cho phép chúng ta truy cập vào một đối tượng hiện có.
Dưới đây là một số ví dụ về việc gán các biến workbook, worksheet và Range:
Trong VBA, chúng ta sử dụng Mô-đun lớp để tạo các đối tượng tùy chỉnh của riêng mình. Nếu chúng ta đang tạo một đối tượng mới thì chúng ta cần sử dụng từ khóa New .
Chúng ta có thể thực hiện điều này trong câu lệnh Dim hoặc trong câu lệnh Set .
Đoạn mã sau tạo một đối tượng bằng cách sử dụng từ khóa New trong câu lệnh Dim:
Sử dụng New trong câu lệnh Dim có nghĩa là một đối tượng sẽ được tạo mỗi khi mã chạy.
Sử dụng Set cho phép chúng ta linh hoạt hơn, có thể tạo nhiều đối tượng từ một biến. Cũng có thể tạo đối tượng dựa trên một điều kiện.
Đoạn mã sau đây cho thấy cách chúng tôi tạo một đối tượng Mô-đun lớp bằng cách sử dụng Set.
Ví dụ về việc sử dụng Set. Trong đoạn mã dưới đây, chúng ta muốn đọc qua một loạt dữ liệu. Chúng ta tạo một đối tượng nếu giá trị lớn hơn 50.
Sử dụng Set để tạo đối tượng Class1. Điều này là do số lượng đối tượng chúng ta cần phụ thuộc vào số lượng giá trị trên 50.
Đây là ví dụ đơn giản, tuy nhiên trong thực tế có thể điền dữ liệu vào đối tượng Module lớp và thêm vào các cấu trúc dữ liệu bộ sưu tập hay từ điển. Ví dụ:
Một điều thực sự hữu ích mà chúng ta có thể làm với VBA là truy cập các thư viện bên ngoài ví dụ như thư viện Access, Outlook và Word. Chúng ta có thể sử dụng thư viện với nhiều loại khác nhau của cấu trúc dữ liệu như từ điển , các ArrayList , Stack và Queue.
Có các thư viện để truy cập một trang web (Thư viện đối tượng HTML của Microsoft), sử dụng Biểu thức chính quy (Microsoft VBScript Regular Expressions) và nhiều tác vụ khác.
Chúng ta có thể tạo các đối tượng này theo hai cách:
Early Binding nghĩa là thêm một tệp tham chiếu. Khi tệp này được thêm vào, chúng ta có thể coi đối tượng như một đối tượng mô-đun lớp.
Chúng tôi thêm một tham chiếu bằng Tools->Reference và sau đó chúng ta kiểm tra tệp thích hợp trong danh sách.
Ví dụ: để sử dụng Từ điển, chúng tôi kiểm tra “Microsoft Scripting Runtime”:
Khi chúng tôi đã thêm tham chiếu, chúng tôi có thể sử dụng Từ điển như một đối tượng mô-đun lớp.
Ưu điểm của early binding là chúng ta có quyền truy cập vào Intellisense, nhược điểm là có thể gây ra những vấn đề lộn xộn trên máy.
Nên sử dụng early binding để viết mã và sử dụng late binding để phân phối mã cho người dùng khác.
Late binding có nghĩa là tạo đối tượng trong thời gian chay. Chúng ta sẽ khai báo biến dưới dạng “Objective” sau đó sử dụng CreateObject để tạo đối tượng:
Có hai loại mảng như sau:
Mảng dynamic linh hoạt hơn nhiều. Chúng ta có thể thiết lập size trong khi mã đang chạy.
Chúng ta sẽ khai báo mảng dynamic bằng cách sử dụng câu lệnh Dim và chúng ta thiết lập size (kích thước) bằng cách sử dụng ReDim.
Sự khác biệt lớn giữa Dim và ReDim là chúng ta có thể sử dụng biến trong câu lệnh ReDim. Trong câu lệnh Dim, kích thước phải là một giá trị không đổi.
Chúng ta thực sự có thể sử dụng Redim Statement mà không cần sử dụng Dim trước.
Trong ví dụ đầu tiên, bạn có thể thấy rằng chúng ta sử dụng Dim:
Trong ví dụ thứ hai, chúng ta sử dụng Redim:
Bảng dưới đây cho thấy các lỗi mà bạn có thể gặp phải khi sử dụng Dim.
Lỗi | Kiểu | Nguyên nhân |
Array already dimensioned | Biên dịch | Sử dụng Redim trên một mảng static |
Expected: identifier | Cú pháp | Sử dụng một từ danh từ riêng làm tên biến |
Expected: New of type name | Cú pháp | Câu lệnh Dim thiếu loại tên. |
Object variable or With block variable not set | Run time | New không được sử dụng để tạo đối tượng |
Object variable or With block variable not set | Run time | Set không được sử dụng để gán một biến đối tượng. |
User-defined type not defined | Biên dịch | Loại không được nhận dạng. Có thể xảy ra nếu tệp tham chiếu không được thêm trong Công cụ-> Tham chiếu hoặc tên Mô-đun lớp bị sai chính tả. |
Statement invalid outside Type block | Biên dịch | Thiếu tên biến trong câu lệnh Dim |
Variable not defined | Biên dịch | Biến được sử dụng trước dòng Dim. |
Khi chúng ta sử dụng Dim trong một Sub hoặc Function, nó được coi là cục bộ. Các biến toàn cục được khai báo bên ngoài các sub
Trong đoạn mã dưới đây, chúng tôi đã khai báo count là một biến toàn cục:
Điều gì xảy ra nếu chúng ta có một biến toàn cục và một biến cục bộ có cùng tên?
Điều này không gây ra lỗi. VBA ưu tiên khai báo cục bộ.
Tình huống này sẽ dẫn đến rất nhiều phức tạp vì khó theo dõi count (số đếm )nào đang được sử dụng.
Nói chung nên tránh các biến toàn cục vì sẽ làm cho mã khó đọc và giá trị có thể thay đổi ở bất kỳ đâu trong mã.
Nếu sử dụng Private với một biến, một hàm hoặc một sub và có sẵn trong toàn bọ module như mã dưới đây:
Trong VBA, quy ước là sử dụng Private cho các biến toàn cục và Dim cho local:
Có 2 kiểu khai báo khác trong VBA được gọi là Public và Global.
Sau đây là tóm tắt của cả 4 loại:
Câu lệnh Dim VBA đã được hướng dẫn đầy đủ trong bài viết của Học Excel Online. Có thể tất cả những kiến thức về VBA Excel mà bạn đang tìm kiếm đều nằm trong chuỗi bài viết của chúng tôi. Truy cập VBA Excel để cùng học tập và vận dụng kiến thức miễn phí nhé!