I. Sử dụng chú thích trong các đoạn mã VBA
Các bạn có bao giờ phải viết lại các hàm hay thủ tục mà bạn đã viết cách đây lâu rồi không? Chắc chắn các bạn sẽ có đơi khi phải làm điều này. Và các bạn sẽ gặp hơi rắc rối nếu trong các đoạn code của các bạn khơng hề có một lời ghi chú nào! Tôi chắc chắn là thế.
Nhằm làm cho các câu lệnh được rõ ràng hơn, dễ sửa chữa hay nhằm giúp cho người sử dụng chúng dễ dàng sử dụng chúng ta có thể dùng chú thích (comments) trong các đoạn code của mình. Các bạn bắt đầu các đoạn code của mình bằng ký tự
‘.
Ví dụ:
Sub ViduveComment() ‘Thủ tục này chẳng làm gì cả
x = 0 ‘Gán cho biến x giá trị bằng 0 Msgbox x ‘Hiện gía trị của biến x End Sub
Các bạn chú ý, trong cửa sổ VBE, thanh cơng cụ Edit có các nút lệnh giúp cho các bạn sửa chửa các đoạn code của mình dễ đọc hơn.
_Dời một đọan mã về phía trái. _Dời một đoạn mã về phía phải.
_Đánh dấu cho một đoạn trở thành ghi chú. _Tháo bỏ ghi chú cho một đoạn. Các bạn có thể dùng ghi chú cho những trường hợp sau:
Mô tả ngắn gọn (dĩ nhiên bạn có thể mơ tả dài !) về mục đích của thủ tục hay hàm.
Sử dụng ghi chú mỗi lần bạn có thay đổi trong thủ tục hay hàm.
Mô tả biến bạn sử dụng.
Ghi lại các quá trình phát triển của tác giả về thủ tục, hàm. Ví dụ như: ngày viết, ngày sửa, người tham gia góp ý, các cộng tác viên,...vv.
II. Sử dụng biến, hằng, và kiểu dữ liệu:
Mục đích chính của VBA là thao tác với dữ liệu (data). VBA lưu các kiểu dữ liệu trong bộ nhớ của máy tính.
Biến, đơn giản chỉ là tên được lưu trong bộ nhớ máy tính. Chúng ta có thể phải dùng nhiều biến, chính vì vậy khi đặt tên chúng ta cố gắng đặt tên cho biến một cách ngắn gọn và dể hiểu.
a. Nguyên tắc đặt tên cho biến:
Bạn có thể dùng chữ, số, hay các ký tự phân cách nhưng ký tự
đầu tiên phải là chữ.
Bạn không được dùng bất kỳ khoảng trắng nào trong tên của thủ
tục hay hàm.
VBA không phân biệt ký tự thường hay hoa.
Bạn không được dùng các ký tự sau trong việc đặt tên: #, $, %, &, @, ^, *, !.
Nếu bạn viết một hàm dùng trong cơng thức, bạn phải chắc chắn
rằng nó khơng giống như một địa chỉ của một ơ. Ví dụ như: AC12 Tên không được dài hơn 255 ký tự (Dĩ nhiên có ai mà lại đặt tên tới 250 ký tự!).
b. Phạm vi và khai báo biến
Nếu bạn không khai báo biến trong thủ tục (routine) VBA, VBA sẽ sử dụng kiểu mặc định là variant. Dữ liệu lưu trong biến kiểu variant, nó giống như chameleon (con tắc kè!). Nó sẽ thay đổi kiểu tuỳ thuộc bạn làm việc với đối tượng nào. Một số bạn cho rằng, “cũng được thôi, khỏi cần phải quan tâm đến việc khai báo biến”. Vâng, như trên tôi đã đề cập bạn sẽ phải xem xét lại nhận xét của mình nếu bạn muốn mình làm việc theo kiểu “chuyên nghiệp”. Với nhiều biến trong chương trình, nó sẽ làm cho bộ nhớ bị sử dụng tối đa và làm ảnh hưởng đến toàn bộ các hoạt động liên quan của máy tính bạn.
Nhằm bắt buộc các chương trình của bạn phải khai báo biến, bạn đưa phát biểu sau vào đầu VBA module của bạn (tôi khuyên bạn nên làm điều này). Bạn có thể bật chức năng Require Variable Definition bằng cách vào VBE chọn
Tools/Options trong Tab Editor. Option Explicit
Khi có phát biểu này bạn sẽ không thể nào thực thi đoạn code của bạn nếu bạn chưa hoàn thành việc khai báo biến.
Khi bạn khai báo biến, bạn phải hiểu được biến của mình sẽ phải sử dụng trong phạm vi nào? Ví dụ, tơi khai báo biến chỉ sử dụng trong thủ tục (procedure) mà thôi. Hay trong Module, hay trong tất cả các modules?
Phạm vi Cách khai báo biến
Chỉ dùng trong thủ tục Các bạn dùng phát biểu Dim, Static cho mục
đích này.
Chỉ dùng trong Module Các bạn dùng phát biểu Dim vào trước thủ tục
hay hàm đầu tiên trong module. Dùng cho tất cả các thủ tục
trong tất cả các modules
Các bạn dùng phát biểu Public trước thủ tục hay hàm đầu tiên trong module.
Ví dụ:
Sub ThuKhaiBao() Dim ix As Integer Dim lHang As Long Dim dteData As Date ‘ Các đoạn mã trong thủ tục End Sub
Các bạn có thể viết ngắn lại như sau: Sub ThuKhaiBao()
Dim ix As Integer, lHang As Long, dteDate As Date ‘ Các đoạn mã trong thủ tục
End Sub
Các bạn chú ý nếu các bạn khai báo như sau: Dim i, j, k As Integer
Thì chương trình chỉ hiểu là biến k là kiểu Integer cịn hai biến còn lại là kiểu Variant.
Các bạn hãy xem lại ví dụ ở trên trong phần ví dụ về các thao tác với Combo Box (*). Có một số trường hợp các bạn cần phải sử dụng lại giá trị các biến trong một thủ tục khác (static)
2. Làm việc với các hằng số (Constant)
Giá trị của biến có thể thay đổi khi bạn thực hiện đọan code của mình. Trong một số trường hợp bạn cần dùng đến các giá trị khơng bao giờ thay đổi. Ví dụ như bạn cần dùng đến hằng số pi = 3.14 chẳng hạn. Đó là hằng số.
Bạn khai báo hằng số như sau: Const NumQuarter As Integer = 4 Const Rate =.725, Period = 12
Const ModName As String = “Budget Macro”
Public Const AppName As String = “Budget Application”
Tương tự như biến hằng số cũng có phạm vi sử dụng của nó. Bạn có thể áp dụng quy tắc giống như phạm vi sử dụng của biến.
Như phần trên đã trình bày, bạn khơng thể nào thay đổi giá trị của hằng. Nếu bạn cố thay đổi bạn sẽ nhận được thông báo lỗi.
Sub TestConst() Const Pi=3.14 ‘Cố gán lại giá trị Pi=4
End Sub
Trong Excel có rất nhiều hằng số đã được định nghĩa trước. Ví dụ như khi bạn thiết lập chế độ tính tốn Manual thì bạn có hằng số xlCalculationManual.
Application.Calculation = xlCalculationManual
Thực sự hằng xlCalculationManual có giá trị là -4135. Để biết giá trị của hằng bạn có thể dùng phát biểu sau:
Msgbox xlCalculationManual
3. Các kiểu dữ liệu
Đối với một chương trình nhỏ thì đơi khi các bạn không quan tâm đến việc khai báo biến. Các bạn sẽ rất khó phát hiện việc khai báo biến khơng đúng sẽ ảnh hưởng đến tốc độ thực thi của chương trình bạn viết như thế nào. Nhưng đối với một chương trình lớn, thực thi nhiều tác vụ, có thể bạn sẽ “phát hiện” ra. Dù sao đi nữa tôi khuyên các bạn nên tập khai báo tất cả các biến nếu có thể.
Kiểu dữ liệu (Data type)
Số Byte sử dụng (Bytes used)
Khoảng của giá trị (Range of Values)
Byte 1 0 đến 255
Boolean 2 True hay False
Integer 2 -32,768 đến 32,767 Long 4 -2,147,483,648 đến 2,147,483,647 Single 4 -3.402823E38 đến 1.401298E45 Double (negative) 8 - 1.79769313486232E308 đến -4.94065645841247E-324
Double (positive) 8 4.94065645841247E-
324 đến 1.79769313486232E308 Currency 8 - 922,337,203,685,477.5808 đến 922,337,203,685,477.5807 Date 8 1/1/100 đến 31/12/9999
String 1 cho mỗi ký tự (1
per char)
Tuỳ theo (varies, khoảng từ 1 đến 65,400)
Object 4 Cho bất cứ đối tượng được định nghĩa nào (any define object)
Variant Tuỳ theo (varies;
16 bytes with number; 22 bytes + string length with characters)
Cho bất kỳ kiểu dữ liệu nào (any data type)
Kiểu dữ liệu người dùng định nghĩa (User defined)
Tuỳ theo (varies) Tuỳ theo (varies)
Thông thường nên chọn kiểu dữ liệu nhỏ nhất (byte). Các bạn hãy thử tính xem nếu tơi sử dụng biến đại diện cho số cột trong Excel thì tơi nên dùng biến kiểu gì? Tương tự đối với biến đại diện cho số hàng trong Excel.
a. Làm việc với chuổi
Bạn có thể làm việc với hai kiểu của chuổi trong VBA.
Fixed-length strings: được khai báo với số ký tự. Số ký tự lớn
nhất là 65,526. Bạn khai báo đối với kiểu này như sau: Dim sChuoi As String*20
Variable-length strings: về mặt lý thuyết biến này có thể chứa
khoảng hai triệu ký tự (can hold as many as two billion characters). Bạn khai báo kiểu này như sau: Dim sChuoi As String
Mỗi ký tự chiếm khoảng một byte, biến chuổi không xác định chiều dài chuổi chiếm khoảng 16 bytes. Vì vậy nếu được bạn nên dùng biến chuổi có chiều dài cố định.
b.Làm việc với kiểu ngày
Một kiểu dữ liệu khác mà bạn cũng thường sử dụng là kiểu ngày. Bạn có thể sử dụng biến chuổi để lưu trữ ngày nhưng bạn sẽ không thể thực hiện các tính tốn về ngày. Ví dụ như tính tốn số ngày giữa hai ngày chẳng hạn. Kiểu ngày sẽ chiếm dụng 8 bytes và có thể có giá trị từ ngày 1/1/100 đến ngày 31/12/9999 ! Chắc có lẻ đủ dùng!
Sau đây là một số ví dụ về khai báo biến, hằng kiểu ngày. Dim Today As Date
Dim StartTime As Date
Const FirstDay As Date = #1/1/2005# Const Noon = #12:00:00#
Trong VBA bạn đặt ngày và thời gian trong dấu # như trong ví dụ trên. Chú ý rằng biến ngày sẽ được thể hiện theo việc thiết lập của hệ thống máy tính bạn. Bạn có thể thay đổi bằng cách vào Control Panel/Region and Language để thay đổi cách thiết lập.
Chắc chắn rằng các bạn đã quá quen với việc này. Sau đây tôi chỉ xin giới thiệu một số ví dụ: x = 1 x = x +1 x = (y*2)/(z*2) HouseCost = 375000 FileOpen = True Range(“TheYear”).Value = 2005
Các toán tử được sử dụng trong VBA
Phép toán Ký tự của toán tử
Cộng +
Trừ -
Nhân *
Chia /
Luỷ thừa ^
Nối chuổi &
Chia lấy số nguyên \
Chia lấy số dư Mod
Ngồi các phép tốn thơng thường trên cịn có các phép tốn logic như Not, And, Or, XoR, Eqv, Imp . Bạn có thể tìm hiểu trong phần help của Excel.
4. Làm việc với Mảng (Arrays)
Hầu hết các ngơn ngữ lập trình đều hổ trợ mảng. Mảng là một nhóm các biến có chung tên. Bạn tham chiếu đến chúng bằng tên mảng và số thứ tự (index number). Ví dụ bạn có thể khai báo một mảng gồm 12 phần tử để lưu trữ tên tháng trong một năm.
Dim TenThang(1 to 12) As String
Và khi tham chiếu đến chúng bạn có thể tham chiếu như sau TenThang(1) ‘Là tháng giêng
TenThang(2) ‘Là tháng hai
a.Khai báo mảng
Trước khi sử dụng một mảng, bạn phải khai báo chúng. Bạn khai báo mảng với Dim hay Public giống như bạn khai báo với biến thông thường vậy. Tuy nhiên bạn phải xác định số phần tử của mảng. Ví dụ bạn khai báo mảng có 100 phần tử kiểu Integer
Dim MyArray(1 to 100) As Integer
Bạn có thể khai báo chỉ số phần tử lớn nhất (ví dụ trong ví dụ trên là 100). Chú ý rằng mặc định số phần tử sẽ bắt đầu bằng 0. Vì vậy nếu bạn khai báo
Dim MyArray(100) As Integer
Nếu muốn tất cả các mảng bắt đầu bằng phần tử thứ nhất (1) bạn phải khai báo Option Base 1
Vào phần trên cùng của module.
b.Mảng nhiều chiều
Trong ví dụ trên, mảng chỉ là một chiều. Trong VBA mảng có thể lên đến 60 chiều.
Ví dụ khai báo mảng 2 chiều như sau: Dim MyArray (1 to 10, 1 to 10) As Integer Ví dụ về gán giá trị cho các phần tử trong mảng.
MyArray(3,4)=125 ‘Phần tử hàng thứ 3 cột thứ 4 bằng 125
c.Mảng động (Dynamic Arrrays)
Bạn cũng có thể tạo ra mảng động. Khi khai báo mảng động bạn không khai báo số phần tử.
Dim MyArray() As Integer
Trước khi bạn muốn sử dụng mảng này bạn phải khai báo số phần tử của chúng như khai báo dưới đây:
ReDim MyArray(NumElements)
Bạn chú ý rằng, khi bạn khai báo mảng như trên thì bạn sẽ xố tất cả các giá trị lưu trong mảng này. Đôi khi đây là điều bạn khơng muốn.
Bạn hãy xem ví dụ sau: Dim MyArray As Integer Dim i As Integer
ReDim MyArray(10) ‘Chú ý là bạn phải có khai báo Option Base 1 For i=1 to 10
MyArray(i) = i Next i
ReDim MyArray(11) ‘Điều này sẽ xoá tất cả các giá trị bạn lưu trong mảng trước đó
Để tránh điều này xảy ra ta phải dùng khai báo ReDim Preserve MyArray(11)
5. Sử dụng With - End With
With - End With dùng để thực hiện nhiều thao tác đối với đối tượng đơn lẻ. Phương pháp này được sử dụng đối với đối tượng nào có nhiều thuộc tính. Để hiểu được cách sử dụng With - End With trong cơng việc, ví dụ dưới đây thể hiện quy trình thực hiện. Chương trình con này sẽ làm thay đổi 5 thuộc tính của vùng định dạng.
Selection.Font.Name = “Times New Roman” Selection.Font.FontStyle = “Bold Italic” Selection.Font.Size = 12
Selection.Font.Underline = xlUnderlineStyleSingle Selection.Font.ColorIndex = 5
End Sub
Trong thủ tục trên, bạn thấy đoạn Selection.Font. được lặp lại nhiều lần và bạn có thể viết lại khi sử dụng With - End With. Dưới đây là thủ tục đã sửa lại:
Sub ChangeFont2() With Selection.Font
.Name = “Times New Roman” .FontStyle = “Bold Italic” .Size = 12
.Underline = xlUnderlineStyleSingle .ColorIndex = 5
End With End Sub
Bạn sẽ thấy khi sử dụng With- End With, việc quản lý các đối tượng và thuộc tính của chúng dễ dàng hơn.