Các yếu tố (elements) chính trong vba

Một phần của tài liệu Lập trình visualbasic và macro trong excel (Trang 30 - 38)

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.

Một phần của tài liệu Lập trình visualbasic và macro trong excel (Trang 30 - 38)

Tải bản đầy đủ (DOC)

(78 trang)
w