Lời nói đầu
Tự động hóa trong tất cả lĩnh vực hiện đang được xã hội quan tâm đặc biệt bởi nhờ nó
năng suất lao động được nâng cao, chất lượng sản phẩm ổn định và tốt hơn, nhiều ý
tưởng mới có cơ hội trở thành hiện thực. Tự động hóa công tác thiết kế công trình giao
thông cũng không nằm ngoài quy luật chung đó, hiện nay, hầu hết các công ty trong
lĩnh vực tư vấn thiết kế công trình giao thông đều rất chú trọng thực hiện tự động hóa
công tác thiết kế trong công ty của mình. Điều này được thể hiện rõ nét trong việc đầu
tư của các công ty (mua sắm máy tính, phần mềm và đào tạo nhân lực) cũng như triển
khai tự động hóa thiết kế rất nhiều công trình trong thực tế.
Với sự đa dạng của mình, các bài toán trong công tác thiết kế luôn đòi hỏi sự linh hoạt
của công tác tự động hóa. Chính vì vậy, để phần nào đáp ứng được yêu cầu cấp bách
từ thực tế sản xuất, nội dung cuốn giáo trình này đề cập đến tất cả các vấn đề cơ bản
nhất của việc thực hiện tự động hóa thiết kế công trình giao thông cũng như phương
pháp để nâng cao mức độ tự động hóa cho phù hợp với từng yêu cầu chuyên biệt xuất
hiện trong quá trình thiết kế.
Nội dung của giáo trình này là sự đúc kết kinh nghiệm giảng dạy môn Tự động hóa
thiết kế cầu đường cho sinh viên ngành xây dựng công trình giao thông và quá trình
tham gia thực hiện tự động hóa công tác thiết kế ngoài sản xuất của các tác giả cũng
như cập nhật mới nhất những công nghệ chủ chốt phục vụ cho việc tự động hóa. Hơn
nữa, nội dung chính tập trung vào những thành phần cốt lõi phục vụ cho mục đích tự
động hóa thiết kế cầu đường, cùng với những nội dung mang tính gợi mở và định
hướng cho từng chuyên ngành, khiến cho cuốn giáo trình này hoàn toàn phù hợp với
định hướng đào tạo theo tín chỉ của Nhà trường.
Chúng tôi xin chân thành cảm ơn sự đóng góp ý kiến của các đồng nghiệp trong quá
trình hoàn thiện cuốn giáo trình này.
Với tốc độ phát triển rất nhanh của công nghệ như hiện nay thì chắc chắn rằng trong
thời gian tới, nhiều vấn đề liên quan đến việc thực hiện tự động hóa thiết kế sẽ phải
thay đổi, và chúng tôi hy vọng rằng, cùng với các ý kiến đóng góp của bạn đọc và sự
cập nhật kiến thức của bản thân, thì lần xuất bản sau của cuốn sách này sẽ hoàn thiện
hơn nữa, sẽ đáp ứng tốt hơn nữa yêu cầu của bạn đọc.
Hà Nội, ngày 01 tháng 06 năm 2007
Các tác giả.
1
PHẦN I: MỞ ĐẦU .................................................................................. 1
1. Tổng quan về thiết kế và tự động hóa thiết kế công trình giao thông ................................. 1
2. Đôi nét về các phần mềm dùng cho thiết kế công trình giao thông ..................................... 3
3. Lựa chọn phần mềm dùng cho thiết kế công trình giao thông ............................................. 4
4. Chuyên biệt hóa phần mềm ....................................................................................................... 6
5. Kết chương ................................................................................................................................. 11
PHẦN II: LẬP TRÌNH TRÊN ỨNG DỤNG NỀN ...................................... 12
CHƯƠNG I: KHÁI NIỆM............................................................................................. 12
CHƯƠNG II: TỔNG QUAN VỀ VBA .......................................................................... 19
1. Đặc điểm của VBA..................................................................................................................... 19
2. Trình tự xây dựng một dự án bằng VBA ............................................................................... 19
3. Cấu trúc của một dự án VBA ................................................................................................... 20
4. Môi trường phát triển tích hợp VBA IDE............................................................................... 21
5. Ví dụ đầu tiên với VBA............................................................................................................. 23
CHƯƠNG III: CƠ BẢN VỀ NGÔN NGỮ LẬP TRÌNH VISUAL BASIC..................... 25
1. Những qui định về cú pháp ..................................................................................................... 25
2. Các trợ giúp về cú pháp trong quá trình viết mã lệnh ......................................................... 25
3. Tính năng gợi nhớ và tự hoàn thiện mã lệnh ........................................................................ 26
4. Từ khoá trong VB ...................................................................................................................... 27
5. Các kiểu dữ liệu cơ bản............................................................................................................. 28
5.1. Kiểu logic (boolean) ...........................................................................................................29
5.2. Kiểu số nguyên ...................................................................................................................29
5.3. Kiểu số thực........................................................................................................................29
5.4. Kiểu mảng (array) ..............................................................................................................29
5.5. Kiểu chuỗi (String) .............................................................................................................31
5.6. Kiểu thời gian (Date) ..........................................................................................................32
5.7. Kiểu Variant .......................................................................................................................32
5.8. Kiểu tự định nghĩa (user-defined type)...............................................................................33
5.9. Kiểu lớp (Class) ..................................................................................................................34
6. Khai báo biến trong VB ............................................................................................................. 35
6.1. Khai báo hằng số ................................................................................................................38
6.2. Khai báo biến......................................................................................................................38
6.3. Khai báo kiểu tự định nghĩa ...............................................................................................39
6.4. Khai báo mảng tĩnh ............................................................................................................39
6.5. Khai báo mảng động...........................................................................................................39
6.6. Khai báo, tạo và làm việc với biến đối tượng .....................................................................40
7. Các toán tử và hàm thông dụng .............................................................................................. 40
7.1. Các toán tử..........................................................................................................................40
7.2. Các hàm toán học ...............................................................................................................41
7.3. Các hàm chuyển đổi dữ liệu ...............................................................................................42
7.4. Các hàm xử lý chuỗi ...........................................................................................................43
8. Các cấu trúc điều khiển ............................................................................................................ 44
8.1. Cấu trúc điều kiện...............................................................................................................44
8.2. Cấu trúc lựa chọn ...............................................................................................................46
8.3. Vòng lặp xác định...............................................................................................................47
i
8.3.1. Vòng lặp theo biến đếm ............................................................................................. 47
8.3.2. Lặp trong một tập hợp ................................................................................................ 49
8.4. Vòng lặp không xác định ................................................................................................... 50
9. Chương trình con .......................................................................................................................51
9.1. Hàm (Function) .................................................................................................................. 52
9.2. Thủ tục (Sub) ..................................................................................................................... 52
9.3. Truyền tham số cho chương trình con................................................................................ 52
9.3.1. Truyền tham số theo tham chiếu ................................................................................ 54
9.3.2. Truyền tham số theo tham trị ..................................................................................... 54
9.3.3. Tham số tuỳ chọn. ...................................................................................................... 54
9.3.4. Danh sách tham số với số lượng tham số tuỳ ý.......................................................... 55
9.3.5. Hàm có giá trị trả về là kiểu mảng. ............................................................................ 55
9.4. Biến trong chương trình con .............................................................................................. 56
9.5. Cách thức gọi chương trình con. ........................................................................................ 58
9.6. Thoát khỏi chương trình con. ............................................................................................. 59
10. Tổ chức các chương trình con theo hệ thống các mô‐đun chuẩn ......................................59
11. Làm việc với UserForm và các thành phần điều khiển ......................................................61
11.1. Các vấn đề chung ............................................................................................................. 61
11.1.1. Tạo UserForm và các thành phần điều khiển trong VBA IDE ................................ 63
11.1.2. Các thuộc tính của UserForm và các thành phần điều khiển. .................................. 64
11.1.3. Các phương thức của UserForm và các thành phần điều khiển. .............................. 66
11.1.4. Các sự kiện trên giao diện. ....................................................................................... 67
11.1.5. Ví dụ......................................................................................................................... 68
11.2. Làm việc với UserForm ................................................................................................... 69
11.3. Các điều khiển thông dụng ............................................................................................... 70
12. Các hộp thoại thông dụng.......................................................................................................77
12.1. Hộp thông điệp (Message Box – MsgBox) ...................................................................... 77
12.2. Hộp nhập dữ liệu (Input Box – InputBox) ....................................................................... 78
12.3. Hộp thoại dựa trên điều khiển Common Dialog. ............................................................. 78
13. Lập trình xử lý tập tin ..............................................................................................................81
13.1. Các hình thức truy cập tập tin .......................................................................................... 81
13.2. Xử lý dữ liệu trong tập tin với các hàm I/O: .................................................................... 82
13.2.1. Mở tập tin: ................................................................................................................ 82
13.2.2. Đọc dữ liệu từ tập tin: .............................................................................................. 83
13.2.3. Ghi dữ liệu vào tập tin: ............................................................................................ 85
13.2.4. Đóng tập tin.............................................................................................................. 87
13.3. Xử lý dữ liệu trong tập tin theo mô hình FSO (File System Object) ............................... 87
13.3.1. Tạo tập tin mới ......................................................................................................... 89
13.3.2. Mở tập tin đã có để thao tác ..................................................................................... 89
14. Gỡ rối và bẫy lỗi trong VBAIDE ............................................................................................91
14.1. Phân loại lỗi trong lập trình.............................................................................................. 91
14.2. Gỡ rối trong lập trình ....................................................................................................... 91
14.2.1. Phát hiện lỗi lúc thực thi .......................................................................................... 91
14.2.2. Các phương pháp thực thi mã lệnh .......................................................................... 92
14.2.3. Cửa sổ trợ giúp gỡ rối .............................................................................................. 94
14.3. Bẫy lỗi trong VBAIDE..................................................................................................... 95
14.3.1. Câu lệnh On Error .................................................................................................... 95
14.3.2. Đối tượng Err ........................................................................................................... 97
14.3.3. Hàm Error ................................................................................................................ 98
CHƯƠNG IV: LẬP TRÌNH TRÊN MICROSOFT EXCEL ........................................ 100
1. Tổng quan về Microsoft Excel ................................................................................................ 100
1.1. Khả năng của Excel.......................................................................................................... 100
1.2. Giao diện của Excel ......................................................................................................... 100
1.3. Khả năng mở rộng của Excel ........................................................................................... 101
2. Macro ......................................................................................................................................... 101
ii
2.1. Macro là gì? ......................................................................................................................102
2.2. Tạo Macro ........................................................................................................................102
2.2.1. Tạo Macro theo kịch bản ..........................................................................................102
2.2.2. Tạo Macro sử dụng VBA .........................................................................................105
2.3. Quản lý Macro ..................................................................................................................105
2.4. Sử dụng Macro .................................................................................................................106
2.4.1. Thực thi Macro bằng phím tắt ..................................................................................107
2.4.2. Thực thi Macro thông qua trình quản lý Macro .......................................................107
2.4.3. Thực thi Macro trực tiếp từ VBAIDE ......................................................................107
2.5. Hiệu chỉnh Macro .............................................................................................................108
2.6. Vấn đề an toàn khi sử dụng Macro ...................................................................................108
3. Xây dựng hàm mới trong Excel ............................................................................................. 108
3.1. Khái niệm về hàm trong Excel .........................................................................................108
3.2. Tạo hàm mới bằng VBA ..................................................................................................109
3.2.1. Tại sao phải dùng hàm? ............................................................................................109
3.2.2. Cấu trúc hàm ............................................................................................................110
3.2.3. Tạo hàm mới ............................................................................................................110
3.3. Hàm trả về lỗi ...................................................................................................................112
4. Add‐in và Phân phối các ứng dụng mở rộng ...................................................................... 114
4.1. Khái niệm về Add-In ........................................................................................................115
4.2. Trình quản lý Add-In ........................................................................................................115
4.3. Tạo Add-In .......................................................................................................................116
4.4. Phân phối và Cài đặt Add-In ............................................................................................118
5. Hệ thống các đối tượng trong Excel...................................................................................... 118
5.1. Mô hình đối tượng trong Excel ........................................................................................118
5.2. Một số đối tượng cơ bản trong Excel ...............................................................................120
5.2.1. Đối tượng Application ..............................................................................................120
5.2.2. Đối tượng Workbook ...............................................................................................124
5.2.3. Đối tượng Window ...................................................................................................127
5.2.4. Đối tượng Worksheet ...............................................................................................129
5.2.5. Đối tượng Range ......................................................................................................132
5.2.6. Tập đối tượng Cells ..................................................................................................137
6. Sự kiện của các đối tượng trong Excel .................................................................................. 138
6.1. Tạo bộ xử lý sự kiện cho một sự kiện ..............................................................................139
6.2. Sự kiện trong Workbook ..................................................................................................140
6.3. Sự kiện trong Worksheet ..................................................................................................142
6.4. Sự kiện trong UserForm ...................................................................................................144
6.5. Sự kiện không gắn với đối tượng .....................................................................................145
7. Các thao tác cơ bản trong Excel ............................................................................................. 147
7.1. Điều khiển Excel ..............................................................................................................147
7.1.1. Thoát khỏi Excel ......................................................................................................147
7.1.2. Khoá tương tác người dùng ......................................................................................148
7.1.3. Thao tác với cửa sổ ..................................................................................................148
7.1.4. Khởi động Excel từ chương trình khác ....................................................................149
7.2. Làm việc với Workbook ...................................................................................................151
7.2.1. Tạo mới, mở, lưu và đóng workbook .......................................................................151
7.3. Làm việc với Worksheet ..................................................................................................152
7.3.1. Tạo mới, xoá và đổi tên worksheet ..........................................................................152
7.4. Làm việc với Range và Cells............................................................................................153
7.4.1. Duyệt qua từng ô trong vùng dữ liệu........................................................................153
7.4.2. Duyệt qua từng ô trong vùng dữ liệu theo hàng và cột ............................................153
7.4.3. Vùng có chứa dữ liệu – Thuộc tính UsedRange.......................................................154
7.5. Làm việc với biểu đồ ........................................................................................................155
7.5.1. Tạo mới biểu đồ .......................................................................................................155
7.5.2. Thêm một chuỗi số liệu vào biểu đồ đã có ...............................................................157
7.6. Sử dụng các hàm có sẵn trong Excel ................................................................................158
iii
8. Giao diện người dùng .............................................................................................................. 158
8.1. Điểu khiển nhúng trong Worksheet ................................................................................. 159
8.1.1. Điều khiển Spin Button ............................................................................................ 160
8.1.2. Điều khiển ComboBox ............................................................................................ 160
8.1.3. Điều khiển Command Button .................................................................................. 161
8.2. Các hộp thoại thông dụng ................................................................................................ 162
8.2.1. Hộp thoại InputBox của Excel – Hàm InputBox ..................................................... 162
8.2.2. Hộp thoại Open – Hàm GetOpenFilename .............................................................. 164
8.2.3. Hộp thoại Save As – Hàm GetSaveAsFilename ...................................................... 166
8.2.4. Hộp thoại chọn thư mục – Đối tượng FileDialog .................................................... 167
8.2.5. Các hộp thoại mặc định trong Excel – Tập đối tượng Dialogs ................................ 167
8.2.6. Thực thi mục trình đơn Excel từ VBA ..................................................................... 169
8.3. Hộp thoại tuỳ biến – UserForm ........................................................................................ 170
8.3.1. Tạo mới UserForm ................................................................................................... 170
8.3.2. Hiển thị UserForm ................................................................................................... 171
8.3.3. Các điều khiển trên UserForm ................................................................................. 172
8.4. Thao tác trên thanh trình đơn ........................................................................................... 173
8.4.1. Cấu trúc của hệ thống thanh trình đơn ..................................................................... 174
8.4.2. Tạo trình đơn tuỳ biến .............................................................................................. 175
8.4.3. Xoá trình đơn tuỳ biến ............................................................................................. 178
8.4.4. Gán phím tắt cho Menu Item ................................................................................... 179
CHƯƠNG V: LẬP TRÌNH TRÊN AUTOCAD .......................................................... 182
1. Tổng quan về AutoCAD ......................................................................................................... 182
1.1. Khả năng của AutoCAD .................................................................................................. 182
1.2. Giao diện của AutoCAD .................................................................................................. 183
1.3. Khả năng mở rộng của AutoCAD .................................................................................... 184
2. Quản lý dự án VBA trong AutoCAD .................................................................................... 185
2.1. Dự án VBA trong AutoCAD............................................................................................ 185
2.2. Trình quản lý dự án VBA................................................................................................. 186
2.2.1. Tạo mới, Mở và Lưu dự án VBA ............................................................................. 187
2.2.2. Nhúng và tách dự án VBA ....................................................................................... 188
2.3. Quản lý dự án VBA từ dòng lệnh .................................................................................... 189
3. Macro ......................................................................................................................................... 189
3.1. Khái niệm Macro trong AutoCAD ................................................................................... 189
3.2. Tạo mới và Hiệu chỉnh Macro ......................................................................................... 190
3.3. Thực thi Macro ................................................................................................................. 191
3.4. Định nghĩa lệnh mới bằng AutoLISP ............................................................................... 192
3.4.1. Tạo dự án mới .......................................................................................................... 192
3.4.2. Tạo và thử nghiệm Macro HelloWorld .................................................................... 193
3.4.3. Tạo lệnh mới bằng AutoLISP .................................................................................. 194
4. Hệ thống đối tượng trong AutoCAD .................................................................................... 194
4.1. Mô hình đối tượng trong AutoCAD ................................................................................. 194
4.2. Một số đối tượng chính trong AutoCAD ......................................................................... 196
4.2.1. Đối tượng Application ............................................................................................. 196
4.2.2. Đối tượng Document................................................................................................ 197
4.2.3. Tập đối tượng ........................................................................................................... 199
4.2.4. Đối tượng phi hình học ............................................................................................ 199
4.2.5. Đối tượng hình học .................................................................................................. 200
5. Các thao tác cơ bản trong AutoCAD ..................................................................................... 201
5.1. Điều khiển AutoCAD....................................................................................................... 201
5.1.1. Tạo mới, Mở, Lưu và Đóng bản vẽ.......................................................................... 201
5.1.2. Khởi động và thoát khỏi chương trình AutoCAD .................................................... 204
5.1.3. Sử dụng các lệnh sẵn có của AutoCAD ................................................................... 206
5.1.4. Thu phóng màn hình bản vẽ (zoom) ........................................................................ 206
5.1.5. Nhập dữ liệu người dùng từ dòng lệnh của AutoCAD ............................................ 208
iv
5.1.6. Thiết lập biến hệ thống .............................................................................................215
5.2. Tạo mới đối tượng hình học .............................................................................................218
5.2.1. Xác định nơi chứa đối tượng ....................................................................................218
5.2.2. Khai báo và tạo đối tượng hình học .........................................................................219
5.2.3. Tạo đối tượng Point ..................................................................................................220
5.2.4. Tạo đối tượng dạng đường thẳng .............................................................................221
5.2.5. Tạo đối tượng dạng đường cong ..............................................................................224
5.2.6. Tạo đối tượng văn bản..............................................................................................227
5.3. Làm việc với đối tượng SelectionSet ...............................................................................228
5.3.1. Khai báo và khởi tạo đối tượng SelectionSet ...........................................................229
5.3.2. Thêm đối tượng hình học vào một SelectionSet ......................................................230
5.3.3. Thao tác với các đối tượng trong SelectionSet .........................................................235
5.3.4. Định nghĩa bộ lọc đối tượng cho SelectionSet .........................................................236
5.3.5. Loại bỏ đối tượng hình học ra khỏi SelectionSet .....................................................238
5.4. Hiệu chỉnh đối tượng hình học .........................................................................................239
5.4.1. Hiệu chỉnh đối tượng sử dụng các phương thức ......................................................240
5.4.2. Hiệu chỉnh đối tượng sử dụng các thuộc tính ...........................................................247
5.4.3. Hiệu chỉnh đường đa tuyến ......................................................................................251
5.4.4. Hiệu chỉnh văn bản đơn............................................................................................253
5.5. Làm việc với lớp (Layer)..................................................................................................255
5.5.1. Tạo lớp mới ..............................................................................................................255
5.5.2. Truy xuất và thay đổi tên một lớp đã có ...................................................................256
5.5.3. Thiết lập lớp hiện hành .............................................................................................257
5.5.4. Thiết lập các chế độ hiển thị của lớp ........................................................................257
5.5.5. Xoá lớp .....................................................................................................................259
5.6. Thao tác với kiểu đường – Linetype.................................................................................259
5.6.1. Tải kiểu đường vào AutoCAD .................................................................................259
5.6.2. Truy xuất và đổi tên kiểu đường ..............................................................................260
5.6.3. Thiết lập kiểu đường hiện hành ................................................................................260
5.6.4. Xoá kiểu đường đã có...............................................................................................261
5.7. Thao tác với đường kích thước – Dimension ...................................................................261
5.7.1. Kiểu đường kích thước – DimensionStyle ...............................................................261
5.7.2. Tạo đường kích thước ..............................................................................................264
5.7.3. Định dạng đường kích thước ....................................................................................269
5.8. Thao tác với dữ liệu mở rộng – XData .............................................................................269
5.8.1. Gán dữ liệu mở rộng ................................................................................................270
5.8.2. Đọc dữ liệu mở rộng ................................................................................................271
6. Giao diện người dùng ............................................................................................................. 272
6.1. Thao tác với thanh trình đơn ............................................................................................272
6.1.1. Cấu trúc của hệ thống thanh trình đơn .....................................................................272
6.1.2. Tạo trình đơn ............................................................................................................273
6.1.3. Xoá thanh trình đơn ..................................................................................................275
PHẦN III: TÀI LIỆU THAM KHẢO ...................................................... 277
v
MỞ ĐẦU
PHẦN I: MỞ ĐẦU
1. Tổng quan về thiết kế và tự động hóa thiết kế công trình giao
thông
Công tác thiết kế luôn có một vị trí quan trọng từ khi lập dự án cho đến khi thi công, hoàn
thành và đưa công trình vào sử dụng. Từ trước đến nay, công tác khảo sát thiết kế được biết đến
như một quá trình gồm nhiều công đoạn khác nhau, mà mục đích cuối cùng là xác lập cấu tạo
của công trình, cách thức thi công chủ đạo để tạo ra công trình trên thực địa và phương pháp
khai thác công trình một cách hiệu quả nhất. Kết quả của công tác thiết kế được thể hiện dưới
dạng hồ sơ thiết kế, nghĩa là quá trình thiết kế nhắm đến việc tạo ra một bộ hồ sơ thiết kế, mà
trong đó nó mô tả một cách đầy đủ toàn bộ mục đích của quá trình thiết kế. Thông thường hồ
sơ thiết kế bao gồm những thành phần cơ bản như sau:
Ø Bản thuyết minh: nơi thể hiện những cơ sở cho công tác thiết kế, lập luận của người thiết
kế và giải thích những vẫn đề cơ bản của phương án thiết kế.
Ø Các loại bảng tính, bảng thống kê: nơi trình bày các kết quả tính toán trong quá trình thiết
kế, là cơ sở cho việc lập bản vẽ và xác định chi phí đầu tư cho công trình.
Ø Bản vẽ: nơi thể hiện chi tiết nhất cấu tạo của công trình cũng như phương pháp chủ đạo
để thi công công trình.
Ø Dự toán: nơi thể hiện cách thức xác định tổng mức đầu tư cho công trình.
Mức độ chi tiết của những thành phần trong hồ sơ thiết kế phụ thuộc vào yêu cầu trong từng
giai đoạn của quá trình đầu tư cho công trình. Ví dụ giai đoạn lập bản vẽ thi công đòi hỏi mức
độ chi tiết cao nhất.
Nếu xem xét kỹ hơn bên trong của hồ sơ thiết kế công trình giao thông thì ai cũng nhận thấy
rằng chúng có mối liên hệ chặt chẽ với nhau theo một quan hệ logic khá rõ ràng, ví dụ các kích
thước hình học trong bản vẽ sẽ phải phù hợp với kết quả tính toán được trình bày trong các
bảng tính. Điều này nói lên rằng, khi mô tả mối liên hệ trên thành một chuỗi các lệnh thì ta đã
có trong tay thành phần cơ bản nhất của tự động hóa thiết kế công trình giao thông. Vấn đề còn
lại là tìm kiếm giải pháp thích hợp để thực hiện tự động hóa.
Tự động hóa một công việc được hiểu là công việc đó được thực hiện tự động hoàn toàn hay
một phần nhờ có sự trợ giúp của các thiết bị. Ví dụ như quá trình chế tạo xe hơi được tự động
hóa nhờ hệ thống robot trong các dây truyền sản xuất. Trong lĩnh vực thiết kế công trình giao
thông, do sản phẩm của công tác này là hồ sơ thiết kế, cho nên thiết bị trợ giúp phù hợp là các
hệ thống có khả năng tạo văn bản, tính toán kết cấu, vẽ các đối tượng hình học, dựng mô
hình....
Hệ thống thông tin, bao gồm phần cứng (máy tính, máy in, máy quét...) và phần mềm (các
chương trình ứng dụng), đã và đang được triển khai rộng rãi trong khắp các công ty tư vấn thiết
kế công trình giao thông bởi chúng có những đặc điểm rất phù hợp cho việc lập hồ sơ thiết kế
công trình:
Ø Máy tính cùng với các phần mềm chạy trên chúng cho phép thực hiện nhiều công việc
khác nhau như: phân tích kết cấu, vẽ đối tượng hình học, tạo văn bản, dựng mô hình...
Ø Tốc độ tính toán nhanh, điều này cho phép đưa ra nhiều hơn một phương án thiết kế với
thời gian có thể chấp nhận được.
Ø Khả năng lưu trữ và tận dụng lại dữ liệu đạt hiệu quả rất cao, điều này cho phép người
thiết kế có thể tận dụng lại tối đa dữ liệu đã có từ trước. Ví dụ, với hệ thống các bản vẽ in
trên giấy, việc tận dụng lại đạt hiệu quả rất thấp, hầu như chỉ ở mức tham khảo thông tin,
1
GIÁO TRÌNH TỰ ĐỘNG HOÁ THIẾT KẾ CẦU ĐƯỜNG
trong khi đó, nếu như cũng các bản vẽ này được lưu trữ trong máy tính, ngoài việc cho
phép tham khảo tương tự như bản vẽ in trên giấy, nó còn cho phép tận dụng lại chính các
thành phần trong bản vẽ đó để chỉnh sửa, kế thừa, và kết quả ta sẽ có được một bản vẽ
mới từ những dữ liệu cũ.
Có thể nói rằng mức độ tự động hóa thiết kế công trình hiện nay đang ở nhiều cấp độ khác
nhau, tùy theo từng công việc cụ thể, điều này được thể hiện rõ trong cách thức tạo ra từng
thành phần trong hồ sơ thiết kế. Ví dụ, trong thiết kế cầu, phần phân tích kết cấu có mức độ tự
động hóa rất cao, nhưng việc tạo bản vẽ lại có mức độ tự động hóa thấp hơn nhiều. Tuy vậy, xu
hướng nâng cao mức độ tự động hóa đang ngày càng rõ nét bởi sự phát triển rất mạnh của các
phần mềm chuyên dụng, chúng đang là công cụ hỗ trợ không thể thiếu cho các kỹ sư thiết kế,
đồng thời là thành phần chủ chốt cho quá trình tự động hóa. Nhờ chúng mà việc phân tích kết
cấu công trình trở nên nhanh chóng và chính xác, nhờ chúng mà việc đưa ra các phương án
thiết kế của tuyến đường cũng như việc tạo mô hình ba chiều động trở thành hiện thực.
Hình I-1: Tự động hóa thiết kế hình học đường ô tô với Civil 3D 2008
2
MỞ ĐẦU
Hình I-2: Tự động hóa phân tích kết cấu với Midas Civil
2. Đôi nét về các phần mềm dùng cho thiết kế công trình giao
thông
Các phần mềm dùng trong thiết kế công trình nói chung rất đa dạng và hỗ trợ hầu hết các công
đoạn trong quá trình thiết kế. Ngay từ công đoạn khảo sát địa hình, toàn bộ quá trình từ xử lý
dữ liệu (bình sai, chuyển đổi định dạng) đến dựng mô hình bề mặt đều đã được tự động hóa ở
mức cao, hầu hết các nội dung liên quan đến sử lý số liệu khảo sát đều được tự động thực hiện
như: vẽ đường đồng mức, phân tích độ dốc bề mặt, xác định đường tụ thủy, xác định lưu vực,
vẽ mặt cắt và dựng mô hình ba chiều.
Dựa vào công năng của các phần mềm có thể chia chúng làm hai nhóm:
Ø Nhóm các phần mềm đa năng: là những phần mềm có thể dùng cho nhiều mục đích khác
nhau, đại diện cho nhóm này là AutoCAD và Excel, ta có thể sử dụng chúng trong hầu
hết các giai đoạn của quá trình tạo hồ sơ thiết kế. Tuy nhiên, để có thể sử dụng đa năng,
các phần mềm này được thiết kế không tập trung vào một lĩnh vực cụ thể nào, khiến cho
mức độ tự động hóa cho từng công việc không được cao khi thực hiện trực tiếp trên các
phần mềm này. Ta có thể dùng AutoCAD để tạo các bản vẽ kỹ thuật cho ngành cơ khí
cũng như công trình, bởi nguyên tắc tạo bản vẽ trong AutoCAD là “lắp ghép” từ những
đối tượng hình học cơ bản. Với Excel, ta có thể dùng để lập dự toán hay tạo bảng tính
duyệt kết cấu, bởi mỗi ô trong bảng tính của nó đều có thể nhận bất cứ nội dung nào.
3
GIÁO TRÌNH TỰ ĐỘNG HOÁ THIẾT KẾ CẦU ĐƯỜNG
Hình I-3: AutoCAD và Excel
Ø Nhóm các phần mềm chuyên dụng: là các phần mềm chỉ dùng được cho một mục đích cụ
thể nào đó. Bởi đích nhắm đến của chúng là rõ ràng cho nên mức độ tự động hóa là rất
cao. Ví dụ trong phân tích kết cấu, sau khi nhập xong số liệu, phần mềm phân tích kết cấu
sẽ tự động hoàn toàn trong việc tính và xuất kết quả. Bởi sự đa dạng của các bài toán thiết
kế, cho nên các phần mềm loại này cũng rất đa dạng về chủng loại và nguồn gốc, chúng
có thể được tạo ra từ những công ty sản xuất phần mềm chuyên nghiệp như Hài Hòa,
AutoDesk, MIDAS IT, ... hay từ chính những công ty tư vấn thiết kế, và thậm chí từ
chính những kỹ sư thiết kế. Cũng bởi tính đa dạng này mà việc lựa chọn để tìm được một
phần mềm phù hợp đôi khi là một bài toán khó đối với người sử dụng. Dựa trên mức độ
phổ biến trong sử dụng, có thể kể ra một số phần mềm chuyên dụng sau:
Trong lĩnh vực phân tích kết cấu: MIDAS/Civil, RM, SAP, ANSYS, LUSAS,
ABAQUS.
Trong lĩnh vực địa kỹ thuật: Geo-Slope, Plaxis, MIDAS GTS.
Trong lĩnh vực địa hình, bản đồ: Land Desktop, Topo, MapInfo, CAD Overlay.
Trong lĩnh vực thiết kế hình học đường ô tô: Nova-TDN, Civil 3D.
Do công trình giao thông luôn phụ thuộc vào rất nhiều yếu tố xung quanh nó, cho nên quá trình
thiết kế luôn gặp phải những bài toán riêng, đặc biệt và không thể khái quát được. Những bài
toán này hầu như không có lời giải tổng quát, và cũng bởi điều này khiến cho không có một
phần mềm chuyên dụng nào có thể giải quyết được mọi vấn đề, nhất là trong thiết kế đường ô
tô. Bên cạnh đó, do có sự khác nhau trong cách trình bày và thể hiện bản vẽ, nên thông thường
các phần mềm chuyên dụng chỉ có thể đáp ứng việc tạo bản vẽ ở mức cơ bản, còn việc bổ sung
thêm chi tiết để hoàn thiện bản vẽ thường được làm thủ công. Những nhược điểm này của các
phần mềm chuyên dụng lại là điều kiện cho sự ra đời các phần mềm dạng Add-in1, chúng
thường được phát triển bởi các kỹ sư cầu đường trong công ty tư vấn thiết kế công trình giao
thông và chạy cùng với các phần mềm chính, chúng tác động trực tiếp lên kết quả do phần
mềm chính tạo ra với mục đích là hoàn thiện chúng theo yêu cầu riêng của chính công ty đó.
3. Lựa chọn phần mềm dùng cho thiết kế công trình giao thông
Với sự đa dạng về chủng loại và xuất xứ của các phần mềm chuyên dụng, khiến cho việc chọn
mua phần mềm gặp nhiều khó khăn, nhất là đối với những đơn vị ít kinh nghiệm trong việc
1
Add-in: đây là các chương trình dạng phụ trợ hoặc tiện ích được thiết kế để cùng hoạt động với chương trình
chính. Mục đích dùng để mở rộng các khả năng cho chương trình chính. Các chương trình dạng Add-in này có thể
do chính người dùng tạo ra bằng nhiều loại công cụ khác nhau. Không phải chương chính chính nào cũng chấp
nhận Add-in, AutoCAD, MS.Office là hai phần mềm cho phép sử dụng Add-in điển hình.
4
MỞ ĐẦU
triển khai các hệ thống phần mềm. Do đó, để trang bị được phần mềm phù hợp với công việc
của mình cần phải thực hiện một số công việc chính sau:
Ø Chuẩn bị về nhân lực: để khai thác hiệu quả phần mềm, nhất là các phần mềm chuyên
dụng, cần có nhân lực đáp ứng được cả hai yêu cầu:
Có kiến thức tin học cơ bản: sử dụng tốt hệ điều hành Windows (hoặc tương đương),
in ấn, tìm kiếm tài liệu trên Internet.
Có kiến thức chuyên môn phù hợp.
Ø Phân tích công việc cần tự động hóa để xác định rõ các yêu cầu cần được thỏa mãn khi
triển khai ứng dụng phần mềm. Ví dụ, để tự động hóa công tác thiết kế kết cấu, những
yêu cầu sau cần được thỏa mãn:
Tính được nội lực và chuyển vị của kết cấu dưới tác dụng của các loại tải trọng (cần
nêu cụ thể, ví dụ như các trường hợp tổ hợp tải trọng).
Đưa ra được mô tả về phân bố ứng suất tại một số vị trí (cần nêu cụ thể, ví dụ tại các
nơi có cấu tạo hình học thay đổi đột ngột).
Có thể tính duyệt được mặt cắt.
Có thể tạo bản vẽ (cần nêu cụ thể mức độ chi tiết của bản vẽ) và hỗ trợ in ra máy in.
Có thể kết nối dữ liệu với các phần mềm khác (cần chỉ rõ định dạng kết nối, ví dụ yêu
cầu nhập/xuất cấu tạo hình học của kết cấu từ/sang định dạng *.DXF).
Có thể thêm các tính năng mới cho phần mềm bằng các công cụ dạng Add-in (yêu cầu
này có thể không bắt buộc phải có).
Ø Tìm hiểu, càng nhiều càng tốt, các phần mềm chuyên dụng mà có thể đáp ứng được
những yêu cầu trên. Có nhiều cách để thu thập thông tin:
Kinh nghiệm của các đơn vị, cá nhân đã sử dụng.
Giới thiệu từ nhà sản xuất phần mềm về tính năng, giá cả và chế độ hỗ trợ trong quá
trình dùng sản phẩm của họ.
Đánh giá phần mềm của các tạp chí chuyên ngành.
Tìm thông tin liên quan trên Internet.
Hình I-4: Tìm kiếm thông tin trên Internet với Google.com
Sử dụng phiên bản dùng thử miễn phí của phần mềm để tự kiểm chứng.
5
GIÁO TRÌNH TỰ ĐỘNG HOÁ THIẾT KẾ CẦU ĐƯỜNG
Ø Đàm phán với nhà cung cấp phần mềm để tìm ra một giải pháp hợp lý nhất trước khi
quyết định mua sản phẩm.
4. Chuyên biệt hóa phần mềm
Khi được trang bị phần mềm với mục đích tự động hóa công tác thiết kế thì ta mới giải quyết
được các bài toán cơ bản trong quá trình thiết kế, bởi không có phần mềm nào, mà ngay từ đầu,
lại có thể đáp ứng được mọi vấn đề sẽ xuất hiện sau này, còn rất nhiều vấn đề mới sẽ liên tục
phát sinh trong quá trình thiết kế những công trình cụ thể. Nói cách khác, việc trang bị phần
mềm nào đó chỉ là bước đầu cho quá trình tự động hóa, nhưng đây là bước đi quan trọng nhất.
Có nhiều cách giải quyết các vấn đề phát sinh này, mà cơ bản và tốt nhất là hai giải pháp:
Ø Phản hồi những vấn đề phát sinh cho nhà sản xuất phần mềm để họ nâng cấp phiên bản,
sau đó cập nhật lại. Giải pháp này thường mất nhiều thời gian và trong nhiều trường hợp
là không khả thi.
Ø Tự bổ sung thêm những khả năng mới cho phần mềm đang sử dụng để chúng có thể giải
quyết được vấn đề phát sinh. Giải pháp này đòi hỏi phải có nhân lực am hiểu về chuyên
môn cầu đường và công nghệ thông tin, đồng thời phần mềm đang sử dụng phải cho phép
cập nhật tính năng mới từ phía người dùng. Nhân lực đáp ứng được yêu cầu này chính là
kỹ sư xây dựng công trình giao thông được trang bị thêm những kiến thức về tin học phù
hợp, đây là mục tiêu chính của môn học Tự động hóa thiết kế cầu đường và cũng là mục
tiêu của chính giáo trình này.
Phần mềm, mà người dùng có thể tự tạo thêm các khả năng mới cho nó, phải có một số
đặc điểm sau:
Cung cấp tính năng cho phép người dùng có thể tự mình bổ sung thêm chức năng cho
chính phần mềm đó. Ví dụ phần mềm AutoCAD cho phép người dùng sử dụng công
cụ lập trình, như AutoLISP hay ObjectARX, để tự xây dựng thêm những chức năng
mới trong AutoCAD.
Hình I-5: Bổ sung tính năng mới cho AutoCAD
Cho phép nhúng các phần mềm dạng Add-in vào bên trong, ví dụ như các chương
trình trong bộ MS.Office (Excel, Word, Power Point ...). Các chương trình dạng Addin có thể được xây dựng từ một số công cụ lập trình (ví dụ ta có thể dùng VSTO Visual Studio Tools for Office - để xây dựng các chương trình dạng Add-in nhúng vào
trong bộ Office)
6
MỞ ĐẦU
Hình I-6: Bổ sung thêm chức năng lập dự toán cho Excel
Số liệu đầu vào và kết quả được lưu trữ trên tệp với định dạng có thể hiểu được.
Những chương trình dạng này chỉ cho phép người dùng tạo ra những tính năng mới
phục vụ cho việc nhập dữ liệu (các chương trình dạng Wizard1) hoặc trình bày kết quả.
1
Wizard: thường được hiểu là một chương trình có chức năng trợ giúp người dùng nhập dữ liệu (nhanh và tránh
sai sót), nó đặc biệt hữu ích khi dùng những phần mềm đa năng, bởi những phần mềm này thướng hay yêu cầu
người dùng đưa vào rất nhiều loại dữ liệu mà nhiều khi chúng không thực sự cần thiết cho một bài toán cụ thể.
Chương trình dạng Wizard sẽ tự động lọc những thông tin cần thiết cho bài toán cụ thể (để người dùng chỉ cần
nhập những dữ liệu cần thiết cho bài toán của mình) còn những số liệu khác mà phần mềm yêu cầu sẽ được
chương trình Wizard tự động bổ sung. Bên cạnh đó chương trình Wizard còn có chức năng dẫn dắt người dùng
thực hiện bài toán theo một trình tự nhất định để tránh nhầm lẫn.
7
GIÁO TRÌNH TỰ ĐỘNG HOÁ THIẾT KẾ CẦU ĐƯỜNG
Hình I-7: Wizard trợ giúp nhập dữ liệu cho kết cấu cầu đúc hẫng của MIDAS/Civil
Công cụ lập trình để tạo ra các tính năng mới cho phần mềm hiện có rất nhiều và khá dễ
dùng. Hầu hết chúng tập trung hỗ trợ cho AutoCAD và Office, bởi hai phần mềm này
được dùng rất phổ biến trong công tác thiết kế. Với AutoCAD ta có thể sử dụng những
công cụ sau:
Các công cụ lập trình nhúng sẵn bên trong AutoCAD:
AutoLISP: là một ngôn ngữ lập trình dạng thông dịch, cho phép người dùng tận
dụng tối đa những lệnh sẵn có của AutoCAD để tổ hợp lại nhằm tạo ra những tính
năng mới có mức độ tự động hóa cao.
8
MỞ ĐẦU
Hình I-8: Visual LISP: công cụ hỗ trợ cho lập trình với AutoLISP trong AutoCAD
VBA: là một công cụ lập trình dựa trên Visual Basic, nó cho phép người dùng kết
hợp tính dễ dùng và hiệu quả của môi trường lập trình Visual Basic với các tính
năng và hệ thống đối tượng sẵn có trong AutoCAD. Hiện nay đây là công cụ được
dùng rất phổ biến để xây dựng thêm những tính năng mới, với quy mô không lớn và
không quá phức tạp trên AutoCAD. Trong lĩnh vực thiết kế công trình giao thông,
công việc chiếm khối lượng lớn nhất và mất nhiều công nhất là tạo bản vẽ kỹ thuật.
Mặc dù hầu hết người thiết kế đều dùng AutoCAD để tạo bản vẽ kỹ thuật nhưng
mức độ tự động hóa vẫn rất thấp, chủ yếu sử dụng các lệnh đơn của AutoCAD
(thông qua dòng lệnh hay nút bấm trong AutoCAD) cùng với các thông số hình học
tính toán được (có thể bằng các phần mềm khác, ví dụ phần mềm tính kết cấu) để
xây dựng bản vẽ. Vấn đề này hoàn toàn có thể tự động hóa được khi người dùng
biết kết hợp quy tắc vẽ đối tượng thiết kế với số liệu hình học tính được trong một
chương trình VBA do chính họ tạo ra.
9
GIÁO TRÌNH TỰ ĐỘNG HOÁ THIẾT KẾ CẦU ĐƯỜNG
Hình I-9: Môi trường lập trình VBA trong AutoCAD
Công cụ lập trình bên ngoài: bao gồm bất cứ ngôn ngữ lập trình nào mà có hỗ trợ công
nghệ COM (Component Object Model) của Microsoft như: VB, VC++, Delphi....
Công cụ lập trình ObjectARX (AutoCAD Runtime Extension): là một cách mở rộng
AutoCAD hiệu quả nhất và phức tạp nhất. Các phần mở rộng AutoCAD được xây
dựng trên VC++ với việc sử dụng các thư viện lập trình mở rộng của AutoCAD (chính
là ObjectARX). Bởi việc cho phép điều khiển trực tiếp nhân và cấu trúc dữ liệu của
chương trình AutoCAD, cho nên những chương trình được viết với ObjectARX sẽ có
tính linh hoạt rất cao, tốc độ chạy nhanh và nhỏ gọn hơn so với chương trình cùng loại
viết bằng công cụ lập trình khác, nhưng mức độ phức tạp của việc lập trình sẽ tăng lên.
Hầu hết các ứng dụng lớn chạy trên nền AutoCAD đều được xây dựng dựa trên
ObjectARX: Land Desktop, Civil 3D, Nova-TDN...
10
MỞ ĐẦU
Hình I-10: Mở rộng khả năng cho AutoCAD dùng ObjectARX
5. Kết chương
Như vậy, trong chương này, toàn cảnh về việc ứng dụng công nghệ thông tin để tự động hóa
công tác thiết kế công trình giao thông đã được đề cập đến. Vấn đề cốt lõi để tự động hóa thiết
kế bao gồm:
Ø Quá trình thiết kế công trình giao thông và sản phẩm của từng công đoạn.
Ø Khả năng của phần cứng máy tính và các hệ thống phần mềm, bao gồm cả các phần mềm
chuyên dụng.
Ø Sự đa dạng của các bài toán thiết kế cũng như những hạn chế trong các phần mềm chuyên
dụng.
Ø Những đặc điểm của phần mềm và các công cụ phát triển, để từ đó có được định hướng
trong việc giải quyết các vấn đề phát sinh, vốn thường gặp suốt quá trình thiết kế.
Trong khuôn khổ giáo trình của một môn học, nhiều mảng kiến thức sẽ được kế thừa từ những
môn học khác là điều đương nhiên, và do đó, chỉ có những nội dung mới, chưa được đề cập đến
trong những môn học khác, mới được trình bày chi tiết ở đây. Với các chương tiếp theo trong
giáo trình này, những kiến thức chi tiết để thực hiện tự động hóa thiết kế cầu đường sẽ được
đưa ra theo những ý chính của chương đầu tiên này.
11
PHẦN II: LẬP TRÌNH TRÊN ỨNG DỤNG NỀN
CHƯƠNG I: KHÁI NIỆM
Trong hồ sơ thiết kế, phần tài liệu được trình bày dưới dạng bảng biểu (bảng tính kết cấu, bảng
tính khối lượng, ...) và bản vẽ (mô tả cấu tạo hình học của công trình) chiếm một khối lượng
đáng kể. Nội dung của những tài liệu trong phần này lại luôn có mối quan hệ rõ ràng và chặt
chẽ với phần tính toán trong quá trình thiết kế, chính vì vậy, khả năng thực hiện tự động hóa
công đoạn này là hoàn toàn khả thi và mang lại hiệu quả cao. Những công việc cụ thể có thể tự
động hóa bao gồm: tính toán, lập bảng tính, lập bản vẽ, trong đó, phần tính toán tạo tiền đề cho
quá trình thực hiện lập bảng tính và bản vẽ.
Phần tính toán có thể được tách ra thành một mô-đun riêng và thực hiện độc lập với bất cứ
công cụ lập trình nào, và hiện nay, công nghệ lập trình cho phép dễ dàng kết nối các mô-đun
loại này với các ứng dụng khác. Phần lập bảng tính và bản vẽ, thực chất sử dụng kết quả thực
hiện của mô-đun tính toán và thể hiện kết quả này dưới dạng bản vẽ kỹ thuật và bảng tính, bảng
biểu phù hợp với các quy định về trình bày tài liệu trong hồ sơ thiết kế. Trong nhiều trường hợp
người ta có thể kết hợp mô-đun tính toán vào cùng với quá trình tạo bảng tính hay bản vẽ, cách
làm này rất hiệu quả đối với các bài toán không quá phức tạp về tính toán (như thiết kế hình
học đường ô tô hay tính duyệt mặt cắt kết cấu). Nhưng đối với các bài toán có độ phức tạp cao
trong tính toán (như bài toán tính kết cấu hay ổn định trượt mái dốc) thì mô-đun tính toán
thường được tách riêng ra và kết quả tính toán sẽ được trình bày bởi mô-đun tạo bản vẽ và môđun tạo bảng tính riêng. Trong khuôn khổ giáo trình này, do nhắm đến tính phổ biến của các
bài toán thông thường có độ phức tạp không cao nhưng đa dạng, cho nên việc định hướng giải
quyết bài toán hướng đến việc hợp nhất phần tính toán vào trong mô-đun tạo bảng tính hay môđun tạo bản vẽ.
Do bảng tính và bản vẽ có cấu trúc tài liệu rất khác biệt, cho nên hầu như không có phần mềm
nào có thể hỗ trợ tốt cho cả hai mục đích trên cùng lúc, và trong thực tế, người ta sử dụng
những phần mềm riêng để tạo bản vẽ hay bảng tính. Ví dụ trong lĩnh vực thiết kế công trình
giao thông, Excel thường được dùng như là phần mềm hỗ trợ tạo bảng tính chuyên nghiệp,
trong khi đó, AutoCAD lại thường được sử dụng trong việc tạo bản vẽ kỹ thuật. Bên cạnh
AutoCAD và Excel, còn có nhiều phần mềm chuyên dụng khác, mà khả năng của chúng tập
trung vào một số lĩnh vực hẹp, ví dụ như MIDAS/Civil tập trung vào lĩnh vực phân tích kết
cấu, Nova-TDN tập trung vào lĩnh vực thiết kế hình học đường ô tô. Kết quả mà các phần mềm
chuyên dụng này mang lại khá đầy đủ, có thể bao gồm hầu hết các bảng tính và bản vẽ liên
quan đến bài toán được giải quyết. Tuy vậy, trong phạm vi lĩnh vực của mình, không phần
mềm chuyên dụng nào có thể đáp ứng được mọi nhu cầu, và do đó, chúng thường được thiết kế
theo hướng có thể kết nối với các phần mềm khác nhằm mục đích hỗ trợ người dùng giải quyết
được vấn đề phát sinh bằng cách kết hợp vài phần mềm với nhau.
12
CHƯƠNG I: KHÁI NIỆM
Hình I-1: Lập bảng tính kết cấu mặt đường trên Excel
Hình I-2: Tạo bản vẽ bình đồ tuyến đường ô tô trên AutoCAD
Để có thể kết nối với nhau, các phần mềm chuyên dụng thường cung cấp kết quả tính toán dưới
dạng dữ liệu có cấu trúc và được lưu trữ trong các tệp có định dạng TEXT, ví dụ như CSV hay
DXF. Với các dữ liệu có cấu trúc này, người dùng sẽ tự thực hiện việc kết nối các phần mềm
lại với nhau. Việc kết nối này cũng chỉ có thể giải quyết thêm một số bài toán phát sinh, cho
nên một số phần mềm đã cho phép người dùng có thể can thiệp sâu hơn nữa vào bên trong nó
bằng các công cụ lập trình, để họ có thể tự giải quyết các bài toán phát sinh mà người thiết kế
phần mềm không thể dự kiến trước được. Khi người dùng xây dựng những chương trình của họ
dựa trên những ứng dụng được thiết kế theo cấu trúc mở này, họ sẽ tận dụng những khả năng
13
sẵn có của chúng để làm nền, giúp cho việc lập trình được nhanh và hiệu quả hơn rất nhiều so
với cách lập trình thông thường, và do đó, có thể gọi chúng là các ứng dụng nền, điển hình và
được sử dụng nhiều nhất làm ứng dụng nền trong lĩnh vực thiết kế là AutoCAD và Excel, ngoài
việc phù hợp với định dạng tài liệu trong hồ sơ thiết kế (bản vẽ và bảng tính) chúng còn cho
phép người dùng xây dựng các chương trình chạy cùng với mục đích bổ sung thêm các chức
năng chuyên biệt.
Như vậy, một phần mềm được gọi là ứng dụng nền khi nó thỏa mãn đồng thời các tiêu chí sau:
Ø Cho phép một chương trình chạy bên trong và cùng với nó (tương tự như một lệnh).
Ø Cho phép sử dụng các tính năng của nó thông qua công cụ lập trình thích hợp.
Hình I-3: Mô hình lập trình trên ứng dụng nền
Một lệnh mới hay một chức năng mới được xây dựng trên ứng dụng nền thực chất là một
chương trình hoàn chỉnh, vì vậy, để xây dựng nó cần có công cụ lập trình tương ứng. Thông
thường công cụ lập trình được hiểu như là một tập hợp bao gồm:
Ø Ngôn ngữ lập trình.
Ø Môi trường lập trình.
Ø Thư viện hỗ trợ lập trình.
Một ví dụ về công cụ lập trình trên AutoCAD, đó là AutoLISP. Với công cụ lập trình này,
không nhất thiết phải có môi trường lập trình và thư viện hỗ trợ lập trình, ta chỉ cần tạo ra một
tệp dạng TEXT chứa các mã lệnh viết bằng ngôn ngữ AutoLISP. Tuy nhiên từ phiên bản
AutoCAD R14, để thuận tiện cho người lập trình, một môi trường lập trình dành cho AutoLISP
đã được bổ sung, đó là Visual LISP. Với môi trường lập trình này, việc lập và kiểm soát
chương trình trở nên thuận lợi hơn rất nhiều, bởi Visual LISP đã được tích hợp nhiều tính năng
hỗ trợ lập trình chuyên nghiệp, trong khi đó, nếu ta không sử dụng môi trường lập trình, thì tuy
ta có thể viết được một chương trình AutoLISP hoàn chỉnh, song trong suốt quá trình xây dựng
chương trình này ta luôn phải vất vả để tự kiểm soát chương trình.
14
CHƯƠNG I: KHÁI NIỆM
Hình I-4: Xây dựng chương trình bằng ngôn ngữ AutoLISP khi không sử dụng môi trường
lập trình, ta sẽ luôn phải tự kiểm soát cú pháp và các lệnh mà không có bất cứ hỗ trợ nào vì
thế khả năng nhầm lẫn là rất lớn.
Hình I-5: Lập trình bằng ngôn ngữ AutoLISP trên môi trường lập trình Visual LISP, ta luôn
nhận được sự hỗ trợ tự động bằng màu sắc hay các tính năng khác trong môi trường lập
trình.
Thư viện hỗ trợ lập trình có thể rất đa dạng và thường là những phần bổ sung giúp cho việc xây
dựng chương trình được nhanh hơn thông qua sự kế thừa những thứ đã được làm từ trước. Khi
lập trình bằng AutoLISP thì thư viện hỗ trợ lập trình là tập hợp các chương trình hoàn chỉnh
cũng viết bằng AutoLISP. Để sử dụng thư viện hỗ trợ lập trình thì mỗi công cụ lập trình có một
quy định về cách thức sử dụng riêng, ví dụ với AutoLISP, để sử dụng một chương trình con
trong thư viện, ta chỉ cần tải chương trình AutoLISP chứa chương trình con đó thông qua một
câu lệnh từ chương trình chính.
15
Tương ứng với từng ứng dụng nền thì sẽ có các công cụ lập trình phù hợp. Một ứng dụng nền
có thể hỗ trợ một hay nhiều công cụ lập trình khác nhau, tùy mục đích sử dụng. AutoCAD hỗ
trợ các công cụ lập trình trên ứng dụng nền sau:
Ø AutoLISP
Ø ObjectARX
Ø VBA (Visual Basic for Applications)
Còn Excel hỗ trợ các công cụ lập trình:
Ø VBA
Ø VSTO (Visual Studio Tools for Office)
Mỗi công cụ lập trình luôn có những đặc điểm riêng và khó có thể phán xét cái nào hay hơn
hoặc kém hơn một cách tổng quát. Do đó, để lựa chọn được công cụ lập trình thích hợp khi lập
trình trên ứng dụng nền, cần dựa vào mục đích cụ thể. Ví dụ khi lập trình trên AutoCAD, để tạo
các công cụ trợ giúp vẽ thì AutoLISP là lựa chọn hợp lý. Nhưng để xây dựng những ứng dụng
lớn, phức tạp, đòi hỏi phải can thiệp sâu vào bên trong AutoCAD thì chỉ có thể dùng
ObjectARX mới làm được.
Trong lĩnh vực tự động hóa thiết kế công trình giao thông, hầu hết các bài toán lớn và cơ bản đã
được giải quyết, nhưng còn rất nhiều các bài toán khác, tuy không lớn và không quá phức tạp,
nhưng lại rất đa dạng và khó khái quát, vẫn chưa có phần mềm thực hiện, và do đó, phạm vi
ứng dụng của lập trình trên ứng dụng nền là rất lớn và có tính hiệu quả cao. Hơn nữa, với quy
mô của các bài toán này, thì việc lựa chọn VBA làm công cụ lập trình là rất phù hợp bởi:
Ø Ngôn ngữ lập trình Visual Basic (VB) là một loại ngôn ngữ dễ sử dụng, có số lượng
người dùng đông đảo và tài liệu tham khảo rất phong phú. Điều này cho phép người dùng
trao đổi kỹ năng, tìm kiếm tài liệu, mã nguồn một cách dễ dàng.
Ø Môi trường lập trình thân thiện, dễ dùng và đầy đủ nên việc xây dựng ứng dụng sẽ nhanh
và không cần thêm công cụ lập trình nào khác.
Ø Trên tất cả các ứng dụng nền hỗ trợ VBA, giao diện lập trình là đồng nhất, do đó người
dùng có thể lập trình mở rộng trên nhiều ứng dụng nền một cách thuận lợi.
Ø Thư viện lập trình có rất nhiều và đa dạng cho nên người dùng có thể xây dựng ứng dụng
của mình nhanh và chuyên nghiệp.
Ø Tốc độ thực thi của chương trình nhanh.
Ø Khai thác được hầu hết các tính năng sẵn có của ứng dụng nền.
Ø Chương trình VBA có thể được nhúng trong tệp của ứng dụng nền (chẳng hạn như tệp
bảng tính của Excel hay tệp bản vẽ của AutoCAD) hoặc có thể được lưu dưới dạng một
dự án độc lập. Điều này giúp cho việc phân phối, chia sẻ mã lệnh được thuận tiện.
Kết chương
Tự động hóa công tác lập hồ sơ thiết kế công trình giao thông là hoàn toàn khả thi và có thể
được thực hiện theo nhiều cách khác nhau.
Dự án VBA nên xây dựng theo hướng gộp cả phần tính toán và xuất kết quả vào một mô-đun
thống nhất.
Sử dụng AutoCAD và Excel làm ứng dụng nền để xây dựng các ứng dụng bằng VBA nhằm
mục đích hỗ trợ thiết kế là lựa chọn mang tính khả thi cao và có nhiều ưu điểm.
Để lập trình với VBA, cách tốt nhất, là làm chủ từng phần. Đầu tiên cần nắm vững ngôn ngữ
lập trình Visual Basic và cách sử dụng VBA IDE để viết mã lệnh cũng như thiết kế giao diện.
16
CHƯƠNG I: KHÁI NIỆM
Sau đó nghiên cứu mô hình đối tượng của ứng dụng nền (là những thành phần của ứng dụng
nền mà người dùng có thể sử dụng) cũng như cách sử dụng chúng bằng VBA.
17
18
CHƯƠNG II: TỔNG QUAN VỀ VBA
CHƯƠNG II: TỔNG QUAN VỀ VBA
1. Đặc điểm của VBA
Từ các đặc điểm cơ bản đã được phân tích ở cuối chương 1 ta có thể thấy rằng VBA là một
công cụ lập trình cho phép phát triển nhanh phần mềm và được tích hợp vào trong ứng dụng
nền. Về thực chất, VBA được xây dựng dựa trên kiến trúc COM1, cho nên người dùng có thể
sử dụng các thành phần sẵn có của ứng dụng nền trong việc xây dựng chương trình của mình
với VBA.
Một dự án được xây dựng bằng VBA dựa trên ứng dụng nền nào thì nó phụ thuộc chặt chẽ vào
ứng dụng nền đó, bởi theo mặc định, dự án VBA sẽ hoạt động và sử dụng các thành phần trong
chính ứng dụng nền đó. Điều này có nghĩa là ta rất khó có thể chuyển đổi một dự án VBA từ
loại ứng dụng nền này sang một ứng dụng nền khác cũng như tạo ra một ứng dụng chạy độc
lập.
Sự khác biệt cơ bản nhất của VBA trong các ứng dụng nền (ví dụ giữa VBA trong AutoCAD
và VBA trong Excel) là cách thức sử dụng các thành phần (đối tượng) của ứng dụng nền. Cho
nên khi xây dựng ứng dụng bằng VBA, việc đầu tiên là phải tìm hiểu mô hình đối tượng của
ứng dụng nền và cách sử dụng chúng.
Như trong chương trước đã trình bày, xây dựng một dự án VBA, một cách tổng quát, người
dùng cần nắm vững hai phần:
Ø Ngôn ngữ lập trình Visual Basic và giao diện lập trình VBA IDE. Phần này sẽ bao gồm
các nội dung kiến thức trong chương 2 và 3.
Ø Mô hình đối tượng của ứng dụng nền và cách sử dụng chúng. Nội dung kiến thức của
phần này sẽ được trình bày trong chương 4 và 5.
2. Trình tự xây dựng một dự án bằng VBA
Về mặt trình tự thực hiện, việc xây dựng một dự án VBA bao gồm các bước sau:
1. Xác định rõ nhu cầu xây dựng chương trình. Nhu cầu này được xác định dựa trên hoạt
động thực tế của người dùng và thường do chính người dùng đề xuất. Đây là bước xác định
các chức năng của chương trình.
2. Xác định rõ mục tiêu mà chương trình cần đạt được. Bước này là phần cụ thể hóa của bước
1, ví dụ như bước 1 có nhu cầu hoàn thiện bản vẽ kết cấu BTCT, còn bước này sẽ cụ thể
mức độ hoàn thiện (đến đâu và như thế nào).
3. Lựa chọn ứng dụng nền và công cụ lập trình phù hợp cho việc xây dựng chương trình. Ví
dụ với nhu yêu cầu tính và tạo bản vẽ của cấu kiện BTCT, thì ứng dụng nền thích hợp là
AutoCAD và công cụ lập trình có thể là AutoLISP, VBA, ObjectARX. Tùy theo mức độ
phức tạp của bài toán mà ta lựa chọn công cụ lập trình phù hợp. Ở đây VBA đảm bảo sự
thuận tiện trong việc xây dựng các mô-đun tính toán và tạo bản vẽ đối với những bài toán
thông thường.
4. Thiết kế hệ thống cho chương trình (hay dự án): bao gồm việc lập sơ đồ khối, xác định các
mô-đun của chương trình, thiết kế giao diện nhập xuất dữ liệu và kết quả, xây dựng hệ
thống cơ sở dữ liệu sao cho thỏa mãn những đề xuất ở bước 1 và 2.
1
COM (Component Object Model): là một kiến trúc lập trình được thiết kế bởi Microsoft. Mục đích của công
nghệ này là tạo ra một chuẩn công nghệ trong lập trình, mà ở đó cho phép xây dựng chương trình theo mô hình lắp
ghép hay sử dụng lại các sản phẩm đã được hoàn thiện từ trước theo chuẩn COM.
19
5. Viết mã lệnh (lập trình): là việc sử dụng công cụ lập trình để tạo ra chương trình phù hợp
với hệ thống đã được thiết kế ở bước 4.
6. Kiểm thử chương trình: là công đoạn hoàn thiện và chuẩn bị đưa chương trình vào sử dụng.
Những công việc chính của bước này bao gồm:
Ø Kiểm tra xem các chức năng của chương trình đã thỏa mãn các yêu cầu đề ra từ trước
chưa bằng cách chạy thử tất cả các tính năng của chương trình dựa trên một kịch bản cụ
thể.
Ø Kiểm tra hiệu năng của chương trình: xem thời gian thực hiện và quy trình sử dụng
chương trình có hợp lý không.
Ø Kiểm tra khả năng chịu lỗi của chương trình, ví dụ như khi nhập số liệu sai. Một chương
trình đảm bảo khả năng chịu lỗi là nó sẽ không bị dừng lại đột ngột do lỗi thao tác của
người dùng hay dữ liệu sai.
7. Đóng gói, đưa chương trình vào sử dụng: bao gồm việc xây dựng tài liệu hướng dẫn cài đặt
và sử dụng chương trình nhằm mục đích giúp người dùng có thể triển khai chương trình
vào thực tế.
8. Tiếp nhận các góp ý, phản hồi của người dùng để bổ sung hay hoàn thiện những khiếm
khuyết của chương trình mà trong quá trình thiết kế hệ thống hay kiểm thử đã bỏ qua hoặc
chưa phát hiện được.
9. Nâng cấp chương trình: sau một thời gian sử dụng, dựa trên những phản hồi của người
dùng, nếu thấy rằng chương trình cần bổ sung thêm những tính năng mới thì người phát
triển phần mềm sẽ thực hiện sự bổ sung này dựa trên những thành phần đã có từ trước.
3. Cấu trúc của một dự án VBA
Khi nói đến các thành phần tạo nên một dự án VBA thì cấu trúc của nó, về tổng quát, như sau:
Ø Mô-đun chuẩn (Module): là nơi chứa các mã lệnh khai báo, các chương trình con (hàm và
thủ tục). Việc tạo ra các mô-đun chuẩn thường căn cứ theo các khối chức năng mà người
thiết kế hệ thống đặt ra.
Ø Mô-đun lớp (Class Module): là nơi chứa định nghĩa cho các lớp của dự án.
Ø Userform: là giao diện dạng hộp thoại giúp cho việc giao tiếp giữa người sử dụng và
chương trình được thuận tiện. Thông thường người ta sử dụng Userform để nhập số liệu,
xuất kết quả của chương trình. Trong một số dự án, nếu việc nhập số liệu và biểu diễn kết
quả được thực hiện trực tiếp trên ứng dụng nền, thì có thể không cần sử dụng Userform.
Những thành phần này là bộ khung để người dùng xây dựng chương trình của mình lên trên đó,
ví dụ như viết mã lệnh hay thiết kế giao diện cho chương trình. Mô-đun lớp và UserForm là hai
thành phần có thể xuất hiện hoặc không thùy thuộc vào từng dự án và tất cả những thành phần
sử dụng trong dự án đều được hiển thị trên giao diện của VBA IDE.
20
CHƯƠNG II: TỔNG QUAN VỀ VBA
Hình II-1: Cấu trúc của dự án thể hiện trên VBA IDE
Tuy nhiên, khi xây dựng chương trình (viết mã lệnh) cụ thể thì khái niệm cấu trúc của một
chương trình là sự bố trí, sắp xếp các câu lệnh trong chương trình đó. Như vậy khái niệm cấu
trúc này phụ thuộc vào từng loại ngôn ngữ lập trình. Đối với ngôn ngữ lập trình Visual Basic
(VB), cấu trúc của nó chỉ tập trung vào chương trình con (hàm và thủ tục) chứ không có một
quy định về cấu trúc nào đối với chương trình chính. Chi tiết của cấu trúc của chương trình con
sẽ được đề cập đến trong các phần sau.
4. Môi trường phát triển tích hợp VBA IDE
Trong mỗi công cụ lập trình trên ứng dụng nền, luôn có một môi trường lập trình nhằm hỗ trợ
người dùng có thể xây dựng, thử nghiệm và hoàn thiện chương trình của mình. Trong
AutoCAD và Excel, khi sử dụng VBA để lập trình, môi trường lập trình được gọi là Môi
trường phát triển tích hợp (viết tắt là VBA IDE). Trên tất cả các ứng dụng nền, VBA IDE có
cấu trúc và hoạt động tương đương nhau với giao diện cơ bản và cách gọi giao diện VBA IDE
từ ứng dụng nền như sau:
Ø Phím tắt: từ giao diện chính của ứng dụng nền, nhấn tổ hợp phím Alt+F11.
Ø Menu: Tools Ö Macro Ö Visual Basic Editor.
21
Hình II-2: Giao diện chính của VBA IDE
1. Thanh trình đơn (Menu bar): chứa tất cả các lựa chọn cần thiết để thao tác với VBA IDE
2. Cửa sổ dự án (Project Explorer Window): liệt kê dưới dạng cây phân cấp các dự án hiện
đang được mở trong VBA IDE và các thành phần có trong từng dự án như các tài liệu
thành phần, các mô-đun chứa chương trình con, các mô-đun lớp, các cửa sổ do người dùng
tạo.
GỢI Ý Việc thêm các thành phần mới vào trong một dự án được thực hiện trong menu
Insert của VBA IDE. Ví dụ muốn thêm một mô-đun chuẩn vào trong dự án, chọn Insert Ö
Module
3. Cửa sổ mã lệnh (Code Window): mỗi thành phần được liệt kê trong cửa sổ dự án đều có
một cửa sổ mã lệnh riêng, chứa mã lệnh cho thành phần đó. Người dùng có thể hiệu chỉnh
mã lệnh, tạo ra mã lệnh mới trong cửa sổ mã lệnh.
22
CHƯƠNG II: TỔNG QUAN VỀ VBA
4. Cửa sổ tra cứu đối tượng (Object Browser Window): hiển thị các lớp, phương thức, thuộc
tính, sự kiện và hằng số có trong thư viện đối tượng và trong dự án mà người dùng vừa tạo.
Ta có thể sử dụng cửa sổ này để tìm kiếm, tra cứu tất cả các đối tượng mà ta vừa tạo ra
cũng như các đối tượng trong các chương trình khác.
5. Cửa sổ đối tượng trực quan (Visual Object Window): khi người dùng tạo các đối tượng
trực quan thì cửa sổ này sẽ cho phép người dùng thao tác trên các điều khiển một cách dễ
dàng và thuận tiện.
6. Hộp công cụ chứa điều khiển (Tool Box): chứa các thanh công cụ giúp người dùng có thể
chèn các điều khiển vào cửa sổ người dùng (UserForm).
7. Cửa sổ thuộc tính (Properties Window): cửa sổ này liệt kê tất cả các thuộc tính của đối
tượng, qua đó người dùng có thể tham khảo và thay đổi các thuộc tính khi cần như màu
chữ, tên đối tượng…
5. Ví dụ đầu tiên với VBA
Ví dụ này được trình bày với mục đích giúp người dùng làm quen với VBA IDE trong Excel.
Kết quả của ví dụ là hiển thị nội dung ô A1 trong Sheet1 của bảng tính lên tiêu đề của một hộp
thoại người dùng (UserForm).
Trình tự thực hiện như sau:
1. Mở ứng dụng Excel, nhấn tổ hợp phím ALT+F11 để vào VBA IDE.
2. Trong VBA IDE, chọn menu Insert Ö UserForm để thêm một hộp thoại người dùng vào
trong dự án.
3. Chọn tiếp menu Insert Ö Module để thêm một mô-đun chuẩn vào trong dự án.
4. Chọn Module1 và soạn thảo mã lệnh trong mô-đun đó như sau:
23
Public Sub FirstPro()
UserForm1.Show
UserForm1.Caption = Sheets("Sheet1").Range("A1").Value
End Sub
Sau đó quay trở lại Excel, và chạy chương trình theo trình tự:
1. Gõ vào ô A1 của Sheet1 nội dung “Hello, World”.
2. Chọn menu Tools Ö Macro Ö Macros (hoặc nhấn tổ hợp phím ALT+ F8).
3. Trong hộp thoại Macro, chọn macro có tên FirstPro rồi nhấn nút Run. Kết quả chương trình
sẽ hiển thị như hình dưới đây:
Hộp thoại Macro
Kết quả trên Excel
24
CHƯƠNG III: CƠ BẢN VỀ NGÔN NGỮ LẬP TRÌNH VISUAL BASIC
CHƯƠNG III: CƠ BẢN VỀ NGÔN NGỮ LẬP TRÌNH
VISUAL BASIC
Trong chương này sẽ trình bày những kiến thức cơ bản trong ngôn ngữ lập trình Visual Basic
(VB) như: cú pháp, các từ khoá, các kiểu dữ liệu, các khai báo,… Tất cả các ví dụ sẽ được viết
và trình bày kết quả trong VBA IDE.
1. Những qui định về cú pháp
Cú pháp được hiểu là một một tập hợp bao gồm các quy tắc, luật lệ về trật tự và hình thức viết
của một câu lệnh hay một cấu trúc lệnh.
Trong ngôn ngữ lập trình Visual Basic (VB), cũng như các ngôn ngữ lập trình khác, đều có
những quy định về cú pháp cho việc viết mã lệnh và người lập trình cần phải tuân theo các quy
tắc này để trình biên dịch có thể dịch mã lệnh mà không phát sinh lỗi. Sau đây là các quy định
cơ bản về cú pháp của VB:
Ø Các câu lệnh phải là các dòng riêng biệt. Nếu có nhiều lệnh trên cùng một dòng thì giữa
các lệnh ngăn cách nhau bằng dấu hai chấm (:). Nếu dòng lệnh quá dài, muốn ngắt lệnh
thành hai dòng thì sử dựng dấu cách và dấu gạch dưới ( _ ).
Ø Nếu muốn chèn thêm ghi chú, phải bắt đầu dòng chú thích bằng dấu nháy đơn (’).
Ø Qui ước khi đặt tên: phải bắt đầu bằng kí tự kiểu chữ cái thông thường; không chứa dấu
chấm, dấu cách hay các ký tự đặc biệt khác; không quá 255 kí tự; không trùng với các từ
khoá; các biến có cùng một phạm vi thì không được đặt tên trùng nhau.
2. Các trợ giúp về cú pháp trong quá trình viết mã lệnh
Các quy tắc về cú pháp thường khó nhớ đối với những người mới học lập trình hay mới sử
dụng ngôn ngữ lập trình mới, cho nên, để thuận tiện cho người lập trình, VBA IDE cung cấp
tính năng tự động phát hiện lỗi cú pháp trong quá trình viết mã lệnh. Tuy nhiên việc kiểm tra tự
động này có thể gây khó chịu cho những lập trình viên chuyên nghiệp, những người rất hiếm
khi mắc lỗi cú pháp khi lập trình, cho nên chức năng này chỉ hoạt động khi được kích hoạt,
bằng cách chọn trình đơn Tools Ö Options Ö Editor ÖCode Settings.
Hình III-1: Bật / Tắt trợ giúp phát hiện lỗi cú pháp của VBA IDE
Ý nghĩa của hai tùy chọn này như sau:
Ø Tự động kiểm tra lỗi cú pháp (Auto Systax Check): Tùy chọn này cho phép VBA IDE tự
động phát hiện lỗi cú pháp ngay sau khi người dùng kết thúc dòng lệnh (xuống dòng
mới), một hộp thoại (như hình dưới đây) sẽ thông báo vị trí gây lỗi cũng như nguyên
nhân gây lỗi. Nếu người dùng bỏ qua không sửa ngay thì dòng lệnh có lỗi sẽ được đánh
dấu.
25
Hình III-2: VBA IDE tự động kiểm tra lỗi cú pháp và thông báo cho người dùng
Ø Kiểm tra các biến (Require Variable Declaration): Trong VB, người dùng có thể sử dụng
một biến mà không cần khai báo. Trong trường hợp này biến sẽ được khởi tạo và nhận
một giá trị mặc định. Tuy nhiên, nếu lạm dụng điều này, rất có thể sẽ làm cho chương
trình khó quản lý và dễ nhầm lẫn, vì thế VBA IDE cung cấp tùy chọn này để cho phép
người dùng thiết lập tính năng kiểm soát quá trình khai báo biến. Khi tùy chọn này được
kích hoạt, tất cả các biến đều phải khai báo trước khi sử dụng và VBA IDE sẽ tự động
thêm vào đầu của mỗi mô-đun dòng lệnh “Option Explicit”.
Hình III-3: VBA IDE tự động thông báo lỗi khi biến được sử dụng mà chưa khai báo
3. Tính năng gợi nhớ và tự hoàn thiện mã lệnh
Mã lệnh, thông thường là một tập hợp bao gồm các từ khóa, câu lệnh, tên biến hay toán tử được
sắp xếp theo một trật tự nhất định. Tên của các thành phần này có thể khó nhớ chính xác hoặc
quá dài, cho nên VBA IDE đưa ra tính năng này bằng cách hiển thị những thành phần có thể
phù hợp với vị trí dòng lệnh đang soạn thảo trong một danh sách và sẽ tự động điền vào chương
trình theo lựa chọn của người dùng (bấm phím Tab). Để kích hoạt tính năng này, trong
VBAIDE, chọn trình đơn Tools Ö Options Ö Editor.
Hình III-4: Bật / tắt trợ giúp hoàn thiện mã lệnh tự động trong VBA IDE
26
CHƯƠNG III: CƠ BẢN VỀ NGÔN NGỮ LẬP TRÌNH VISUAL BASIC
Ý nghĩa của các tùy chọn này như sau:
Ø Tự động hiển thị danh sách các thành phần của đối tượng (Auto List Member): Với tùy
chọn này, khi một đối tượng của ứng dụng nền hay của chương trình được gọi ra để sử
dụng thì một danh sách các thành phần của nó (bao gồm các phương thức và thuộc tính)
sẽ được tự động hiển thị để người dùng chọn, sau khi bấm phím Tab, tên của thành phần
này sẽ được tự động điền vào vị trí thích hợp trong dòng lệnh.
Hình III-5: Danh sách các thành phần được tự động hiển thị.
Ø Tự động hiển thị cú pháp cho chương trình con (Auto Quick Info): Với tùy chọn này,
VBA IDE sẽ hiển thị những thông tin về tham số của một hàm hay thủ tục (đã được xây
dựng từ trước) khi người dùng sử dụng nó. Các thông tin này bao gồm tên của tham số
cùng với kiểu của nó.
Hình III-6: Tự động hiển thị thông tin của các tham số trong chương trình con.
Ø Tự động hiển thị giá trị của biến (Auto Data Tips): Với tùy chọn này, trong chế độ gỡ rối
(Break mode), giá trị của biến (được gán trong quá trình chạy của chương trình) sẽ được
hiển thị khi người dùng đặt chuột tại vị trí biến.
Ngoài ra, nếu những tính năng trợ giúp trên chưa được kích hoạt, trong quá trình viết mã lệnh,
người dùng có thể kích hoạt tạm thời chúng bằng cách nhấn tổ hợp phím Ctrl + Space. Cần
chú ý rằng, khi danh sách trợ giúp hiện ra, người dùng có thể sử dụng chuột hoặc phím mũi tên
để lựa chọn mục cần sử dụng trong danh sách đó rồi bấm phím Tab để xác nhận.
4. Từ khoá trong VB
Từ khoá là tập hợp các từ cấu thành một ngôn ngữ lập trình. Mỗi ngôn ngữ lập trình đều có một
bộ từ khoá riêng, dưới đây là danh sách các từ khoá trong ngôn ngữ lập trình VB:
27
As
For
Mid
Print
String
Binary
Friend
New
Private
Then
ByRef
Get
Next
Property
Time
ByVal
Input
Nothing
Public
To
Date
Is
Null
Resume
True
Else
Len
On
Seek
WithEvents
Empty
Let
Option
Set
Error
Lock
Optional
Static
False
Me
ParamArray
Step
Các từ khóa là những từ được dùng riêng cho những chức năng khác nhau trong ngôn ngữ lập
trình, ví dụ từ khóa “Private” hạn chế phạm vi sử dụng của biến hay chương trình con. Do đó
việc đặt tên (biến, chương trình con) bắt buộc phải khác so với các từ khóa, nếu không sẽ phát
sinh lỗi cú pháp.
Hình III-7: VBA IDE báo lỗi do tên biến trùng tên với từ khóa
5. Các kiểu dữ liệu cơ bản
Khi một chương trình vận hành, nó sẽ tác động và làm thay đổi giá trị của một vài thông số
trong chương trình, ví dụ trong chương trình giải phương trình bậc 2, các thành phần trong
phương trình: y=ax2+bx+c sẽ cần thay đổi giá trị khi chương trình hoạt động. Như vậy giá trị
của các thông số này có nhu cầu thay đổi trong những lần hoạt động khác nhau của chương
trình cũng như trong một lần hoạt động nào đó, ví dụ giá trị của y sẽ thay đổi khi ta thay đổi giá
trị của a trong phương trình trên. Chính bởi nhu cầu thay đổi giá trị này mà người ta đưa khái
niệm “biến” để mô tả sự “động” của những thông số này. Với mỗi biến, giá trị của nó luôn
được quy định là phải thuộc một kiểu dữ liệu nào đó, ví dụ giá trị của y trong phương trình trên
phải là kiểu số thực. Do ngôn ngữ lập trình được thiết kế để thực hiện nhiều nhiệm vụ khác
nhau cho nên trong ngôn ngữ lập trình nào cũng luôn có nhiều kiểu dữ liệu để thích ứng với
nhu cầu đa dạng của việc lập trình.
Kiểu dữ liệu là loại giá trị mà một biến có thể nhận, nói cách khác, khi một biến được khai báo
thì ta buộc phải gán cho nó một kiểu dữ liệu nhất định. Về tổng thể có thể chia các kiểu dữ liệu
trong VB ra làm hai loại:
28
CHƯƠNG III: CƠ BẢN VỀ NGÔN NGỮ LẬP TRÌNH VISUAL BASIC
Ø Các kiểu dữ liệu được định nghĩa sẵn trong VB: là những kiểu dữ liệu cơ bản và thường
gặp như kiểu số thực (Double), số nguyên (Integer), Chuỗi (String)...
Ø Các kiểu dữ liệu do người dùng tự định nghĩa: là kiểu dữ liệu được tự xây dựng dựa trên
những thành phần dữ liệu cơ bản trong VB. Cách xây dựng kiểu dữ liệu này được đề cập
trong phần dưới.
5.1. Kiểu logic (boolean)
Chỉ chứa hai giá trị TRUE và FALSE (đúng và sai). Khi chuyển từ các dữ liệu dạng số sang
kiểu logic, 0 sẽ được chuyển thành FALSE còn giá trị khác sẽ được chuyển thành TRUE. Khi
chuyển từ kiểu logic sang kiểu số, giá trị FALSE sẽ được chuyển thành 0 còn giá trị TRUE sẽ
được chuyển thành -1.
‘Khai báo biến A là kiểu logic
Dim A As Boolean
Biến A lúc này chỉ có thể nhận cặp giá trị: True hay False.
5.2. Kiểu số nguyên
Dùng để chứa các giá trị là số nguyên và có vài loại dữ liệu kiểu này. Sự khác nhau của những
loại dữ liệu này là giới hạn giá trị (lớn nhất và nhỏ nhất) mà biến có thể nhận được (tham khảo
bảng dưới).
Kiểu số nguyên
Kích thước
Phạm vi
Byte
1 byte
0 đến 255
Integer
2 bytes
-32,768 đến 32,767
Long
4 bytes
-2,147,483,648 đến 2,147,483,647
5.3. Kiểu số thực
Dùng để chứa các giá trị là số thực. Các kiểu số thực thường dùng được trình bày trong bảng
dưới đây:
Kiểu số thực
K.thước
Phạm vi
Single
4 byte
Từ
-3.402823E38
đến
và từ 1.401298E-45 đến 3.402823E38
Double
8 bytes
-1.79769313486231E308
đến
-4.94065645841247E-324
và từ 4.94065645841247E-324 đến 1.79769313486232E308
Currency
8 bytes
Từ -922,337,203,685,477.5808 đến 922,337,203,685,477.5807
-1.401298E-45
5.4. Kiểu mảng (array)
Khi gặp trường hợp phải sử lý một loạt các biến tương tự như nhau, ví dụ các phần tử của một
ma trận, nếu ta phải đặt tên khác nhau cho tất cả các biến này thì rất bất tiện, thay vào đó ta có
thể dùng kiểu mảng để đặt tên chung cho cả nhóm các phần tử đó và khi nào cần sử dụng từng
phần tử ta sẽ gọi tên theo chỉ số của chúng trong mảng.
‘Khai báo mảng
Dim Matrix_1(10) As Double
Mảng Matrix_1 trên có 11 phần tử liên tục được đánh số từ 0 đến 10 (ma trận có 1 hàng và 11
cột). Khi sử dụng ta chỉ việc gọi phần tử cần dùng theo chỉ số tương ứng.
29
‘Gán giá trị 100 cho phần tử thứ 2
Matrix_1(1)=100
‘Gán giá trị 100 cho phần tử cuối cùng
Matrix_1(10)=100
Ta cũng có thể cố định phạm vi chỉ số của mảng bằng cách khai báo như sau:
‘Khai báo mảng
Dim Matrix_2(1 To 10) As Double
Lúc này chỉ số của mảng Matrix_2 sẽ bắt đầu từ 1 và mảng này có 10 phần tử.
‘Gán giá trị 200 cho phần tử thứ 2
Matrix_2(2)=200
‘Gán giá trị 200 cho phần tử cuối cùng
Matrix_2(10)=200
Ví dụ sau khai báo và sử dụng (gán giá trị cho phần tử) một ma trận 3 hàng 5 cột
‘Khai báo mảng (3x5)
Dim Matrix_3(1 To 3, 1 To 5) As Double
‘Gán giá trị 100 cho phần tử tại hàng thứ 2 cột thứ 3
Matrix_3(2,3)=100
Trong VB, mảng có thể có một chiều hoặc nhiều chiều, kích thước của mảng được xác định
dựa trên số chiều và biên trên, biên dưới của mỗi chiều. Các thành phần trong mảng là liên tục
giữa hai biên.
Trong các ví dụ trên, các mảng có kích thước (hay số lượng phần tử) là không thay đổi trong
suốt quá trình hoạt động của chương trình. Người ta gọi loại mảng này là mảng tĩnh và thường
được dùng cho những bài toán biết trước số phần tử của mảng hay kích thước mảng không lớn.
Ngoài loại mảng tĩnh này, trong VB còn cho phép định nghĩa một loại mảng khác mà kích
thước (hay số lượng phần tử) của nó có thể thiết lập lại ngay trong lúc chương trình đang hoạt
động, người ta gọi loại mảng này là mảng động. Với mảng động, người lập trình không cần biết
số phần tử của mảng trong lúc lập trình, số phần tử này sẽ được thiết lập trong quá trình chương
trình hoạt động dựa theo nhu cầu của từng bài toán cụ thể.
Khi một mảng động, mà các phần tử của nó đã được gán giá trị, cần thay đổi kích thước, sẽ có
hai tình huống cần xét đến:
Ø Toàn bộ giá trị ban đầu (trước lúc thay đổi kích thước mảng) sẽ bị hủy bỏ, các phần tử
mảng mới (sau khi thay đổi kích thước) sẽ nhận giá trị mặc định.
‘ Khai báo mảng A là mảng động
Dim A() As Long
‘ Xác định kích thước cho mảng động A: mảng 1 chiều có 5 phần tử
Redim A(1 to 5) As Long
‘ Gán giá trị cho phần tử của mảng A
A(1) = 100: A(2) = 200
‘ Định lại kích thước cho mảng A: mảng hai chiều với 3x3=9 phần tử
Redim A(1 to 3, 2 to 4) as Long
Sau dòng cuối cùng này, toàn bộ giá trị của mảng A cũ (có A[1]=100 và A[2]=200) sẽ bị
xóa bỏ và tất cả các phần tử mới của mảng A (9 phần tử) sẽ nhận giá trị mặc định (thường
được gán bằng 0).
Ø Giá trị cũ của các phần tử mảng sẽ được giữ lại khi cả hai điều kiện sau thỏa mãn:
30
CHƯƠNG III: CƠ BẢN VỀ NGÔN NGỮ LẬP TRÌNH VISUAL BASIC
Sử dụng lệnh ReDim với từ khóa Preserve.
Sự thay đổi kích thước mảng chỉ được thực hiện ở biên trên của chiều cuối cùng của
mảng, nghĩa là các phần tử cần giữ lại giá trị có chỉ số không đổi ngay cả khi mảng
được định lại kích thước.
‘Khai báo mảng động A
Dim A() As Long
‘Gán kích thước cho mảng A
ReDim A(1 To 3, 1 To 3) As Long
‘Gán giá trị cho phàn tử của mảng A
A(1,1) = 100: A(1,2) = 200
A(2,1) = 150: A(2,2) = 250
‘Định lại kích thước cho mảng A, giữ lại giá trị ban đầu
‘của các phần tử, lưu ý đến phạm vi của mảng mới
ReDim Preserve A(1 To 3, 1 To 5) As Long
Hình III-8: Các phần tử có thể giữ lại giá trị ban đầu và các phạm vi có thể thay đổi kích
thước của mảng động
Trong ví dụ trên, các phần tử của mảng A được giữ lại giá trị sau khi kích thước của mảng
được thay đổi lại. Lưu ý, ta chỉ có thể giữ lại giá trị của mảng ban đầu khi sự mở rộng được
thực hiện ra biên cuối cùng của nó như hình trên.
5.5. Kiểu chuỗi (String)
Chuỗi là một hàng bao gồm các ký tự liên tục nhau, các ký tự ở đây rất đa dạng: có thể là chữ
số, chữ cái, dấu cách (space), ký hiệu. Số lượng ký tự trong một chuỗi là rất lớn (216 ký tự).
Mặc định trong VB, các biến hay tham số kiểu chuỗi có chiều dài thay đổi tùy theo giá trị dữ
liệu được gán cho nó.
Dim S As String
S=”ABCD 1234 @#$%”
Để tạo điều kiện thuận lợi cho người dùng, bên trong VB có sẵn một số hàm liên quan đến xử
lý chuỗi, ví dụ như cắt chuỗi, tách chuỗi, ghép chuỗi, tìm kiếm, … Các hàm cơ bản này được
trình bày ở phần sau trong giáo trình này hoặc có thể tra cứu toàn bộ các hàm liên quan trong
MSDN (Microsoft Developer Network) hoặc Object Browser (thư viện Strings) bằng cách nhấn
phím F2 trong giao diện lập trình VBA IDE
31
Hình III-9: Thông tin về các hàm trong thư viện lập trình của VBA được hiển thị trong
Object Browser
5.6. Kiểu thời gian (Date)
Dùng để lưu trữ và thao tác trên các giá trị thời gian (ngày và giờ). Định dạng ngày và giờ phụ
thuộc vào các thiết lập về hiển thị trong hệ thống của người dùng. Khi chuyển từ các dữ liệu
kiểu số sang kiểu ngày tháng, các giá trị ở bên trái dấu phẩy chuyển thành thông tin về ngày
còn giá trị ở bên phải dấu phẩy sẽ được chuyển thành thông tin về giờ.
Dim D As Date
Dim S As String
D = Now()
S = "Ngay: " & Day(D) & " - Thang: " & Month(D) & " - Nam: " & Year(D)
Debug.Print (S)
Ví dụ trên sẽ hiển thị thông tin về thời gian (ngày – tháng – năm) trong cửa sổ Immediate của
VBA IDE.
5.7. Kiểu Variant
Kiểu Variant là một kiểu dữ liệu đặc biệt có thể chứa tất cả các loại dữ liệu, ngoại trừ kiểu
chuỗi có chiều dài cố định. Kiểu Variant cũng có thể chứa các giá trị đặc biệt như Empty,
Error, Nothing và Null.
Tuy kiểu dữ liệu Variant có vẻ tiện dụng nhưng khi sử dụng một cách quá thoải mái thì nguy cơ
gây lỗi của loại biến này là rất lớn, đặc biệt khi thao tác với các toán tử.
Dim V As Variant
‘ Gán biến V với
V = “String”
‘ Gán biến V với
V = 16
‘ Gán biến V với
V = True
‘ Gán biến V với
V = #01/06/2007#
32
một chuỗi
một số
giá trị kiểu logic
một dữ liệu kiểu thời gian
CHƯƠNG III: CƠ BẢN VỀ NGÔN NGỮ LẬP TRÌNH VISUAL BASIC
Sử dụng hàm VarType(vVariant) sẽ cho ta mã của kiểu dữ liệu hiện đang lưu trữ trong biến
Variant.
Giá trị VarType
Chú thích
0-vbEmpty
Không có gì trong variant
1-vbNull
Không có dữ liệu hợp lệ trong variant
2-vbInteger
Variant chứa Integer
4-vbSingle
Variant chứa Single
7-vbDate
Variant chứa Date/Time
8-vbString
Variant chứa String
9-vbObject
Variant chứa một Object
11-vbBoolean
Variant chứa Boolean
5.8. Kiểu tự định nghĩa (user-defined type)
Kiểu tự định nghĩa là kiểu dữ liệu do người dùng định nghĩa, tương tự như kiểu bản ghi
(Record) trong ngôn ngữ lập trình Pascal hay kiểu cấu trúc (Struct) trong ngôn ngữ lập trình
C. Kiểu tự định nghĩa bao gồm nhiều trường dữ liệu, mỗi trường dữ liệu có thể là các kiểu dữ
liệu cơ bản hoặc các kiểu tự định nghĩa khác.
Ví dụ, khi đo toàn đạc bằng máy kinh vĩ cơ, với mỗi điểm đo ta cần lưu lại các thông tin sau:
Ký hiệu
Ý nghĩa
Kiểu giá trị
TrM
Số hiệu trạm đặt máy
Integer
STT
Thứ tự của điểm đo
Integer
DT
Số đọc dây trên
Double
DG
Số đọc dây giữa
Double
DD
Số đọc dây dưới
Double
H
Góc bằng
Double
V
Góc đứng
Double
MT
Mô tả đặc điểm của điểm đo
String
Với một chương trình xử lý số liệu đo toàn đạc, cách tốt nhất là quản lý theo điểm đo, và do đó
mỗi điểm đo là một biến có kiểu dữ liệu phù hợp với bảng trên. Đó chính là kiểu dữ liệu tự định
nghĩa.
‘Định nghĩa kiểu dữ liệu cho điểm đo toàn đạc
Type DiemDo
TrM As Integer
33
STT As Integer
DT As Double
DG As Double
DD As Double
H As Double
V As Double
MT As String
End Type
Sau khi định nghĩa kiểu dữ liệu DiemDo xong, ta có thể sử dụng nó như những kiểu dữ liệu
thông thường khác.
‘Khai báo biến sử dụng kiểu dữ liệu tự định nghĩa
Dim P1 As DiemDo
Dim P_Array(1 to 1000) As DiemDo
With P1
.TrM = 1
.STT = 1
.DT = 2130
.DG = 2120
.DD = 2110
.H = 130.5
.V = 78.25
.MT = “Goc nha C4”
End With
P_Array(1) = P1
Từ khóa: With … End With dùng để tránh phải nhập lại nhiều lần tên biến kiểu dữ liệu tự
định nghĩa. Dấu chấm ( . ) được sử dụng để thao tác với các thành phần bên trong của biến có
kiểu dữ liệu tự định nghĩa. Ví dụ sau là tương đương với ví dụ trên, nhưng không sử dụng cặp
từ khóa With … End With, chú ý là dấu chấm ( . ) luôn có:
‘Khai báo biến sử dụng kiểu dữ liệu tự định nghĩa
Dim P1 As DiemDo
Dim P_Array(1 to 1000) As DiemDo
P1.TrM = 1
P1.STT = 1
P1.DT = 2130
P1.DG = 2120
P1.DD = 2110
P1.H = 130.5
P1.V = 78.25
P1.MT = “Goc nha C4”
P_Array(1) = P1
5.9. Kiểu lớp (Class)
Kiểu lớp (Class) là một mở rộng của kiểu dữ liệu tự định nghĩa, sự khác biệt cơ bản ở đây là
trong kiểu lớp còn có những đoạn chương trình dùng để xử lý chính những dữ liệu trong nó. Dữ
liệu bên trong lớp thường được gọi là các thuộc tính (Properties), còn những đoạn chương
trình trong lớp để xử lý dữ liệu này thực chất là các Hàm / Thủ tục (Function / Sub) được định
nghĩa bên trong lớp và thường được gọi là các Phương thức (Methods). Một biến có kiểu dữ
liệu là lớp được gọi là một đối tượng (Object) và cách sử dụng các Properties, Methods của đối
tượng này tương tự như cách sử dụng các thành phần của kiểu dữ liệu tự định nghĩa.
Lớp cần được xây dựng trong Class Module hoặc ta có thể sử dụng lại các lớp sẵn có từ các thư
viện lập trình.
34
CHƯƠNG III: CƠ BẢN VỀ NGÔN NGỮ LẬP TRÌNH VISUAL BASIC
Như vậy lớp có thể gồm các thành phần sau:
Ø Các thuộc tính (Property): là các dữ liệu mô tả trạng thái của bản thân đối tượng hoặc
các quan hệ của nó với các đối tượng khác.Về bản chất, thuộc tính là các biến được khai
báo trong lớp đó. Kiểu dữ liệu của các thuộc tính có thể là các kiểu dữ liệu cơ bản hoặc
có thể là một lớp khác (kiểu Class).
Ø Các phương thức (Method): mô tả hành vi, chức năng của đối tượng. Về bản chất,
phương thức là các chương trình con được xây dựng bên trong lớp và chúng có nhiệm vụ
xử lý các dữ liệu của chính lớp đó.
Ø Các sự kiện (Event): Sự kiện giúp cho lớp có khả năng giao tiếp với các lớp khác hoặc
với môi trường ngoài.
Trong khuôn khổ của giáo trình này, các vấn đề liên quan đến xây dựng lớp sẽ không được đề
cập chi tiết. Tuy nhiên nếu ai quan tâm có thể tìm hiểu thêm trong giáo trình “Lập trình hướng
đối tượng trong xây dựng” của bộ môn Tự động hóa thiết kế Cầu đường.
6. Khai báo biến trong VB
Trong VB, muốn sử dụng một biến có thể không cần khai báo, tuy nhiên cách làm này chỉ nên
dùng khi viết các chương trình nhỏ, còn đối với các chương trình lớn, có nhiều mô-đun, thì nên
bắt buộc khai báo biến trước khi sử dụng (theo cách thiết lập ở mục 2 của chương này).
Khai báo biến, về thực chất, chính là việc tạo mã lệnh (lập trình) cho nên các đoạn mã lệnh khai
báo biến có thể đặt ở bất cứ thành phần nào trong dự án VBA (mô-đun chuẩn, mô-đun lớp, và
Userform). Tùy theo nhu cầu sử dụng biến mà người ta giới hạn phạm vi sử dụng của biến đó
sao cho việc lập trình được thuận tiện nhất dựa trên những nguyên tắc sau:
Ø Khi biến khai báo trong chương trình con nào thì phạm vi sử dụng của nó được giới hạn
trong chính chương trình con đó. Biến loại này được gọi là biến cục bộ.
Hình III-10: Phạm vi sử dụng của biến được khai báo trong chương trình con
Ø Nếu biến được khai báo ở cấp mô-đun và biến được khai báo trong chương trình con có
tên trùng nhau thì ở bên trong chương trình con, biến được sử dụng là biến được khai báo
bên trong nó. Ta xét ví dụ sau:
Option Explicit
Dim a As Double, b As Double
Public Sub Test1()
a = 100 : b = 200
35
End Sub
Public Sub Test2()
Dim a As Double,
Test1
c = a + b
Debug.Print "a =
Debug.Print "b =
Debug.Print "c =
End Sub
c As Double
"; a;
"; b;
"; c;
Biến a và b được khai báo ở cấp mô-đun, nghĩa là mọi chương trình con trong mô-đun này đều
có thể sử dụng và tác động lên chúng. Giá trị của a và b được gán trong chương trình con Test1.
Trong chương trình con Test2 một biến a khác được khai báo (trùng tên với biến a của môđun), và giá trị khởi tạo của nó bằng 0. Kết quả chạy chương trình con Test2 như sau:
Hình III-11: Mức độ ưu tiên trong sử dụng biến
Ø Sử dụng từ khóa Public để xác định phạm vi sử dụng biến là trong toàn bộ dự án, nghĩa
là từ bất cứ nơi đâu trong dự án (mô-đun chuẩn, mô-đun lớp, và Userform) đều có thể sử
dụng biến này. Biến được khai báo với từ khóa Public thường được gọi là biến toàn
cục. Trong mô-đun nào đó, nếu một biến được khai báo với từ khóa Dim, thì mặc định,
biến đó là biến cục bộ, nghĩa là tương đương với việc sử dụng từ khóa Private.
CHÚ Ý Không sử dụng các từ khoá Public,Private hay Friend cho khai báo dữ liệu
nằm bên trong chương trình con.
Hình III-12: Phạm vi sử dụng biến toàn cục
Ở mức độ rộng hơn, có thể coi biến như một khối dữ liệu của chương trình và mức độ
toàn cục được chia làm hai loại như sau:
36
CHƯƠNG III: CƠ BẢN VỀ NGÔN NGỮ LẬP TRÌNH VISUAL BASIC
Toàn cục ở mức ứng dụng: Trong trường hợp ứng dụng gồm nhiều dự án (multiprojects), nếu trong một mô-đun không có khai báo lựa chọn Option Private
Module thì tất cả các thành phần dữ liệu hay chương trình được khai báo Public trong
mô-đun đó có phạm vi hoạt động toàn bộ ứng dụng – nghĩa là chúng còn có thể được
tham chiếu từ những dự án khác trong ứng dụng.
Toàn cục ở mức dự án: Trong trường hợp ứng dụng gồm nhiều dự án (multi-projects),
nếu trong một mô-đun có khai báo lựa chọn Option Private Module thì tất cả các
thành phần dữ liệu hay chương trình được khai báo Public trong mô-đun đó chỉ có
phạm vi hoạt động trong nội bộ dự án chứa mô-đun mà không thể được tham chiếu từ
những dự án khác trong ứng dụng.
Hình III-13: Khai báo tùy chọn phạm vi biến ở mức dự án.
Ø Sử dụng từ khóa Private để xác định phạm vi hoạt động của biến là trong nội bộ của
mô-đun đó, tất cả các chương trình con hay bất cứ thành phần nào của mô-đun này đều có
thể sử dụng biến loại này nhưng chúng không thể truy cập được từ những mô-đun hay
Userform khác trong dự án.
Hình III-14: Phạm vi sử dụng của biến tương ứng với từ khóa Public và Private.
CHÚ Ý Khi khai báo kiểu dữ liệu người dùng tự định nghĩa hoặc các chương trình con
trong một mô-đun, nếu không chỉ rõ phạm vi hoạt động thì pham vi hoạt động mặc định là
Public.
Để tránh các nhầm lẫn do không nhớ phạm vi hoạt động mặc định, người dùng nên chỉ rõ
phạm vi hoạt động của chương trình hay dữ liệu ngay khi khai báo.
Ø Ngoài ra, trong các mô-đun lớp (Class Module) hoặc mô-đun lệnh của UserForm còn có
thể sử dụng từ khóa Friend để xác định phạm vi hoạt động của một chương trình con
(phương thức). Khi sử dụng từ khóa này, chương trình con có thể được truy xuất từ mọi
nơi trong nội bộ dự án (Project) chứa nó nhưng không thể được truy xuất trong những dự
án khác của ứng dụng (khác với khi dùng từ khóa Public – chương trình con có thể được
truy xuất từ mọi nơi của ứng dụng).
37
CHÚ Ý Các khai báo dữ liệu với các từ khoá trên được thực hiện trong phần General của
một mô-đun. Các dữ liệu đó còn được gọi là dữ liệu cấp mô-đun (module level).
Trong mỗi mô-đun, phần đầu tiên (của phần viết mã lệnh) được gọi là phần General của
mô-đun đó. Theo quy ước, các thiết lập cho mô-đun được đặt ở đây và VBA IDE sẽ tự
động phân cách phần này. Không có giới hạn về kích thước cho phần này.
Hình III-15: Phần General trong mô-đun
6.1. Khai báo hằng số
Hằng số là một loại biến đặc biệt mà giá trị của nó được xác định ngay lúc khai báo và luôn
không thay đổi. Ta nên dùng cách này cho những hằng số hay phải dùng lặp lại trong chương
trình, ví dụ như hằng số π = 3.14159. Sau khi khai báo hằng số này:
Const Pi=3.14159
ta luôn có thể sử dụng giá trị 3.14159 bất cứ chỗ nào trong chương trình với cái tên dễ nhớ hơn
là Pi.
Cú pháp:
[Public/ Private] Const <tên_hằng>=<giá_trị_hằng_số>
Các từ khoá Public hay Private xác định phạm vi hiệu lực của hằng số, với từ khoá
Public, hằng số này có thể sử dụng ở bất cứ đâu trong ứng dụng, còn với từ khoá Private thì
hằng số này chỉ có thể sử dụng bên trong mô-đun nơi khai báo hằng số đó. Ý nghĩa của hai từ
khóa này cũng không thay đổi cho tất cả các phần khác mà có sử dụng chúng.
6.2. Khai báo biến
Cú pháp:
Dim <tên_biến> as <Kiểu_dữ_liệu>
Khi dùng từ khóa Public hay Private nhằm xác định phạm vi hiệu lực của biến thay cho từ
khóa Dim trong khai báo biến thì cú pháp như sau:
Public <tên_biến> as <Kiểu_dữ_liệu>
Hay:
38
CHƯƠNG III: CƠ BẢN VỀ NGÔN NGỮ LẬP TRÌNH VISUAL BASIC
Private <tên_biến> as <Kiểu_dữ_liệu>
6.3. Khai báo kiểu tự định nghĩa
Trong VB có thể khai báo các kiểu dữ liệu theo nhu cầu của người sử dụng. Cú pháp khai báo
như sau:
Type <Tên_ kiểu>
<tên_trường_1> as <Kiểu_dữ_liệu>
<tên_trường_2> as <Kiểu_dữ_liệu>
…
<tên_trường_n> as <Kiểu_dữ_liệu>
End Type
Sau khi khai báo kiểu tự định nghĩa, người dùng có thể sử dụng các biến có kiểu tự định nghĩa
bằng cách khai báo như các biến thông thường, với <Kiểu_dữ_liệu> được thay bằng
<Tên_kiểu>. Để truy cập tới một trường của biến kiểu bản ghi, dùng toán tử (.) hoặc dùng cặp
từ khóa With… End With.
CHÚ Ý Các từ khoá Public hay Private nhằm xác định phạm vi hoạt động của kiểu
dữ liệu được khai báo. Đồng thời khai báo kiểu chỉ được thực hiện ở cấp mô-đun (không
thực hiện được trong các chương trình con). Khi không chỉ rõ thì phạm vi hoạt động thì
mặc định của một kiểu dữ liệu tự định nghĩa là Public.
6.4. Khai báo mảng tĩnh
Cú pháp:
[Public/Private/Dim] <tên_mảng> (<thông_số_về_chiều>) as <tên_kiểu>
Các thông số về chiều có thể biểu diễn qua các ví dụ sau:
Dim a(3 To 5) As Integer ‘ Mảng 1 chiều với các chỉ số từ 3 đến 5
Dim A(3) As Long ‘ Mảng 1 chiều với chỉ số đến 3 (mảng 1 chiều có 4
phần tử với chỉ số từ 0 đến 3)
Dim A(2 To 4, 6) As Double ‘ Mảng 2 chiều với một miền chỉ số từ 2 tới
4 và một miền có chỉ số từ 0 đến 6.
GỢI Ý Các từ khoá Public hay Private xác định phạm vi hoạt động của biến mảng (trong
trường hợp mảng được khai báo mức mô-đun). Các qui định về phạm vi hoạt động của
mảng tương tự với biến thông thường - đã được trình bày ở phần trước.
6.5. Khai báo mảng động
Cú pháp:
39
[Public/ Private/ Dim] <tên_mảng> () as <tên_kiểu>
Trong khai báo trên không chứa các thông số về chiều và đó thuần túy chỉ là một khai báo. Các
phần tử của mảng chưa được tạo ra (hay nói cách khác mảng vẫn chưa thực sự được cấp phát
bộ nhớ) và vẫn chưa sẵn sàng để sử dụng. Trước khi sử dụng mảng động hoặc khi muốn thay
đổi kích thước của mảng, sử dụng lệnh Redim. Cú pháp như sau:
Redim <tên_mảng> (<các thông số về chiều>) as <tên kiểu>
Chú ý rằng <tên_kiểu> phải đúng như khai báo ban đầu, các thông số về chiều có thể khác
trước cả về số chiều và kích thước của từng chiều. Khi đó, các dữ liệu cũ trong mảng không
còn nữa, thay vào đó là những phần tử mới được khởi tạo.
6.6. Khai báo, tạo và làm việc với biến đối tượng
Khai báo và tạo biến đối tượng phải dùng thêm từ khóa New
Dim <tên_biến> as New <Kiểu_dữ_liệu>
<Kiểu_dữ_liệu> là lớp (class) đã được định nghĩa từ trước.
Phép gán đối tượng được thực hiện với từ khóa Set
Set <biến_đối_tượng> = <giá_trị>
Chú ý rằng nếu thực hiện khai báo một biến đối tượng như thông thường (không có từ khóa
New) thì biến thực sự chưa được tạo ra. Trong trường hợp đó, người sử dụng phải tạo và gán đối
tượng với các từ khoá tương ứng là New và Set.
Dim <tên_biến> as <Kiểu_dữ_liệu>
Set <tên_biến> = New <Kiểu_dữ_liệu>
CHÚ Ý Câu lệnh Set không phải là câu lệnh khai báo, vì vậy nó phải được viết trong
một chương trình con nào đó chứ không thể nằm trong phần General của một mô-đun.
Làm việc với một biến đối tượng tức là quá trình thao tác với đối tượng thông qua các thuộc
tính, phương thức và các sự kiện của đối tượng đó. Để truy cập tới các thuộc tính và phương
thức của đối tượng ta sử dụng theo cú pháp sau, chú ý đến dấu chấm ( . ) giữa tên biến và tên
thuộc tính hay tên phương thức:
<Tên_biến>.<Tên_thuộc_tính>
<Tên_biến>.<Tên_phương_thức> <(tham_số_của_phương_thức)>
7. Các toán tử và hàm thông dụng
7.1. Các toán tử
Toán tử được sử dụng cho mục đích xử lý dữ liệu. Ta sử dụng các toán tử để thực hiện tính
toán, so sánh, gán và thực hiện nhiều thao tác khác. Dưới đây là danh sách và ý nghĩa của một
số toán tử thông dụng:
40
CHƯƠNG III: CƠ BẢN VỀ NGÔN NGỮ LẬP TRÌNH VISUAL BASIC
Toán tử
Mô tả
Toán tử gán
=
Gán giá trị cho biến hoặc thuộc tính
Toán tử toán học
+
Cộng
-
Trừ
*
Nhân
/
Chia
\
Chia lấy phần nguyên
Mod
Chia lấy phần dư
^
Luỹ thừa
Toán tử logic
Not
Trả về giá trị phủ định với giá trị biểu thức. Not(TRUE)=FALSE
And
Nối logic hai biểu thức. (TRUE And TRUE)=TRUE; các trường hợp khác cho kết quả
bằng FALSE
Or
(FALSE or FALSE)=FALSE; các trường hợp khác cho kết quả là TRUE
Xor
Cho kết quả TRUE nếu hai đối số có cùng giá trị; ngược lại cho kết quả là FALSE
Eqv
So sánh hai giá trị logic; cách thức xử lý tương tự như toán tử Xor
Toán tử so sánh
=
So sánh bằng
<>
Khác nhau
>
Lớn hơn
>=
Lớn hơn hoặc bằng
<
Nhỏ hơn
<=
Nhỏ hơn hoặc bằng
7.2. Các hàm toán học
Các hàm toán học được chứa trong thư viện Math (có thể tra cứu thư viện này bằng Object
Browser) và có nhiệm vụ thực hiện các phép toán thông thường hay gặp. Sau đây là một số
hàm thông dụng:
Hàm
Mô tả
Abs(x)
Lấy giá trị tuyệt đối
Exp(x)
Lấy mũ cơ số tự nhiên
Log(x)
Logarit cơ số tự nhiên
Sqr(x)
Lấy bình phương
Cos(x), Sin(x), Tan(x)
Hàm lượng giác
Atn(x)
Hàm lượng giác ngược
Fix(x)
Láy phần nguyên (trước dấu phẩy). Fix(3.7)=3
Int(x)
Lấy phần nguyên đã được làm tròn. Int(3.7)=4
Round(x,num)
Làm tròn số thực <x> đến <num> chữ số sau dấu phẩy
41
Val(str)
Chuyển đổi chuỗi <str> thành giá trị kiểu số
7.3. Các hàm chuyển đổi dữ liệu
Chuyển đổi định dạng số liệu là một nhu cầu thường gặp trong lập trình do các ngôn ngữ lập
trình luôn đòi hỏi kiểu dữ liệu phải rõ ràng và cố định cho từng biến nhằm tránh phát sinh các
lỗi sau này. Việc chuyển đổi này, nếu trong trường hợp thông thường , thì VB sẽ tự động thực
hiện. Nhưng khi gặp các yêu cầu đặc biệt thì buộc người dùng phải sử dụng những hàm chuyển
đổi phù hợp.
CHÚ Ý Việc chuyển đổi kiểu dữ liệu luôn có thể tạo ra lỗi do không thể chuyển đổi được
hoặc phát sinh kết quả sai. Cho nên khi sử dụng cần chú ý đến các khả năng gây lỗi của
việc chuyển đổi kiểu dữ liệu.
Các hàm này được chứa trong thư viện Conversion (có thể tra cứu thư viện này bằng Object
Browser). Sau đây là một số hàm thông dụng:
Hàm
Mô tả
CBool(Expression)
Chuyển đổi dữ liệu sang kiểu logic (Boolean)
CByte(Expression)
Chuyển đổi dữ liệu sang kiểu Byte
CInt(Expression)
Chuyển đổi dữ liệu sang kiểu nguyên (Integer)
CLng(Expression)
Chuyển đổi dữ liệu sang kiểu nguyên (Long)
CDbl(Expression)
Chuyển đổi dữ liệu sang kiểu thực (Double)
CSng(Expression)
Chuyển đổi dữ liệu sang kiểu thực (Single)
CStr(Expression)
Chuyển đổi dữ liệu sang kiểu xâu (String)
Str(Number)
Chuyển đổi dữ liệu số sang kiểu xâu (String)
Val(String As String)
Chuyển đổi dữ liệu từ String sang Double
Ví dụ:
Public Sub Test ()
Dim StrA as String
Dim A as Double
StrA=”1234”
A=Val(StrA) ‘ Kết quả A=1234
Debug.print A
A=4567
StrA=Str(A) ‘ Kết quả StrA=”4567”
Debug.Print StrA
End Sub
GỢI Ý Để có thể chạy thử các đoạn mã lênh trên, trong VBA IDE, trước hết cần tạo ra
một mô-đun trong dự án (nếu chưa có) sau đó tạo ra một chương trình con dạng Sub và
nhập đoạn mã lệnh cần thử vào chương trình con này. Đặt con trỏ soạn thảo mã lệnh ở
bất cứ dòng nào trong chương trình con đó và bấm phím F5 để chạy chương trình.
Kết quả như sau:
42
CHƯƠNG III: CƠ BẢN VỀ NGÔN NGỮ LẬP TRÌNH VISUAL BASIC
GỢI Ý Cửa sổ Immediate là một bộ phận trong VBA IDE, bật / tắt cửa sổ này được thực
hiện trong menu View của VBA IDE. Khi sử dụng lệnh Debug.Print <tên_biến> thì giá trị
của biến sẽ được thể hiện trong cửa sổ Immediate khi chương trình hoạt động và được lưu
lại ngay cả khi chương trình kết thúc. Cửa sổ này thường được dùng với mục đích gỡ rối
khi lập trình. Khi nội dung trong cửa sổ này nhiều quá thì ta có thể xóa bớt bằng cách
chọn vùng cần xóa và bấm phím Delete.
7.4. Các hàm xử lý chuỗi
Các hàm loại này được chứa trong thư viện Strings (có thể tra cứu thư viện này bằng Object
Browser). Sau đây là một số hàm thông dụng:
Hàm
Mô tả
Asc(x)
Trả về mã ASCII của ký tự đầu trong một chuỗi
Chr(x)
Chuyển đổi từ mã ASCII sang một ký tự
Left(String, Length as Long)
Trích dữ liệu bên trái của một chuỗi
Mid(String, Start As Long, [Length])
Trích dữ liệu phần giữa của một chuỗi
Right(String, Length As Long)
Trích dữ liệu phần bên phải của một chuỗi
Split(String)
Tách một chuỗi dài thành một mảng gồm nhiều chuỗi
nhỏ hơn
Joint(StringArray)
Gộp một mảng các chuỗi thành một chuỗi duy nhất
Len(String)
Trả về độ dài của chuỗi (số lượng ký tự trong chuỗi bao
gồm cả ký tự trống)
Ucase(String)
Hàm thực hiện đổi tất cả các ký tự trong chuỗi thành
chữ HOA.
InStr([start, ]string1, string2[, compare])
Trả về vị trí bắt đầu của chuỗi String2 trong chuỗi
String1.
Ví dụ:
Public Sub Test()
Dim StrArDes() As String
' Mảng các chuỗi được khai báo dạng mảng động
Dim StrScr As String 'Chuỗi ban đầu
StrScr = "Point1_23.5_4.5_44.8"
StrArDes = Split(StrScr, "_")
' Tách chuỗi StrScr thành một mảng các chuỗi và đưa vào StrArDes,
' kí tự ngăn cách là "_"
' Khi đó StrArDes(0)="Point1”, StrArDes(1)="23.5"
' StrArDes(2)="4.5", StrArDes(3)="44.8"
Debug.Print StrArDes(0), StrArDes(1), StrArDes(2), StrArDes(3)
End Sub
Kết quả sẽ như sau:
43
Lưu ý là dấu “_” trong ví dụ trên có thể thay thế bằng bất cứ ký tự nào.
CHÚ Ý Trong tất cả các ngôn ngữ lập trình, khái niệm chuỗi số và số là khác nhau. Ví dụ
khi gán A=”123” thì giá trị của A là một chuỗi ký tự gồm “1”, “2” và “3”. Còn khi gán
B=123 thì giá trị của B là một trăm hai mươi ba.
Để tạo ra một chuỗi có chứa dấu nháy kép (“) bên trong nó thì cần sử dụng thêm hai dấu
nháy kép nữa. Ví dụ, trong biểu thức sau: s = “ABC” “123” thì giá trị của biến s là:
ABC”123
8. Các cấu trúc điều khiển
8.1. Cấu trúc điều kiện
Các từ khóa: If, Then, Else, ElseIf, End If
Cú pháp:
If <biểu_thức_điều_kiện> then
Khối_lệnh
End If
Diễn giải tiến trình của cấu trúc điều kiện như sau: nếu <biểu_thức_điều_kiện> là đúng thì
chương trình sẽ thực hiện <khối_lệnh>, nếu sai thì chương trình sẽ thoát khỏi cấu trúc lệnh
này.
Sơ đồ khối của cấu trúc lệnh kiểu này có thể được biểu diễn như sau:
Dim A As Double
Dim B As Double
A = 20: B = 10
If A > B Then Debug.Print ("Hieu cua hai so A va B >0")
Kết quả như sau:
44
CHƯƠNG III: CƠ BẢN VỀ NGÔN NGỮ LẬP TRÌNH VISUAL BASIC
GỢI Ý Nếu như [khối_lệnh] có thể viết trên một dòng như ví dụ trên thì không dùng
từ khóa End If. Để phân tách nhiều lệnh trên cùng một dòng, sử dụng dấu hai chấm (:)
để ngăn cách giữa các lệnh.
Ngoài cấu trúc cơ bản và trường hợp riêng ở trên, trong nhiều trường hợp, ta buộc phải xử lý
khi <Biểu_thức_điều_kiện> trả về giá trị False (sai). Để giải quyết tình huống này ta sử
dụng cấu trúc điều kiện mở rộng như sau:
If <biểu_thức_điều_kiện>
Khối_lệnh_1
Else
Khối_lệnh_2
End If
Diễn giải tiến trình của cấu trúc lệnh này như sau: nếu <biểu_thức_điều_kiện> là đúng thì
chương trình sẽ thực hiện <khối_lệnh_1>, còn nếu không đúng thì chương trình sẽ thực hiện
<khối_lệnh_2>.
Sơ đồ khối của cấu trúc lệnh kiểu này có thể được biểu diễn như sau:
Các cấu trúc lệnh điều kiện có thể được lồng nhau để thể hiện những thao tác phức tạp hơn
bằng cách sử dụng thêm từ khoá ElseIf. Như vậy, cấu trúc điều kiện có cú pháp tổng quát như
sau:
If <điều_kiện_1> Then
[Khối_lệnh_1]
[ElseIf <điều_kiện_n> Then
[khối_lệnh_n]
...
[Else
[Khối_lệnh_2]]
End If
Trong khối cấu trúc này, khối lệnh [ElseIf <điều_kiện_n> Then có thể lặp lại nhiều lần
tương ứng với nhiều điều kiện khác nhau.
Diễn giải cấu trúc này như sau: nếu <điều_kiện_1> là đúng thì thực hiện [Khối_lệnh_1] và
thoát khỏi khối cấu trúc này, còn nếu sai thì sẽ kiểm tra lần lượt từng điều kiện của ElseIf
xem có giá trị nào đúng không, nếu không có giá trị nào đúng thì thực hiện [Khối_lệnh_2]
45
(sau từ khóa Else) và thoát khỏi cấu trúc này, còn nếu gặp một giá trị đúng đầu tiên của
<điều_kiện_n> nào đó thì khối lệnh tương ứng với ElseIf này sẽ được thực hiện và thoát
khỏi cấu trúc này.
If (TheColorYouLike = vbRed) Then
MsgBox "You 're a lucky person"
ElseIf (TheColorYouLike = vbGreen) Then
MsgBox "You 're a hopeful person"
ElseIf (TheColorYouLike = vbBlue) Then
MsgBox "You 're a brave person"
ElseIf (TheColorYouLike = vbMagenta) Then
MsgBox "You 're a sad person"
Else
MsgBox "You 're an average person"
End If
Ta xét ví dụ trên:
Ø Nếu TheColorYouLike = vbRed thì sẽ chỉ có thông báo: You 're a lucky person.
Ø Nếu TheColorYouLike = vbBlue thì sẽ chỉ có thông báo: You 're a brave person.
Ø Nếu TheColorYouLike không thuộc bất cứ giá trị nào trong bảng màu: vbRed,
vbGreen, vbBlue, vbMagenta thì sẽ chỉ có thông báo: You 're an average person.
8.2. Cấu trúc lựa chọn
Cấu trúc này sử dụng khi ta muốn thực hiện một số lệnh nào đấy tương ứng với từng giá trị của
biểu thức kiểm tra.
Các từ khoá sử dụng trong cấu trúc này: Select Case, Case, Case Else, End Select.
Cú pháp của cấu trúc lựa chọn:
Select Case <biểu_thức_kiểm_tra>
[Case điều_kiện_1
[khối_lệnh_1]]
...
[Case điều_kiện_n
[khối_lệnh_n]]
[Case Else
[khối_lệnh_else]]
End Select
Diễn giải tiến trình của cấu trúc lựa chọn như sau: Giá trị của <biểu_thức_kiểm_tra> sẽ
được so sánh với các <điều_kiện_i> nếu giá trị của <biểu_thức_kiểm_tra> thoả mãn
<điều_kiện_i> thì <khối_lệnh_i> tương ứng sẽ được thực hiện, sau đó chương trình sẽ
thoát khỏi cấu trúc lựa chọn. Trong trường hợp giá trị của <biểu_thức_kiểm_tra> không
thoả mãn tất cả các điều kiện thì <khối_lệnh_else> sẽ được thực hiện nếu có từ khoá Case
Else, còn nếu không có từ khoá Case Else thì chương trình sẽ thoát khỏi khối lệnh lựa chọn
này mà không thực hiện gì cả.
Ví dụ sử dụng ElseIf ở trên được viết lại với cấu trúc lựa chọn như sau:
Select Case TheColorYouLike
Case vbRed
MsgBox "You 're a lucky person"
Case vbGreen
46
CHƯƠNG III: CƠ BẢN VỀ NGÔN NGỮ LẬP TRÌNH VISUAL BASIC
MsgBox "You
Case vbBlue
MsgBox "You
Case vbMagenta
MsgBox "You
Else
MsgBox "You
End Select
're a hopeful person"
're a brave person"
're a sad person"
're an average person"
Có thể thấy rằng với cách viết sử dụng cấu trúc lựa chọn, đoạn chương trình trên dễ đọc hơn
nhiều so với dùng cấu trúc điều kiện và ElseIf.
Sơ đồ khối của cấu trúc lựa chọn có thể được biểu diễn như sau:
8.3. Vòng lặp xác định
8.3.1. Vòng lặp theo biến đếm
Thực hiện lặp một khối lệnh theo một biến đếm với số lần lặp xác định, ví dụ như khi ta cần
tính tổng của các số nằm giữa hai số nào đó.
Các từ khóa: For, to, Step, Next
Cú pháp:
For <biến_đếm>=<Bắt_Đầu> To <Kết_Thúc> [Step <bước_nhảy>]
[Khối_lệnh]
Next [<biến_đếm>]
Cấu trúc lặp này thực hiện theo trình tự sau:
Ø Gán <Biến_đếm> bằng giá trị <Bắt_đầu>
Ø So sánh <Biến_đếm> với giá trị <Kết_thúc>:
Nếu nhỏ hơn hoặc bằng: thực hiện các lệnh bên trong [Khối_lệnh] và tự động cộng
vào <Biến_đếm> một giá trị bằng <bước_nhảy> nếu có từ khóa Step, còn không thì
cộng thêm 1 và quay lại bước so sánh <Biến_đếm> với giá trị <Kết_thúc>.
Nếu lớn hơn: kết thúc khối lệnh lặp.
47
Ví dụ sau tính tổng của các số từ 1 đến 10:
Dim i As Integer
Dim Tong As Integer
Tong = 0
For i = 1 To 10 Step 1
Tong = Tong + i
Next
Debug.Print ("Tong = " & Tong)
Kết quả như sau:
Ví dụ sau tính tổng của các số chẵn từ 0 đến 10:
Dim i As Integer
Dim Tong As Integer
Tong = 0
For i = 0 To 10 Step 2
Tong = Tong + i
Next
Debug.Print ("Tong = " & Tong)
Kết quả như sau:
CHÚ Ý Khi giá trị của <bước_nhảy> là âm (<0) thì cấu trúc lặp sẽ thực hiện trình tự
đếm ngược, nghĩa là vai trò của giá trị <bắt_đầu> và <kết_thúc> đổi chỗ cho nhau.
Ví dụ tính tổng của các số chẵn từ 0 đến 10 sử dụng vòng lặp đếm ngược:
Dim i As Integer
Dim Tong As Integer
Tong = 0
For i = 10 To 0 Step -2
Tong = Tong + i
Next
Debug.Print ("Tong = " & Tong)
Kết quả như sau:
48
CHƯƠNG III: CƠ BẢN VỀ NGÔN NGỮ LẬP TRÌNH VISUAL BASIC
GỢI Ý Nếu như muốn thoát khỏi vòng lặp xác định FOR khi mà số lần lặp chưa đủ thì ta
sử dụng từ khóa Exit For.
Ví dụ sau sẽ tính tổng của các số chẵn từ 0 đến 10, nhưng sẽ dừng vòng lặp FOR ngay khi tổng
lớn hơn 20:
Dim i As Integer
Dim Tong As Integer
Tong = 0
For i = 10 To 0 Step -2
Tong = Tong + i
If Tong > 20 Then Exit For
Next
Debug.Print ("Tong = " & Tong)
Kết quả như sau: (10 + 8 + 6 = 24)
8.3.2. Lặp trong một tập hợp
Trong trường hợp muốn thực hiện các khối lệnh lặp theo một biến đếm chạy trong một tập hợp
mà tập hợp đó không thể xác định được số lượng hoặc bước nhảy thì người dùng có thể dùng
vòng lặp trong tập hợp (For Each … Next). Tập hợp ở đây có thể là một tập đối tượng dạng
Collection hoặc một mảng.
Các từ khoá sử dụng For, Each, In, Next
Cú pháp:
For Each <biến_chạy> In <tập_hợp>
[Khối_lệnh]
Next
Giải thích: <biến_chạy> sẽ nhận các giá trị từ phần tử đầu tiên đến phần tử cuối cùng trong
<tập_hợp>. Ứng với mỗi giá trị của <biến_chạy>, khối lệnh được thực hiện một lần.
CHÚ Ý Kiểu của <biến_chạy> trong vòng lặp (For Each … Next) sẽ phụ thuộc vào kiểu
của <tập_hợp> mà nó duyệt qua là kiểu mảng hay kiểu tập đối tượng. Đối với
<tập_hợp> là tập đối tượng thì kiểu dữ liệu của <biến_chạy> có thể là Variant,
hoặc đối tượng cùng kiểu với tập đối tượng đó. Đối với <tập_hợp> là mảng thì kiểu dữ
liệu của <biến_chạy> chỉ có thể là Variant.
Ví dụ sau sẽ thực hiện tính tích các số trong một mảng 2 chiều với việc dùng vòng lặp trong tập
hợp. Kết quả sẽ được hiển thị trong cửa sổ Immediate.
Public Sub TestForEach()
Dim a(0 To 2, 0 To 1) As Double
Dim v As Variant
Dim Tich As Double
a(0, 0) = 1: a(1, 0) = 2: a(2, 0) = 3
49
a(0, 1) = 4: a(1, 1) = 5: a(2, 1) = 6
Tich = 1
Debug.Print "Cac phan tu trong mang"
For Each v In a
Debug.Print v
Tich = Tich * v
Next
Debug.Print "Tich=" & Str(Tich)
End Sub
Kết quả như sau:
8.4. Vòng lặp không xác định
Thực hiện một khối lệnh với số lần lặp không định trước và chỉ kết thúc quá trình lặp này khi
một biểu thức điều kiện được thỏa mãn (biểu thức điều kiện có giá trị Boolean: True hoặc
False). Tùy thuộc vào việc kiểm tra biểu thức điều kiện mà ta sử dụng một trong hai dạng cú
pháp như sau:
Kiểu 1: Lặp trong khi biểu thức điều kiện là TRUE
Do While <điều_kiện>
[Khối_lệnh]
Loop
Với cú pháp này, [Khối_lệnh] chỉ được thực hiện khi <Điều_kiện> là đúng.
Ví dụ sau sẽ đếm số chữ số chẵn trong khoảng hai số A, B:
Dim i, A, B, SoChan As Integer
A = 1: B = 10
i = A
SoChan = 0
Do While i <= B
If (i Mod 2) = 0 Then SoChan = SoChan + 1
i = i + 1
Loop
Debug.Print ("So chu so chan = " & SoChan)
Kết quả như sau:
50
CHƯƠNG III: CƠ BẢN VỀ NGÔN NGỮ LẬP TRÌNH VISUAL BASIC
Nếu muốn vòng lặp luôn có ít nhất một lần thi hành khối lệnh, sử dụng cú pháp:
Do
[Khối_lệnh]
Loop While <điều kiện>
Với cú pháp này, [Khối_lệnh] được thực hiện ít nhất một lần cho dù <Điều_kiện> đúng hay
sai bởi <Điều_kiện> được kiểm tra ở cuối của cấu trúc.
Kiểu 2: Lặp cho đến khi điều kiện là FALSE
Do Until <điều_kiện>
[Khối_lệnh]
Loop
Nếu muốn vòng lặp luôn có ít nhất một lần thi hành khối lệnh sử dụng cú pháp:
Do
[Khối_lệnh]
Loop Until <điều_kiện>
CHÚ Ý Khi [Khối_lệnh] được thực thi, nếu như trong [Khối_lệnh] không có câu
lệnh nào tác động lên <điều_kiện> để nó nhận giá trị ngược lại thì vòng lặp này sẽ
không bao giờ kết thúc và làm cho ứng dụng bị “treo”. Để thoát khỏi tình huống “treo” này
có nhiều cách và cách đơn giản nhất là bấm tổ hợp phím Ctrl+Break để quay trở lại
VBAIDE.
Có cách khác để thoát khỏi vòng lặp, ngoài việc thiết lập <điều_kiện> có giá trị ngược
lại, là sử dụng từ khóa Exit Do đặt trong [Khối_lệnh].
9. Chương trình con
Về cơ bản, chương trình con là một khối các câu lệnh và chúng được sử dụng lặp lại trong
chương trình chính thông qua tên của chương trình con. Chương trình con đặc biệt hữu ích khi
thay thế các khối lệnh lặp nhau hoặc cùng thực thi một chức năng tương tự nào đó.
Có hai loại chương trình con chính là Hàm (Function) và Thủ tục (Sub). Ngoài ra, trong các
mô-đun lớp (Class Module) còn có chương trình con dạng thuộc tính (Property), tuy nhiên
trong giáo trình này sẽ không trình bày về loại chương trình con này mà người đọc có thể tham
khảo trong giáo trình môn Lập trình hướng đối tượng trong xây dựng.
Cú pháp tổng quát của một chương trình con như sau:
Cú pháp tổng quát của một chương trình con như sau:
[Private|Friend|Public][Static]<Sub|Function|Property>
Tên([các_tham_số])
[Khối_lệnh]
51
End <Sub|Function|Property>
Trong đó phần thân chương trình con được bọc giữa phần khai báo và phần kết thúc (có từ
khóa End).
Các từ khóa [Private|Public|Friend] xác định phạm vi hoạt động của chương trình con.
Khái niệm phạm vi này cũng tương tư như phạm vi của biến đã được trình bày ở phần trước.
Từ khóa [Static] xác định cách thức cấp phát bộ nhớ cho các biến khai báo bên trong
chương trình con (sẽ trình bày cụ thể ở phần sau).
CHÚ Ý Từ khóa Friend chỉ được sử dụng trong mô-đun lớp hoặc mô-đun lệnh của
UserForm.
9.1. Hàm (Function)
Là chương trình con có trả về giá trị khi nó được gọi. Cú pháp khai báo như sau:
[Private/Public/Friend][Static] Function <Tên_hàm> ([Các_tham_số]) as
<kiểu_dữ_liệu>
[Khối_lệnh]
End Function
Ví dụ: tạo hàm tính diện tích của hình chữ nhật, với hai tham số cần nhập vào là chiều rộng và
chiều dài của hình chữ nhật.
Function Dien_Tich(Rong As Double, Dai As Double) as Double
Dien_Tich=Rong*Dai
End Function
9.2. Thủ tục (Sub)
Là chương trình con không trả về giá trị khi được gọi. Cú pháp khai báo như sau:
[Private/Public/Friend][Static] Sub <Tên_hàm> ([Các_tham_số])
[Khối_lệnh]
End Sub
Ví dụ: để tạo một chương trình con dạng thủ tục có tính năng như phần trên có thể viết mã lệnh
như sau:
Sub Dien_Tich(Rong as Double, Dai as Double, Dt as Double)
Dt=Rong*Dai
End Sub
CHÚ Ý Trong ví dụ này, vì chương trình con không có giá trị trả về nên để nhận về giá trị
diện tích phải bổ sung thêm tham số Dt vào trong danh sách tham số của chương trình
con.
9.3. Truyền tham số cho chương trình con
Xét 2 chương trình con được đặt trong cùng một mô-đun chuẩn, thực hiện việc gán và in giá trị
của biến như sau:
52
CHƯƠNG III: CƠ BẢN VỀ NGÔN NGỮ LẬP TRÌNH VISUAL BASIC
Một chương trình con đơn giản được tạo ra như sau:
Public Sub Test(ByRef a As Long, b As Long, ByVal c As Long)
a = 100: b = 200: c = 300
End Sub
Chú ý đến khai báo biến a, b và c của chương trình con này:
Ø Trước biến a là từ khóa ByRef.
Ø Trước biến b không có từ khóa, nghĩa là sử dụng kiểu mặc định của VB.
Ø Trước biến c là từ khóa ByVal.
Chương trình con thứ hai được xây dựng trên cùng một mô-đun với chương trình con trên
như sau:
Public Sub CallTest()
Dim va As Long, vb As Long, vc As Long
va = 500: vb = 500: vc = 500
' In giá trị của biến trước khi gọi chương trình con thứ nhất
Debug.Print " Cac gia tri bien truoc khi goi chuong trinh con:"
Debug.Print "va=" & Str(va)
Debug.Print "vb=" & Str(vb)
Debug.Print "vc=" & Str(vc)
' Gọi chương trình con thứ nhất
Test va, vb, vc
' In giá trị của biến sau khi gọi chương trình con thứ nhất
Debug.Print " Cac gia tri bien sau khi goi chuong trinh con:"
Debug.Print "va=" & Str(va)
Debug.Print "vb=" & Str(vb)
Debug.Print "vc=" & Str(vc)
End Sub
Trong chương trình con thứ 2 có lời gọi đến chương trình con thứ nhất để thực hiện thay đổi
giá trị của các biến. Kết quả khi thực thi chương trình con thứ 2 như sau:
Qua kết quả trên có thể thấy rằng:
Giá trị của biến có thể bị thay đổi hoặc không bị thay đổi khi chúng được truyền vào chương
trình con là phụ thuộc vào cách định nghĩa tham số trong chương trình con đó.
Ø Biến a trong Sub Test được khai báo với từ khóa ByRef và khi truyền biến ở vị trí này
(biến va trong CallTest) thì giá trị của biến ban đầu bị thay đổi tương ứng với các tác
động trong chương trình con.
53
Ø Biến b trong Sub Test được khai báo mặc định (không có từ khóa nào phía trước nó) và
khi truyền biến ở vị trí này (biến vb trong CallTest) thì giá trị của biến ban đầu bị thay
đổi tương ứng với các tác động trong chương trình con.
Ø Biến c trong Sub Test được khai báo với từ khóa ByVal và khi truyền biến ở vị trí này
(biến vc trong CallTest) thì giá trị của biến ban đầu không bị thay đổi cho dù trong
chương trình con biến này bị tác động.
Qua ví dụ trên có thể thấy rằng việc truyền tham số cho chương trình con có thể được phân làm
hai trường hợp và được đặt tên là truyền tham số theo tham chiếu và truyền tham số theo tham
trị.
9.3.1. Truyền tham số theo tham chiếu
Khi truyền một biến vào tham số theo kiểu tham chiếu, địa chỉ của biến sẽ được truyền cho
chương trình con. Do đó, bất kì câu lệnh nào của chương trình con tác động lên tham số sẽ ảnh
hưởng trực tiếp lên biến được truyền tương ứng, nghĩa là khi chương trình con kết thúc, giá trị
của biến được truyền theo kiểu này sẽ bị thay đổi do chương trình con. Truyền tham số theo
kiểu tham chiếu là mặc định trong VB, người dùng cũng có thể chỉ rõ việc truyền theo tham
chiếu bằng cách thêm từ khoá ByRef vào trước khai báo tham số.
9.3.2. Truyền tham số theo tham trị
Khi truyền một biến vào tham số theo kiểu tham trị, bản sao giá trị của biến sẽ được truyền cho
cho chương trình con. Do đó, nếu trong chương trình con có các câu lệnh tác động lên tham số
thì chỉ bản sao bị ảnh hưởng và biến truyền vào sẽ không bị thay đổi, nghĩa là sau khi chương
trình con kết thúc, giá trị của biến vẫn được giữ nguyên như ban đầu. Để xác định cách thức
truyền dữ liệu cho một tham số theo kiểu tham trị, thêm từ khoá ByVal vào trước khai báo
tham số.
Trong Sub Test ở trên, a và b là hai tham số được truyền theo kiểu tham chiếu còn c được
truyền theo kiểu tham trị.
9.3.3. Tham số tuỳ chọn.
Tham số tuỳ chọn là tham số có thể có hoặc được bỏ qua khi gọi chương trình con.
Các tham số tuỳ chọn được khai báo với từ khoá Optional và trong một chương trình con, các
khai báo của các tham số tuỳ chọn luôn phải nằm cuối danh sách tham số được khai báo.
Ví dụ: viết chương trình con tính toán diện tích của mặt cắt chữ nhật có khoét lỗ (như hình
dưới) với yêu cầu sau:
Ø Tính diện tích mặt cắt với các thông số về chiều rộng w, chiều cao h và bán kính r của lỗ
khoét.
Ø Trong trường hợp thiếu thông số về bán kính r, chỉ tính diện tích mặt cắt chữ nhật và bỏ
qua lỗ khoét.
Dưới đây là một chương trình con có sử dụng tham số tuỳ chọn:
Public Function DT(w As Double, h As Double, Optional r As Variant)
If Not IsMissing(r) Then
If (2 * r <= w) And (2 * r <= h) Then
54
CHƯƠNG III: CƠ BẢN VỀ NGÔN NGỮ LẬP TRÌNH VISUAL BASIC
Else
DT = w * h - pi * r ^ 2
Else
MsgBox " Co loi, lo khoet vuot ra ngoai hinh"
DT = "Error"
End If
DT = w * h
End If
End Function
Sau khi tạo mã lệnh trên, nếu muốn tính diện tích cho mặt cắt với w =100, h =200, r =20 có thể
gọi hàm như sau: DT(100,200,20) để tính diện tích có xét đến khoét lỗ với bán kính là 20,
hoặc DT(100,200) để tính diện của hình chữ nhật (không có lỗ).
CHÚ Ý Để biết được một tham số tuỳ chọn có bị bỏ qua khi gọi chương trình con hay
không, dùng hàm IsMissing(tham_số_tuỳ_chọn) và đồng thời tham số tuỳ chọn
bắt buộc phải có kiểu dữ liệu là Variant (vì hàm IsMissing chỉ có hiệu lực đối với các
biến kiểu Variant). Hàm này trả về TRUE nếu tham số bị bỏ qua, FALSE nếu tham số có
mặt.
9.3.4. Danh sách tham số với số lượng tham số tuỳ ý.
Visual Basic 6.0 cho phép tạo một chương trình con với danh sách tham số tuỳ ý (nghĩa là số
lượng các tham số có thể thay đổi khi gọi chương trình con) thông qua việc đặt từ khoá
ParamArray trước danh sách tham số. Khi đó danh sách tham số là tuỳ chọn và có dạng một
mảng kiểu Variant.
Ví dụ: viết một hàm tính tổng của tất cả các số truyền vào với số lượng số được truyền là tuỳ ý.
Mã lệnh tham khảo như sau:
Public Function TinhTong(ParamArray ds())
Dim So As Variant
Dim Tong As Variant
Tong = 0
For Each So In ds
Tong = Tong + So
Next
TinhTong = Tong
End Function
Khi đó:
TinhTong(100,200,-200) cho kết quả là 100
TinhTong(2,300) cho kết quả là 302
9.3.5. Hàm có giá trị trả về là kiểu mảng.
Để khai báo một hàm trả về mảng, thêm cặp kí tự “( )” sau khai báo hàm
[Private/Public] Function <Tên_hàm> ([danh sách tham số]) as _
<kiểu_dữ_liệu> ()
[Khối_lệnh]
End Function
Ví dụ: viết chương trình con sắp xếp các phần tử trong mảng một chiều và trả về một mảng có
thứ tự tăng dần.
55
Mã lệnh tham khảo như sau:
Public Function Mang_tangdan(Mang_bandau() As Double) As Double()
Dim Lb As Long, Ub As Long ' bien dau va cuoi cua mang
Dim i As Long, j As Long
Lb = LBound(Mang_bandau): Ub = UBound(Mang_bandau)
Dim Mang_tamthoi() As Double ‘ Khai bao mot mang tam thoi
Mang_tamthoi = Mang_bandau
Dim Tg As Double
For i = Lb To Ub - 1
For j = i + 1 To Ub
If Mang_tamthoi(i) > Mang_tamthoi(j) Then
Tg = Mang_tamthoi(i)
Mang_tamthoi(i) = Mang_tamthoi(j)
Mang_tamthoi(j) = Tg
End If
Next
Next
Mang_tangdan = Mang_tamthoi
Erase Mang_tamthoi ' Huy mang tam thoi
End Function
Chương trình thử nghiệm hàm trên:
Public Sub test()
Dim a(2 To 6) As Double
a(2) = 1: a(3) = 6: a(4) = 0.5: a(5) = 2.3: a(6) = 4
Dim b() As Double
b = Mang_tangdan(a) ‘ Goi ham da viet
Dim so As Variant
Debug.Print "Cac phan tu cua mang ban dau:"
For Each so In a
Debug.Print so
Next
Debug.Print "Cac phan tu cua mang sau khi sap xep:"
For Each so In b
Debug.Print so
Next
End Sub
Kết quả như sau:
56
CHƯƠNG III: CƠ BẢN VỀ NGÔN NGỮ LẬP TRÌNH VISUAL BASIC
9.4. Biến trong chương trình con
Như đã trình bày ở phần trước, biến trong chương trình con luôn có tính chất cục bộ. Tuy nhiên
hình thức cấp phát bộ nhớ cho biến thì có thể khác nhau. Tuỳ vào từng trường hợp cụ thể:
Trường hợp: trong phần khai báo của chương trình con không sử dụng từ khóa Static
Với các biến được khai báo bình thường với từ khoá Dim: mỗi lần chương trình con được gọi,
biến sẽ được tạo và cấp phát bộ nhớ. Khi chương trình con kết thúc, bộ nhớ dành cho biến được
giải phóng. Do đó, giá trị của biến sau mỗi phiên làm việc của chương trình con sẽ không được
lưu trữ.
Với các biến được khai báo với từ khoá Static: biến sẽ được khởi tạo một lần khi mô-đun chứa
chương trình con được nạp vào trong bộ nhớ và sẽ tồn tại trong bộ nhớ cùng với mô-đun đó. Vì
vậy, giá trị của biến sau mỗi phiên làm việc của chương trình con sẽ được lưu trữ. Các biến
kiểu này được gọi là biến tĩnh (Static)
Ví dụ: trong chương trình con StVariable dưới đây có hai biến địa phương, stA là biến tĩnh
và B là biến thông thường.
Public Sub StVariable()
Static stA As Long
Dim B As Long
B = B + 1
stA = stA + 1
Debug.Print "Lan chay " & Str(stA), "stA=" & Str(stA), "B=" &
Str(B)
End Sub
Kết quả sau 2 lần chạy chương trình con trên như sau:
Giải thích
Ngay khi được khai báo, tất cả các biến đều được tự động khởi tạo giá trị ban đầu, nếu kiểu dữ
liệu của biến là dạng số thì giá trị khởi tạo bằng 0, còn nếu kiểu dữ liệu của biến là chuỗi thì giá
trị khởi tạo mặc định là chuỗi rỗng. Trong chương trình trên, ngay trước khi kết thúc ở lần chạy
đầu tiên, giá trị của các biến như sau:
Ø Biến B = 1.
Ø Biến stA = 1.
Khi kết thúc lần chạy thứ nhất, biến B (biến thông thường) sẽ được giải phóng, còn biến stA
(biến tĩnh) vẫn được lưu giá trị (=1) của nó lại trong bộ nhớ. Do đó đến lần chạy thứ hai, biến B
được tạo mới sẽ nhận giá trị là B=B+1=0+1=1, còn biến stA do vẫn tồn tại từ lần trước nên giá
trị của nó là stA=stA+1=1+1=2.
Trường hợp: trong khai báo của chương trình con có sử dụng từ khóa Static
Khi đó tất cả các biến khai báo trong chương trình con sẽ là các biến tĩnh.
Ví dụ: trong chương trình con StPro dưới đây đã sử dụng khai báo Static ở đầu chương
trình.
57
Public Static Sub StPro()
Dim a As Long
Dim b As Long
a = a + 1
b = b + 1
a = a + b
Debug.Print "Lan chay " & Str(b)
Debug.Print "
", "a=" & Str(a), "b=" & Str(b)
End Sub
Kết quả sau 2 lần chạy chương trình con như sau:
CHÚ Ý Các biến tĩnh thường được sử dụng khi muốn lưu trữ kết quả những lần chạy của
chương trình con. Chú ý rằng dù biến trong chương trình con là biến thông thường hay
biến tĩnh thì vẫn luôn mang tính chất cục bộ.
9.5. Cách thức gọi chương trình con.
Với trường hợp dự án (Project) gồm nhiều thành phần (các mô-đun chuẩn, các UserForm,…)
có chứa mã lệnh, nghĩa là ở đó có thể xây dựng hoặc có nhu cầu sử dụng chương trình con, thì
trong cùng một mô-đun, không được phép xây dựng hai chương trình con trùng tên nhau,
nhưng quy định này không áp dụng cho các mô-đun khác nhau, nghĩa là có thể tồn tại hai
chương trình con có tên giống hệt nhau ở hai mô-đun khác nhau. Trong trường hợp trùng tên
này, khi muốn sử dụng chương trình con nào thì phải chỉ rõ nơi chứa nó, và tốt nhất, khi sử
dụng bất cứ chương trình con nào của mô-đun khác thì nên chỉ rõ cả tên mô-đun đó.
Gọi chương trình con dạng hàm (Function)
Khi gọi chương trình con dạng hàm (Function), danh sách tham số phải được đặt trong cặp
kí tự “( )” sau tên chương trình con.
<Tên_mô-đun>.<Tên_hàm>(<danh_sách_tham_số>)
CHÚ Ý Mô-đun ở đây có thể là một mô-đun chuẩn (Module), UserForm hoặc một đối
tượng mà người dùng đang xét. Danh sách tham số phải được truyền theo đúng thứ tự
như ở phần khai báo chương trình con.
Ví dụ: mô-đun chuẩn mdlMatcat chứa hàm TinhDTHH(h,b) thì cú pháp gọi hàm đó là:
mdlMatcat.TinhDTHH(ph,pb)
với ph, pb là những biến được truyền vào trong hàm.
Gọi chương trình con dạng thủ tục (Sub)
Khi gọi chương trình con dạng thủ tục (Sub), danh sách tham số đặt tiếp sau tên thủ tục và kí tự
trống, các tham số không cần đặt trong cặp kí tự “( )”.
58
CHƯƠNG III: CƠ BẢN VỀ NGÔN NGỮ LẬP TRÌNH VISUAL BASIC
<Tên_mô-đun>.<Tên_thủ tục> <danh_sách_tham_số>
Ví dụ: trong mô-đun chuẩn mdlDAH chứa thủ tục TinhDTDAH(S) thì cú pháp gọi thủ tục đó là:
mdlDAH.TinhDTDAH pS
với pS là những biến được truyền vào trong thủ tục.
Gọi chương trình con với các tham số gán theo tên
Trong cách gọi chương trình con theo kiểu thông thường như trên, danh sách tham số truyền
vào phải đúng thứ tự như trong phần khai báo của chương trình con đó. Ngoài ra, VB còn cho
phép gọi chương trình con với trật tự tham số tuỳ ý mà vẫn đảm bảo sự truyền tham số chính
xác thông qua tên của tham số.
Ví dụ, với hàm DT(w,h,r) ở phần trên thì hai cách gọi sau là tương đương:
DT (100,200,30)
DT (r:=30, w:=100, h:=200)
Trong dòng thứ nhất, luôn có sự ngầm hiểu trình tự các tham số là: w,h,r, đây chính là trình tự
khi định nghĩa hàm DT. Còn ở dòng thứ 2, trình tự theo định nghĩa của hàm DT không có ý
nghĩa nữa bởi đã có sự chỉ rõ: Tên biến := Giá trị cần gán. Chú ý đến ký hiệu ( := ) và
trình tự bất kỳ của các tham số.
Việc sử dụng tham số gán theo tên khi gọi chương trình con đặc biệt tiện lợi khi chương trình
con có nhiều tham số tuỳ chọn và người dùng không có ý định sử dụng hết các tham số đó.
9.6. Thoát khỏi chương trình con.
Để thoát khỏi hàm sử dụng lệnh Exit Function
Để thoát khỏi thủ tục sử dụng lệnh Exit Sub
Ngay khi gặp hai hàm này trong thân của chương trình con, toàn bộ các dòng lệnh phía sau nó
sẽ bị bỏ qua và chương trình sẽ thoát ngay khỏi chương trình con đó.
10. Tổ chức các chương trình con theo hệ thống các mô-đun
chuẩn
Với việc thiết kế hệ thống theo phương pháp cấu trúc hóa, toàn bộ chương trình thường được
chia thành các khối chương trình nhỏ hơn, mỗi khối chương trình đảm nhận một chức năng
chung nào đó. Tiếp theo, để dễ dàng cho việc xây dựng chương trình, các chức năng chung lại
được chia thành các phần nhỏ hơn nữa, và lặp lại cho đến khi nào mỗi phần này có thể minh
họa bằng một chương trình con. Trong lập trình VBA, các khối chức năng thường được tổ chức
thành các mô-đun chuẩn (Module). Trong mô-đun chuẩn sẽ bao gồm các chương trình con
(hàm và thủ tục) phản ánh sự chi tiết hoá cho các khối chức năng này. Ngoài ra, trong mô-đun
chuẩn người dùng có thể khai báo các kiểu dữ liệu tự định nghĩa, các biến dùng chung, các
hằng số, …
Ví dụ: để xây dựng một chương trình kiểm toán mặt cắt cột BTCT, có thể xây dựng các môđun và các chương trình con theo hình vẽ dưới đây dưới đây
59
60
Hinh_Hoc
Tinh_Duyet
(Module)
(Module)
TinhDTHH_MCatBT
LapTH_TaiTrong
TinhDTHH_MCatCT
TTGH_CuongDo
TinhDTHH_TinhDoi
TTGH_SuDung
CHƯƠNG III: CƠ BẢN VỀ NGÔN NGỮ LẬP TRÌNH VISUAL BASIC
Hình III-16: Tổ chức dự án theo cấu trúc chức năng
11. Làm việc với UserForm và các thành phần điều khiển
11.1. Các vấn đề chung
Trong một dự án VBA, các mô-đun chuẩn cho phép xây dựng các khối chương trình xử lý dữ
liệu hoặc các khai báo về dữ liệu. Sự giao tiếp nhập-xuất dữ liệu giữa người dùng và chương
trình có thể được thực hiện thông qua giao diện của ứng dụng nền. Tuy nhiên, trong nhiều
trường hợp giao diện nhập-xuất dữ liệu của ứng dụng nền chưa thể đáp ứng được nhu cầu
tương tác dữ liệu một cách chi tiết cũng như tiện lợi cho người sử dụng, và khi đó, cần tạo ra
các giao diện nhập-xuất riêng thông qua việc sử dụng các UserForm trong dự án VBA. Nói
cách khác, giao tiếp giữa người sử dụng chương trình với chương trình viết bằng VBA được
gọi là giao diện của chương trình và cách xây dựng giao diện như sau:
Ø Sử dụng ngay ứng dụng nền để làm giao diện, cách này sẽ trình bày cụ thể trong các
chương sau.
Ø Sử dụng UserForm.
Ø Kết hợp cả hai phương án trên.
Các UserForm thực chất là mẫu các hộp thoại (cửa sổ) được tạo ra theo yêu cầu của người
dùng. Trên một UserForm luôn chứa những thành phần phục vụ cho nhu cầu tương tác giữa
người dùng và chương trình: nhập các dữ liệu cần thiết, ra lệnh xử lý, lựa chọn dữ liệu theo tình
huống, hiển thị kết quả xử lý một cách trực quan,… Những thành phần đó được gọi là các điều
khiển (Control).
Điều khiển lựa chọn dữ liệu
Điều khiển cho
phép nhập dữ
liệu dạng văn
bản
Điều khiển cho
phép người
dùng ra lệnh
thông qua việc
kích chuột.
Điều khiển cho
phép chèn hình
ảnh minh hoạ.
Để tạo ra UserForm, làm theo trình tự sau:
1. Xác định sự cần thiết phải tạo giao diện nhập-xuất dữ liệu riêng: Giao diện do ứng dụng
nền cung cấp không đủ hoặc không thích hợp cho việc nhập dữ liệu hoặc xuất kết quả của
chương trình.
61
2. Xác định cách thức và trình tự tương tác của người sử dụng trên giao diện: để có thể bố trí
các điều khiển sao cho thuận tiện đối với người dùng, ví dụ như theo thói quen điều khiển
của đa số người sử dụng là từ trái sang phải, từ trên xuống dưới.
3. Xác định số lượng UserForm cần phải tạo cho quá trình nhập dữ liệu cũng như việc hiển thị
kết quả: chỉ nên sử dụng vừa đủ và phân theo chủ đề của công việc, ví dụ nên phân tách
giao diện nhập dữ liệu với giao diện trình bày kết quả và các điều khiển (nút bấm) khác.
4. Xác định các loại dữ liệu cần nhập vào, các dữ liệu theo tình huống và các minh hoạ bằng
hình ảnh kèm theo để giải thích rõ cho người sử dụng ý nghĩa của các thông số cần được
nhập vào. Căn cứ vào các loại dữ liệu cần nhập trên để xác định các thành phần điều khiển
phù hợp và đưa vào UserForm tương ứng. Cần chú ý rằng, các điều khiển, ngoài việc đáp
ứng yêu cầu về mặt chức năng, chúng cũng cần được trình bày và giải thích một cách dễ
hiểu và có tính thẩm mỹ.
Hình III-17: Ý nghĩa các loại dữ liệu cần nhập vào được minh họa bằng hình ảnh.
5. Lựa chọn các điều khiển phục vụ cho việc xác nhận dữ liệu sau khi nhập xong hoặc ra lệnh
cho quá trình xử lý các dữ liệu này bắt đầu thực hiện. Thông thường các điều khiển này là
hệ thống các nút bấm (Button) để xác nhận các dữ liệu đã nhập xong, yêu cầu bắt đầu xử lý
hoặc hủy bỏ các dữ liệu đã nhập.
62
CHƯƠNG III: CƠ BẢN VỀ NGÔN NGỮ LẬP TRÌNH VISUAL BASIC
Hình III-18: Bố trí các điều khiển trên UserForm.
6. Lựa chọn hình thức hiển thị kết quả từ đó lựa chọn các thành phần điều khiển phù hợp, ví
dụ như kết quả tính toán là số hoặc hình vẽ thì cần chọn điều khiển thích hợp để trình bày.
Hình III-19: Trình bày kết quả bằng điều khiển hỗ trợ văn bản và hình ảnh.
7. Viết mã lệnh cho các thành phần điều khiển. Mã lệnh này sẽ được lưu trữ trong phần code
của UserForm.
11.1.1. Tạo UserForm và các thành phần điều khiển trong VBA IDE
Trong VBA IDE, UserForm được tạo ra bằng cách chọn trình đơn Insert Ö UserForm
Sau khi tạo UserForm, ta có thể thêm các thành phần điều khiển vào UserForm bằng cách lựa
chọn điều khiển cần dùng từ hộp công cụ điều khiển (Control Toolbox) và thực hiện thao tác
63
kéo/thả vào vị trí thích hợp UserForm. Kích thước của điểu khiển có thể thay đổi một cách dễ
dàng nhờ thao tác kéo chuột ở vùng biên của chúng.
Điều khiển được
lựa chọn trên
Control Toolbox
Điều khiển được tạo bằng cách kéo/thả vào UserForm
Thông thường trong hộp công cụ mặc định của VBA IDE chỉ có các thành phần điều khiển
chuẩn của VB, các điều khiển này đáp ứng được hầu hết các nhu cầu cơ bản về thiết kế giao
diện. Tuy nhiên người dùng có thể bổ sung những thành phần điều khiển khác vào hộp công cụ
trên bằng cách sử dụng Additional Controls có sẵn trên hộp công cụ (hiển thị bằng cách nhấn
chuột phải vào hộp công cụ). Với mỗi máy tính khác nhau thì nội dung các điều khiển có thể bổ
sung là khác nhau bởi chúng phục thuộc vào các thư viện lập trình được cài đặt trên máy tính
đó.
Hình III-20: Bổ sung thêm điều khiển cho hộp công cụ (Toolbox) của VBA IDE.
11.1.2. Các thuộc tính của UserForm và các thành phần điều khiển.
Các thuộc tính (Properties) là các thông số quy định đặc điểm, tính chất cũng như trạng thái của
UserForm hay các điều khiển, ví dụ màu nền của một điểu khiển được quy định bởi thuộc tính
64
CHƯƠNG III: CƠ BẢN VỀ NGÔN NGỮ LẬP TRÌNH VISUAL BASIC
BackColor. Những thuộc tính này có thể được thay đổi trong lúc thiết kế UserForm hoặc lúc
chương trình đang chạy. Tuy nhiên một số thuộc tính không cho phép thay đổi mà chỉ cho phép
người dùng biết được giá trị của nó (thuộc tính chỉ đọc – Read Only). Trong quá trình thiết kế
UserForm, khi ta dùng chuột chọn bất cứ thành phần nào trên UserForm (kể cả chính
UserForm) thì các thuộc tính của nó sẽ được hiển thị tương ứng trong cửa sổ Properties của
VBA IDE.
Hình III-21: Thành phần điều khiển và vị trí hiển thị các thuộc tính của nó.
Một số thuộc tính cơ bản của UserForm và các điều khiển:
Thuộc tính
Giải thích
Name
Thể hiện tên của UserForm hay điều khiển. Đây là thuộc tính rất quan trọng, là yếu
tố xác định điều khiển khi lập trình. Thuộc tính này chỉ được thay đổi lúc thiết kế
giao diện (trong của sổ Properties của VBA IDE).
BackColor
Giá trị kiểu Long thể hiện màu nền của UserForm hay điều khiển.
Caption
Giá trị kiểu String thể hiện tiêu đề của UserForm hay điều khiển.
Enable
Giá trị kiểu logic (Boolean) xác định trạng thái làm việc của điều khiển, giá trị bằng
True ứng với trạng thái hoạt động, giá trị bằng False ứng với trạng thái không hoạt
động (điều khiển coi như bị vô hiệu hoá và thường được hiển thị mờ đi trên
UserForm).
Visible
Giá trị kiểu logic (Boolean) xác định trạng thái hiển thị của điều khiển, giá trị bằng
True ứng với sự hiển thị điều khiển, giá trị bằng False ứng với sự ẩn điều khiển.
Font
Thể hiện kiểu và cỡ chữ hiển thị trên UserForm hoặc điều khiển.
Picture
Thể hiện hình ảnh trên nền UserForm hoặc điều khiển.
ControlTipText
Giá trị kiểu String thể hiện chú thích về điều khiển khi chuột di chuyển qua
(Tooltip) trong lúc chương trình hoạt động.
MouseIcon
Thể hiện biểu tượng con trỏ chuột hiển thị trên điều khiển.
MousePointer
Thể hiện loại con trỏ chuột hiển thị trên nút lệnh.
65
CỢI Ý Ngoài ra, ứng với mỗi loại điều khiển có thể còn có thêm nhiều thuộc tính khác
hoặc không có một số các thuộc tính được liệt kê ở trên. Người dùng có thể tìm hiểu các
thuộc tính này trong Object Browser hoặc trong Help (chọn điều khiển và bấm F1) của VBA
IDE.
Việc thay đổi thuộc tính của các điều khiển có thể được thực hiện bằng hai cách:
1. Cách 1: Thay đổi trực tiếp trong quá trình thiết kế: chọn điều khiển và thay đổi giá trị của
các thuộc tính trong cửa sổ Properties của VBA IDE. Cách này trực quan và dễ thực hiện
đối với đa số các thuộc tính của hầu hết các điều khiển. Ví dụ: để thay đổi tiêu đề cho một
UserForm dưới đây, kích chuột chọn UserForm sau đó nhập tên của tiêu đề vào phần
Caption của cửa sổ Properties.
Hình III-22: Thay đổi giá trị thuộc tính trong khi thiết kế UserForm.
2. Cách 2: Thay đổi trong lúc chương trình đang chạy: về thực chất, các thuộc tính chính là
dữ liệu của các thành phần điều khiển (thường gọi chung các điều khiển này là đối tượng)
hay chính là các biến được định nghĩa riêng cho điều khiển đó cho nên ta có thể sử dụng
phép gán thông thường để thay đổi giá trị cho một số thuộc tính. Cú pháp thực hiện như
sau:
<Tên_điều_khiển>.<Tên_thuộc_tính> = giá trị thuộc tính
<Tên_UserForm>.<Tên_thuộc_tính> = giá trị thuộc tính
GỢI Ý Tên_điều_khiển hay Tên_UserForm ở đây chính là giá trị thuộc tính Name của
điều khiển đã được đặt khi thiết kế. Khi viết mã lệnh trong một UserForm thì có thể thay
việc dùng tên của UserForm đó bằng từ khoá Me.
Ví dụ, ứng với UserForm có tên là UserForm1 như ở trên, có thể thay đổi tiêu đề của nó bằng
mã lệnh như sau:
UserForm1.Caption = “Cua so chinh”
11.1.3. Các phương thức của UserForm và các thành phần điều khiển.
Các phương thức có thể xem chúng là những chương trình con đặc biệt, chúng chỉ làm việc với
các dữ liệu của điều khiển và tương tác lên chính điều khiển đó. Để phương thức hoạt động,
66
CHƯƠNG III: CƠ BẢN VỀ NGÔN NGỮ LẬP TRÌNH VISUAL BASIC
cần phải gọi nó (tương tự như gọi chương trình con) bằng mã lệnh khi lập trình. Cú pháp gọi
phương thức của một điều khiển hay UserForm cũng tương tự như với biến đối tượng:
<Tên_điều_khiển>.<Tên_phương_thức> <(tham_số_của_phương_thức)>
<Tên_UserForm>.<Tên_phương_thức> <(tham_số_của_phương_thức)>
Ví dụ: muốn hiển thị UserForm1 như ở trên, gọi phương thức Show của nó với mã lệnh như
sau:
UserForm1.Show
Trong phạm vi của giáo trình, không thể liệt kê tất cả các phương thức của các điều khiển.
Trong phần sau sẽ trình bày một số các phương thức cơ bản của một số loại điều khiển thông
dụng. Để biết chi tiết về những phương thức khác, có thể tra cứu trong Object Browser hoặc
trong Help của VBA IDE
11.1.4. Các sự kiện trên giao diện.
Các sự kiện trên UserForm hoặc các điều khiển được phát sinh khi có một hoạt động nào đó
xảy ra – thường được phát sinh từ phía người dùng (sự kiện cũng có thể được phát sinh một
cách gián tiếp từ quá trình thực hiện một phương thức nào đó).Ví dụ, khi người dùng rê chuột
trên bề mặt UserForm sẽ phát sinh sự kiện MouseMove, khi người dùng kích chuột trên
UserForm sẽ phát sinh sự kiện Click.
Đi cùng với sự kiện còn có thủ tục sự kiện: là chương trình được thi hành khi sự kiện xảy ra.
Thủ tục sự kiện cho phép người lập trình xử lý các tương tác của người dùng trên giao diện
bằng cách viết các mã lệnh trong thủ tục sự kiện.
Để viết mã lệnh cho một thủ tục sự kiện trên một UserForm, vào cửa sổ mã lệnh của UserForm
đó (nháy đúp chuột vào UserForm), chọn điều khiển và loại sự kiện tương ứng. Sau đó viết mã
lệnh vào trong thủ tục sự kiện đã được tạo ra.
Chọn đối tượng
Chọn sự kiện
Thủ tục sự kiện gắn với đối tượng được phát sinh
Một số sự kiện cơ bản của UserForm và các điều khiển:
Sự kiện
Giải thích
Click
xảy ra khi người dùng kích chuột trên UserForm hoặc trên điều khiển
DblClick
xảy ra khi người dùng kích đúp chuột trên UserForm hoặc trên điều khiển
67
KeyPress
xảy ra khi người dùng nhấn một phím
KeyUp
xảy ra khi người dùng nhả một phím (sau khi đã nhấn xuống)
KeyDown
xảy ra khi người dùng nhấn một phím (nhưng chưa nhả ra)
MouseMove
xảy ra khi người dùng rê chuột ngang qua một điều khiển hoặc trên UserForm
MouseUp
xảy ra khi người dùng nhả phím chuột (sau khi đã nhấn chuột)
MouseDown
xảy ra khi người dùng nhấn phím chuột (nhưng chưa nhả ra)
11.1.5. Ví dụ
Tạo một UserForm và viết mã lệnh để khi kích chuột vào UserForm sẽ hiển thị số lần kích
chuột trên tiêu đề của nó đồng thời đổi màu nền của UserForm theo tình huống: nếu số lần kích
chuột là chẵn thì màu đen, là lẻ thì màu trắng.
Các thao tác như sau:
1. Thêm UserForm vào trong dự án bằng cách chọn Insert Ö UserForm.
2. Đặt tên UserForm là “usfCuaso1” trong thuộc tính Name của cửa sổ Properties; đặt tiêu đề
xuất phát của UserForm là “Cua so chinh” trong thuộc tính Caption của cửa số Properties.
3. Viết mã lệnh cho sự kiện Click của UserForm (hiển thị cửa sổ lệnh của UserForm bằng
cách nháy đúp chuột vào UserForm, chọn UserForm và sự kiện Click).
Mã lệnh cho thủ tục sự kiện Click như sau:
Private Sub UserForm_Click()
Static numClick As Long
numClick = numClick + 1
If numClick Mod 2 = 0 Then
Me.BackColor = vbBlack
Else
Me.BackColor = vbWhite
End If
usfCuaso1.Caption = "Number of Click: " & Str(numClick)
End Sub
GỢI Ý Trong đoạn mã trên, vbBlack là hằng số tương ứng với màu đen, vbWhite là hằng
số tương ứng với màu trắng. Hai hằng số này được định nghĩa sẵn trong VB.
68
CHƯƠNG III: CƠ BẢN VỀ NGÔN NGỮ LẬP TRÌNH VISUAL BASIC
11.2. Làm việc với UserForm
Các nguyên tắc làm việc với UserForm như thiết lập và thay đổi thuộc tính, gọi các phương
thức hay xử lý các sự kiện đã được trình bày ở phần trước. Dưới đây chỉ giới thiệu một số
phương thức khác của UserForm.
Ø Hiển thị UserForm: thực hiện phương thức Show
Tên_UserForm.Show [vbModal/ vbModeless]
Nếu dùng vbModal (hoặc 1): hộp thoại (UserForm) sẽ hiển thị ở dạng Modal – tức là luôn tiếp
nhận tương tác người dùng với hộp thoại, người dùng chỉ có thể chuyển hướng tương tác sang
nơi khác khi đóng hộp thoại. Đây là kiểu hiển thị mặc định của hộp thoại.
Nếu dùng vbModeless (hoặc 0): hộp thoại vẫn được hiển thị nhưng người dùng có thể chuyển
hướng tương tác sang nơi khác mà không cần đóng hộp thoại.
Ø Ẩn UserForm: gọi phương thức Hide
Tên_UserForm.Hide
Ø Quay lại trạng thái trước lệnh cuối cùng được thực hiện trên UserForm: thực hiện phương
thức UndoAction
Tên_UserForm.UndoAction
Ø Trả lại trạng thái trước khi thực hiện Undo: thực hiện phương thức RedoAction
Tên_UserForm.RedoAction
CHÚ Ý Với chương trình sử dụng nhiều UserForm, để tránh nhầm lẫn trong khi sử dụng
chương trình, chỉ nên hiển thị UserForm cần dùng còn những UserForm khác thì ẩn đi.
Trước khi gọi phương thức Show của UserForm cần hiển thị, phải ẩn UserForm không dùng
đến bằng phương thức Hide của nó.
Ví dụ
Tạo một UserForm với các điều khiển như hình dưới đây:
Trình tự thực hiện như sau:
1. Thêm một UserForm vào dự án.
trong hộp công cụ điều khiển (Control
2. Chọn vào UserForm vừa tạo, chọn biểu tượng
Toolbox). Sau đó, rê thả chuột trên UserForm để tạo một hộp văn bản (TextBox).
69
3. Tiếp tục chọn UserForm trên, chọn biểu tượng
trong hộp công cụ điều khiển, rê thả
chuột để tạo một nút lệnh (Command Button), đặt tên (thuộc tính Name) của nút lệnh là
cmdUndo, đặt tiêu đề (thuộc tính Caption) của nút lệnh là Undo.
4. Tương tự như trên tạo nút lệnh cmdRedo với tiêu đề Redo.
5. Viết các thủ tục sự kiện Click cho các nút lệnh trên như sau:
Private Sub cmdRedo_Click()
Me.RedoAction
End Sub
Private Sub cmdUndo_Click()
Me.UndoAction
End Sub
Sau đó, chọn UserForm và nhấn phím F5 để chạy chương trình. Nhập một dòng văn bản vào
trong hộp văn bản. Kích chuột vào nút Undo, sau đó là nút Redo và theo dõi kết quả.
11.3. Các điều khiển thông dụng
Theo mặc định, trên Toolbox có sẵn một số điều khiển thông dụng trong thẻ Control, những
điều khiển này đáp ứng được hầu hết nhu cầu thiết kế giao diện thông thường trên UserForm.
Trong những phần trước đã nhắc nhiều đến việc sử dụng các điều khiển trên Toolbox nhưng
chưa có tính hệ thống vì vậy phần này sẽ trình bày những nội dung cơ bản để có thể sử dụng
một cách hiệu quả các điều khiển này.
2
3
6
7
5
4
1
8
9
Hình III-23: Các điều khiển cơ bản theo mặc định trong VBA IDE
Nút lệnh (Command Button)
Ø Command Button thường được dùng để thực hiện một quyết định nào đó từ phía người
dùng (thông qua việc kích chuột vào Command Button hoặc nhấn Enter).
Ø Command Button nên có thuộc tính Caption (tiêu đề) và Picture (hình ảnh) phản ánh
đúng tính năng mà nó đảm nhận. Sự kiện hay được gọi khi sử dụng Command Button là
sự kiện Click hoặc DblClick (kích đúp chuột).
Ø Để thay đổi vị trí của Command Button trong khi chạy chương trình, sử dụng phương
thức Move
Tên_Command Button.Move [Left ], [Top], [Width], [Height]
Trong đó các tham số thể hiện vị trí góc trái trên (left, top) và kích thước (Width, Height)
mới của Command Button sau khi di chuyển.
70
CHƯƠNG III: CƠ BẢN VỀ NGÔN NGỮ LẬP TRÌNH VISUAL BASIC
Ø Để thiết lập trạng thái nhận lệnh (nhận tiêu điểm – focus), sử dụng phương thức
SetFocus
Tên_Command Button.SetFocus
Các phương thức Move và SetFocus như trên không chỉ áp dụng đối với Command Button, mà
còn được áp dụng với đa số các điều khiển khác.
Hộp văn bản (TextBox)
TextBox được dùng để nhập dữ liệu dạng văn bản (text) và nó được điều khiển bằng cách thiết
lập những thuộc tính hay sự kiện hoặc sử dụng các phương thức phù hợp. Dưới đây là một số
thành ph