You are on page 1of 55

TỰ ĐỘNG HOÁ THIẾT KẾ CẦU ĐƯỜNG Lập trình trên ứng dụng nền

MÔN HỌC TỰ ĐỘNG HÓA THIẾT KẾ CẦU ĐƯỜNG


PHẦN: LẬP TRÌNH TRÊN ỨNG DỤNG NỀN
1. Tổng quan
Ngày nay, sự phát triển mạnh mẽ về nhiều mặt của máy tính (phần cứng) cũng như các
chương trình ứng dụng (phần mềm) đã tạo ra một tiền đề rất thuận lợi cho việc ứng dụng
máy tính trong quá trình lập hồ sơ thiết kế của các loại công trình xây dựng. Thực tế đã
chứng tỏ rằng, hiện nay, hầu hết các đơn vị tư vấn thiết kế đều trang bị hệ thống phần cứng
và phần mềm để phục vụ công tác thiết kế, nói cách khác, mức độ tin học hoá trong thiết
kế đã được chú trọng và đang trong giai đoạn phát triển rất nhanh. Mức độ này được đánh
giá chủ yếu dựa trên khả năng ứng dụng chương trình máy tính trong các bước của quá
trình thiết kế.
Phần mềm phục vụ việc thiết kế công trình giao thông, nói chung, hiện có nhiều về số
lượng nhưng có thể được chia làm hai loại chính:
§ Các phần mềm do đơn vị tư vấn thiết kế tự phát triển, hầu hết là các phần mềm
có quy mô không lớn và tập trung giải quyết các bài toán cục bộ, chuyên biệt
trong lĩnh vực chuyên ngành.
§ Các phần mềm thương mại do các công ty tin học chuyên nghiệp thực hiện,
chúng có quy mô lớn, giải quyết được những bài toán chính, phổ biến.
Tuy nhiên các phần mềm này vẫn còn những khiếm khuyết bởi sự đa dạng của thực tế thiết
kế. Chính vì vậy, việc xây dựng thêm những chương trình mới, như là một công cụ bổ
sung, nhằm khắc phục những khiếm khuyết trên là cần thiết và có tính hiệu quả cao.
Trong hồ sơ thiết kế công trình giao thông, với đặc điểm là phần bản vẽ và bản tính chiếm
một khối lượng đáng kể, nên hiện nay, AutoCAD và Microsoft Excel được sử dụng rất phổ
biến bởi chúng đáp ứng rất tốt nhiệm vụ trên. Hai phần mềm này, ngoài tính dễ dùng,
chúng còn có chung một đặc điểm rất quan trọng mà các phần mềm khác không có được,
đó là khả năng cho phép sử dụng chính bản thân chúng làm nền để xây dựng những phần
mềm chuyên dụng khác. Và vì vậy, AutoCAD và Excel trong giáo trình này còn được gọi
là ứng dụng nền (theo quan niệm này thì hệ điều hành Windows cũng chính là một loại
ứng dụng nền nhưng cơ bản nhất, là nền tảng để xây dựng mọi loại chương trình ứng dụng
khác nhau).

Ứng dụng mở rộng

Ứng dụng nền

Hệ điều hành

-1-
TỰ ĐỘNG HOÁ THIẾT KẾ CẦU ĐƯỜNG Lập trình trên ứng dụng nền

Phần mềm được xây dựng dựa trên nền AutoCAD hay Excel đều có thể tận dụng được hầu
hết những tính năng sẵn có của các ứng dụng nền đó, ví dụ khi xây dựng chương trình trên
AutoCAD, ta có thể tận dụng sức mạnh của giao diện đồ hoạ rất mạnh và nổi tiếng của
AutoCAD, tận dụng được khả năng in ấn chuyên nghiệp và kết nối bản vẽ với các ứng
dụng khác. Nói cách khác, ta sẽ có được một ứng dụng chuyên nghiệp mà không cần phải
tiêu tốn quá nhiều thời gian, công sức, không phải quan tâm đến những vấn đề kỹ thuật lập
trình hệ thống phức tạp.
Trong thực tế, Excel thường được dùng như là một ứng dụng hỗ trợ tính toán bởi nó có
một giao diện rất thích hợp cho công việc này và bên trong nó có sẵn rất nhiều tính năng
hỗ trợ tính toán cùng với khả năng tự cập nhật nội dung khi có thay đổi. Đối với những bài
toán phức tạp, mà những công cụ có sẵn trong Excel không đáp ứng được thì việc bổ sung
thêm là rất cần thiết, chẳng hạn như việc nội suy từ các bảng tra, một việc thường gặp
trong tính toán và mất nhiều thời gian khi làm thủ công.
AutoCAD, với khả năng hỗ trợ tạo bản vẽ kỹ thuật rất xuất sắc và cho phép lập trình trên
nó, khiến cho AutoCAD hiện đang là một ứng dụng được sử dụng phổ biến nhất trong thiết
kế cũng như làm nền để xây dựng các ứng dụng khác.
Có rất nhiều cách thức để lập trình trên ứng dụng nền, chẳng hạn như đối với AutoCAD, ta
có thể xây dựng chương trình bằng Visual LISP, ObjectARX hay Visual Basic for
Application (VBA). Tuy nhiên, trong phạm vi tài liệu này, chỉ đề cập đến VBA bởi nó dễ
dùng, nhiều tài liệu tham khảo và thích hợp cho hầu hết các bài toán có quy mô không lớn.
Tổng quan về VBA
VBA là công nghệ phát triển nhanh phần mềm đượ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 COM. Bằng cách sử dụng VBA, người
sử dụng sẽ có được rất nhiều lợi thế:
§ VBA bao gồm một môi trường phát triển tích hợp sẵn trong ứng dụng nền (VBA
Integrated Development Environment – VBA IDE), giúp người dùng có thể mở
rộng ứng dụng nền một cách dễ dàng mà không cần thêm một công cụ lập trình
nào khác, giúp tiết kiệm được thời gian và tiền bạc.
§ VBA sử dụng ngôn ngữ lập trình Visual Basic, một ngôn ngữ lập trình tương đối
dễ sử dụng và cũng là ngôn ngữ lập trình phổ biến nhất thế giới. Do đó, người
dùng có thể dễ dàng trao đổi kỹ năng, tìm kiếm tài liệu cũng như mã nguồn để
phục vụ cho nhu cầu mở rộng ứng dụng nền.
§ VBA trong mỗi ứng dụng được dựa trên mô hình đối tượng của ứng dụng nền,
nên người sử dụng có thể phát triển ứng dụng một cách nhanh chóng và dễ dàng
hơn, do đã quen thuộc với cách thức thao tác trong các ứng dụng nền.
§ Do được tích hợp chặt chẽ trong ứng dụng nền, các chương trình viết bằng VBA
sẽ có tốc độ thực thi nhanh hơn so với những chương trình ngoài khác.
§ Các chương trình viết bằng 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.
§ Microsoft Excel và AutoCAD đều hỗ trợ VBA và cung cấp một hệ thống tài liệu
trợ giúp rất phong phú, giúp phát triển ứng dụng một cách nhanh chóng và dễ
dàng.

-2-
TỰ ĐỘNG HOÁ THIẾT KẾ CẦU ĐƯỜNG Lập trình trên ứng dụng nền

2. Giới thiệu về VBA IDE

Các thành phần cơ bản của VBA IDE bao gồm:


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.
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.

-3-
TỰ ĐỘNG HOÁ THIẾT KẾ CẦU ĐƯỜNG Lập trình trên ứng dụng nền

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…

3. Cấu trúc dự án VBA


Khi phát triển một ứng dụng mở rộng trên ứng dụng nền bằng VBA, tất cả chương trình đó
sẽ được lưu trữ trong một dự án, gọi dự án VBA (VBA project).
Mỗi dự án VBA bao gồm: Code Modules (mô-đun mã lệnh), Class Modules (mô đun lớp)
và Userform (hộp thoại người dùng).
§ Code Module: là nơi chứa tất cả các mã lệnh chính của chương trình;
§ Class Module: là nơi chứa định nghĩa cho các lớp của dự án;
§ Userform: là nơi chứa giao diện dạng hộp thoại của dự án để nhập số liệu, xuất
kết quả và giao tiếp với người sử dụng 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 phải tạo hộp thoại người dùng.
Cũng như Visual Basic, mã lệnh trong dự án VBA được tổ chức thành các chương trình
con là: hàm (Function) và thủ tục (Sub). Chi tiết về ngôn ngữ lập trình Visual Basic, có thể
tham khảo trong cách tài liệu về lập trình Visual Basic và trong phần tóm tắt ở phụ lục của
tài liệu này.

4. Microsoft Excel và lập trình trên Microsoft Excel


4.1. Microsoft Excel
Microsoft Excel là một phần mềm chuyên xử lý bảng tính của hãng phần mềm nổi tiếng
Microsoft. Excel thực sự là một công cụ rất mạnh mẽ phục vụ công tác tính toán, lập bảng
biểu…
Giao diện của chương trình Excel như sau:

-4-
TỰ ĐỘNG HOÁ THIẾT KẾ CẦU ĐƯỜNG Lập trình trên ứng dụng nền

Với các bài toán từ đơn giản đến phức tạp, ta đều có thể sử dụng Excel để giải quyết một
cách dễ dàng với rất nhiều tính năng sẵn có:
§ Khả năng tổ chức dữ liệu mạnh mẽ với hệ thống các ô, vùng dữ liệu, các bảng
tính…;
§ Khả năng xử lý dữ liệu như truy vấn, lọc, tính toán… với hệ thống rất phong phú
các hàm cơ bản cũng như các hàm chức năng chuyên biệt;
§ Khả năng lập báo cáo với cách tổ chức bảng biểu và hệ thống biểu đồ tương đối
hoàn chỉnh;
§ Khả năng in ấn với nhiều lựa chọn khác nhau.
Với cách tổ chức giống như bảng tính thông thường, Excel là một phần mềm bảng tính trực
quan và rất dễ sử dụng.
Tuy nhiên, những chức năng phong phú đó cũng không thể nào đáp ứng được nhu cầu hết
sức đa dạng của thực tiễn. Và bằng cách kết hợp các tính năng sẵn có của Excel, cộng với
một ít kiến thức về lập trình, ta có thể giải quyết được những bài toán đó một cách dễ dàng.
Để lập trình trên Excel, ta có thể thực hiện theo nhiều cách khác nhau:
§ Thông qua bộ công cụ lập trình Visual Studio Tools for Office (VSTO): theo
cách này, người sử dụng có thể lập trình tạo ra các ứng dụng dạng add-in (ứng
dụng bổ sung trong Excel) bằng các ngôn ngữ được hỗ trợ trong bộ phần mềm
Microsoft Visual Studio.
§ Thông qua môi trường lập trình VBA được tích hợp sẵn trong Microsfot Excel:
người sử dụng có thể lập trình mở rộng Excel một cách dễ dàng với ngôn ngữ
lập trình VB.

-5-
TỰ ĐỘNG HOÁ THIẾT KẾ CẦU ĐƯỜNG Lập trình trên ứng dụng nền

4.2. Lập trình trên Excel bằng VBA


4.2.1. Cách tạo và sử dụng Macro
Macro là tập hợp các lệnh và hàm được lưu trữ trong một môđun của VBA nhằm thực hiện
một nhiệm vụ nào đó. Mỗi khi người dùng thực thi Macro thì nhiệm vụ được cài đặt trong
Macro đó sẽ được thực hiện. Điều này hết sức hữu ích khi cần thực hiện những thao tác lặp
đi, lặp lại nhiều lần hoặc khi người dùng muốn tạo ra một số tính năng mới cho ứng dụng
nền.

4.2.1.1. Tạo Macro


Để tạo Macro, ta có thể thực hiện theo hai cách chính sau:
§ Tạo Macro kịch bản,
§ Tạo Macro sử dụng VBA.
Tạo Macro kịch bản là cách đơn giản nhất để tạo Macro. Theo cách này, Excel lưu lại tất
cả các lệnh trong mỗi bước khi người dùng thực hiện một nhiệm vụ nào đó. Khi người
dùng thực thi Macro kịch bản, tất cả các lệnh đã thực hiện sẽ được thực hiện lại đúng theo
trình tự như trong quá trình tạo Macro kịch bản.

Để tạo Macro kịch bản, ta làm theo các bước sau:


1 Trong trình đơn Tools, chọn MacroðRecord New Macro…
2 Trong mục Macro name, nhập tên của Macro

CHÚ Ý Tên Macro phải được bắt đầu bằng chữ cái thông thường, các ký tự còn lại có thể là kiểu
chữ hoặc kiểu chữ số hoặc dấu gạch dưới. Không được sử dụng dấu cách để đặt tên Macro, muốn
phân cách từ, ta có thể dùng dấu gạch dưới để thay cho dấu cách (xem hình).
Không được đặt tên Macro trùng với tên của vùng đã được định nghĩa trong Workbook hiện hành

3 Nếu muốn thực thi Macro bằng cách nhấn phím tắt, nhập một chữ cái thông thường
vào ô Shortcut Key. Sau đó, để thực thi Macro, ta chỉ cần nhấn tổ hợp phím
CTRL+Chữ cái (với chữ viết thường) hoặc CTRL+SHIFT+Chữ cái (với chữ viết hoa).
Chữ cái đặt làm phím tắt không được phép là số hay các ký tự đặc biệt như @ hoặc #.
Phím tắt này sẽ làm vô hiệu hoá các phím tắt giống như vậy đã được đặt trước trong
Excel mỗi khi mở Workbook có chứa Macro.
4 Trong mục Store Macro In, chọn nơi sẽ lưu trữ Macro. Nếu muốn Macro có hiệu lực
mỗi khi sử dụng Excel, ta chọn vào mục Personal Macro Workbook.
5 Nếu cần mô tả thêm về Macro này, ta sẽ nhập thêm các thông tin vào mục Description.

-6-
TỰ ĐỘNG HOÁ THIẾT KẾ CẦU ĐƯỜNG Lập trình trên ứng dụng nền

6 Chọn OK.
7 Trong quá trình tạo Macro kịch bản, nếu muốn lưu địa chỉ ô tương đối so với ô hiện

hành, ta làm như sau: trên thanh công cụ Stop Recording , chọn vào biểu
tượng Relative Reference . Kể từ thời điểm ấy, địa chỉ ô sẽ được lưu tương đối so
với ô hiện hành cho đến khi thoát khỏi Excel hoặc chọn một lần nữa vào biểu tượng
Relative Reference .
8 Thực hiện các thao tác mà sau này sẽ được lặp lại khi Macro kịch bản thực thi (đây là
phần nội dung chính của Macro kịch bản).
9 Trên thanh công cụ Stop Recording, nhấn chuột vào biểu tượng Stop Recording
để hoàn thành việc tạo Macro kịch bản. Lúc này Macro đã sẵn sàng để sử dụng.

4.2.1.2. Sử dụng Macro


Để sử dụng Macro đã được tạo trước, ta có thể thực thi theo nhiều cách khác nhau:
§ Thực thi Macro theo cách thông thường;
§ Thực thi bằng cách dùng phím tắt đã gán cho Macro;
§ Thực thi bằng cách nhấn chuột vào một nút lệnh hay một điều khiển đồ hoạ;
§ Thực thi bằng cách nhấn chuột vào một đối tượng đồ hoạ;
§ Thực thi thông qua nút lệnh trên thanh công cụ.
Chi tiết về các cách thực thi Macro xin tìm hiểu thêm trong tài liệu “Microsoft Office Excel
Help” được cài đặt sẵn cùng Excel. Ở đây chỉ trình bày cách thực thi Macro theo cách
thông thường.

Để thực thi Macro theo cách thông thường, ta thực hiện theo các bước sau:
1 Mở Workbook có chứa Macro;
2 Trên trình đơn Tools chọn MacroðMacros… để hiển thị hộp thoại Macro

3 Trong mục Macro name, nhập vào tên Macro đã tạo từ trước hoặc chọn từ danh sách
sổ xuống;

-7-
TỰ ĐỘNG HOÁ THIẾT KẾ CẦU ĐƯỜNG Lập trình trên ứng dụng nền

4 Nhấn chuột vào nút Run để bắt đầu thực thi Macro. Ấn phím ESC để kết thúc quá trình
thực thi Macro.

CHÚ Ý Do Macro có chứa mã lệnh thực thi có khả năng chứa các đoạn mã nguy hiểm làm ảnh
hưởng đến hệ thống, nên mặc định Excel luôn đặt chế độ an ninh ở mức cao nhất, và do đó sẽ
làm vô hiệu hoá Macro có chứa trong Workbook của Excel. Vì vậy, để thực thi Macro chứa trong
Workbook, người sử dụng phải thiết lập lại chế độ an ninh cho Excel ở mức Trung bình (Medium)
hoặc Thấp (Low). Người sử dụng nên đặt mức Trung bình để đảm bảo tính an toàn cho hệ thống.
Để thiết lập chế độ an ninh cho Excel, trong trình đơn Tools, chọn MacroðSecurity…; trong thẻ
Security Level, chọn mức an ninh phù hợp và nhấn OK.

4.2.2. Tạo Macro với VBA


Macro kịch bản là hình thức Macro đơn giản nhất. Thực chất, Macro kịch bản chính là
Macro được viết bằng VBA, tuy nhiên tất cả các dòng mã lệnh đều được tự động phát sinh
tương ứng với từng thao tác mà người dùng thực hiện khi tiến hành ghi lại Macro. Điều
này tạo nên tính dễ sử dụng cho người dùng, chỉ cần nắm một ít kiến thức về Macro, người
sử dụng có thể tạo dựng ngay một Macro đáp ứng nhu cầu của bản thân.
Tuy nhiên, để tạo ra Macro có khả năng tuỳ biến và nhiều tính năng nâng cao hơn, người
dùng cần phải có kiến thức về lập trình và tận dụng môi trường phát triển ứng dụng tích
hợp sẵn trong Microsoft Excel, đó chính là VBA IDE. Mỗi Macro tương ứng là một
chương trình con trong VBA.
Để tạo mới một Macro sử dụng VBA, cần thực hiện những bước sau:
1 Trong trình đơn Tools, chọn mục MacroðVisual Basic Editor để khởi động VBA
IDE;

-8-
TỰ ĐỘNG HOÁ THIẾT KẾ CẦU ĐƯỜNG Lập trình trên ứng dụng nền

2 Trong trình đơn Insert, chọn mục Module để tạo một mô-đun mới, là nơi sẽ chứa
Macro;

3 Trong trình đơn Insert, chọn mục Procedure… để hiển thị hộp thoại Add Procedure;

4 Trong hộp thoại Add Procedure, điền tên chương trình vào mục Name, chọn kiểu
chương trình con là Sub và phạm vi là Public

5 Viết mã lệnh cho Macro trong cửa sổ mã lệnh của VBA IDE bằng ngôn ngữ Visual
Basic;
6 Để thực thi Macro ngay từ trong cửa sổ mã lệnh, ấn phím F5;
7 Sau khi đã hoàn thành quá trình viết mã lệnh cho Macro, chọn mục Close and Return
to Microsoft Excel trong trình đơn File để trở về màn hình chính của Excel.

-9-
TỰ ĐỘNG HOÁ THIẾT KẾ CẦU ĐƯỜNG Lập trình trên ứng dụng nền

CHÚ Ý Do Macro là một chương trình con dạng thủ tục, nên để Macro có thể được hiển thị và thực
thi thông qua trình đơn ToolsðMacroðMacros… thì khi tạo Macro ở bước 4, trong hộp thoại
Add Procedure, người dùng phải chọn kiểu chương trình con là Sub và phạm vi là Public.

4.2.3. Tạo hàm mới trong Excel bằng VBA

4.2.3.1. Khái niệm về hàm trong Excel


Hàm là những công thức đã được định nghĩa sẵn trong Excel thực hiện tính toán dựa trên
các số liệu đầu vào, gọi là tham số, theo một trình tự đã được lập trình sẵn nhằm thực hiện
các phép tính từ đơn giản đến phức tạp.
Để hiểu rõ hơn về cấu trúc của một hàm, ta tìm hiểu về hàm ROUND có sẵn trong Excel,
là hàm dùng để làm tròn số:

1 Cấu trúc. Một hàm bắt đầu bằng dấu bằng “=”, tiếp sau là tên hàm, dấu ngoặc đơn “(“,
danh sách các tham số cách nhau bằng dấu phẩy “,” và cuối cùng là dấu ngoặc đơn “)”.
2 Tên hàm. Ấn phím SHIFT+F3 để hiển thị danh sách tất cả các hàm trong Excel.
3 Các tham số. Tham số có thể là số, chữ, giá trị logic như TRUE hoặc FALSE, mảng, giá
trị lỗi như #NA, hoặc tham chiếu đến một ô khác. Tham số truyền vào phải có kiểu
thích hợp với kiểu của từng tham số của hàm. Tham số truyền vào có thể là một hằng
số, công thức, hoặc là một hàm bất kỳ.
4 Chú thích hàm. Chú thích hàm dùng để thể hiện cấu trúc và danh sách các tham số của
hàm, hiện lên khi ta nhập vào tên hàm. Chú thích hàm chỉ xuất hiện đối với những hàm
được xây dựng sẵn trong Excel.
Có rất nhiều hàm đã được xây dựng sẵn trong Excel và được nhóm theo từng lĩnh vực như:
toán học, thống kê, xử lý chuỗi, xử lý dữ liệu thời gian… Tuy nhiên trong nhiều trường
hợp, các hàm có sẵn này không đáp ứng được các yêu cầu của bài toán cụ thể, vì thế việc
xây dựng hàm mới, nhằm đáp ứng được yêu cầu tính toán là việc rất cần thiết.

- 10 -
TỰ ĐỘNG HOÁ THIẾT KẾ CẦU ĐƯỜNG Lập trình trên ứng dụng nền

4.2.3.2. Tạo hàm mới bằng VBA


Xây dựng hàm mới trong Excel là hoàn thoàn có thể và được Excel hỗ trợ tối đa như cho
phép sử dụng toàn bộ các hàm đã có từ trước, cho phép tận dụng toàn bộ giao diện của
Excel. Công cụ để tạo hàm mới trong Excel là VBA và người dùng phải tuân theo một
trình tự nhất định. Để làm rõ hơn vấn đề này, ta sẽ tìm hiểu thông qua ví dụ đơn giản dưới
đây, đó là xây dựng một hàm mới tên là Dien_Tich, có nhiệm vụ tính diện tích của một
hình chữ nhật.
Phân tích nhiệm vụ trên, ta nhận thấy: cần phải tạo được một hàm mới, sao cho khi sử
dụng trong Excel không có sự khác biệt so với các hàm có sẵn, nghĩa là sẽ nhập vào công
thức có dạng =Dien_Tich(Tham_số, Tham_số), trong đó Tham_số là chiều dài và
chiều rộng của hình chữ nhật, có thể là một số, công thức khác hoặc một tham chiếu đến
một ô khác trong bảng tính. Kiểu dữ liệu của Tham_số là kiểu số thực, và giá trị trả về của
hàm cũng phải có kiểu dữ liệu là số thực nhằm đảm bảo tính tổng quát của hàm.

Để tạo một hàm mới, ta thực hiện theo các bước sau:
1 Khởi động VBA IDE. Trong trình đơn Tools, chọn mục MacroðVisual Basic Editor;
2 Trong trình đơn Insert, chọn mục Module để tạo một mô-đun mới, nơi sẽ chứa hàm do
người dùng định nghĩa.
3 Trong trình đơn Insert, chọn mục Procedure… để hiển thị hộp thoại Add Procedure.
Sau đó điền tên hàm vào mục Name, chọn kiểu chương trình con là Function và phạm
vi là Public. Cuối cùng chọn OK;

4 Chương trình sẽ tự động phát sinh đoạn mã lệnh như sau:


Public Function Dien_Tich()

End Function
Thay đoạn mã lệnh trên bằng đoạn mã lệnh sau:
Public Function Dien_Tich(Rong As Double, Cao As Double) As
Double
Dien_Tich = Rong*Cao
End Function

- 11 -
TỰ ĐỘNG HOÁ THIẾT KẾ CẦU ĐƯỜNG Lập trình trên ứng dụng nền

5 Trong trình đơn File, chọn mục Close and Return to Microsoft Excel để quay trở về
màn hình chính của Excel;
6 Lúc này, hàm mà ta vừa xây dựng, có tên là Dien_Tich, đã có thể được sử dụng bình
thường như các hàm khác của Excel.

CHÚ Ý: Các bước tạo hàm mới cũng tương tự như các bước tạo Macro ở phần trước. Tuy nhiên,
do hàm cần phải có giá trị trả về nên khi khai báo kiểu chương trình con cho hàm, người dùng cần
phải chọn là Function (khác với khi tạo Macro, phải chọn là Sub).

Tất cả các hàm do người dùng định nghĩa thực hiện theo các bước như trên chỉ có phạm vi
hiệu lực trong tài liệu (workbook) có chứa hàm đó mà thôi. Do vậy, khi có nhu cầu tạo lập
các hàm mới để sử dụng cho tất cả các tài liệu trong Excel thì người dùng phải tạo hàm
trong một tệp tài liệu đặc biệt có tên là Personal.xls. Tất cả các hàm hoặc Macro khi được
tạo và lưu trong tệp Personal.xls đều có thể được sử dụng lại trong tất cả các phiên làm
việc tiếp sau của Microsoft Excel. Cách thức tạo Macro và hàm mới trong tệp Personal.xls
hoàn toàn tương tự như cách thức tạo Macro và hàm mới như đã được trình bày. Điều quan
trọng là mặc định tệp Personal.xls luôn có thuộc tính ẩn, nên người dùng sẽ không thể
nhìn thấy được tệp tài liệu này. Để hiển thị được tệp tài liệu ẩn này, người dùng có thể thực
hiện theo nhiều cách khác nhau. Trong khuôn khổ của tài liệu này, xin được giới thiệu
phương thức sau:
1 Trong trình đơn Tools của Microsoft Excel, chọn mục MacroðRecord New Macro…
2 Trong hộp thoại Record Macro, ta nhập tên Macro bất kỳ, trong mục Store macro in
bắt buộc phải chọn là Personal Macro Workbook, sau đó chọn OK. Nhấn ngay chuột
vào nút Stop Recording để kết thúc.

- 12 -
TỰ ĐỘNG HOÁ THIẾT KẾ CẦU ĐƯỜNG Lập trình trên ứng dụng nền

3 Ấn phím ALT+F11 để khởi động VBA IDE. Trong cửa số Project Explorer đã xuất
hiện thêm một dự án có tên là Personal.xls. Nhấn đúp chuột vào nhánh Module1, khi
đó trong cửa sổ mã lệnh sẽ xuất hiện dòng mã lệnh như sau:

Sub Ten_Macro_bat_ky()
'
' Ten_Macro_bat_ky Macro
'Macro recorded 1/8/2007 by
TTH
'

End Sub

4 Xoá toàn bộ đoạn mã lệnh trên. Sau đó tiến hành tạo Macro hoặc hàm mới trong
Module1 của tệp Personal.xls.
5 Trong trình đơn File của VBA IDE, chọn mục Save PERSONAL.XLS để lưu những
thay đổi vào tệp Personal.xls.
6 Với những lần tạo hàm sau, người dùng chỉ cần khởi động VBA IDE sẽ thấy tệp
Personal.xls đã được hiển thị sẵn, không cần phải thực hiện lại các bước từ bước 2 đến
bước 3.

CHÚ Ý: Mặc định, tệp Personal.xls được lưu trong thư mục sau: “C:\Documents and
Settings\<Tên người dùng>\Application Data\Microsoft\Excel\XLSTART “

4.2.4. Hệ thống các đối tượng trong Excel

4.2.4.1. Mô hình đối tượng của Microsoft Excel


Để tạo cái nhìn tổng quan cho người lập trình, Microsoft cung cấp cho người lập trình mô
hình đối tượng được sử dụng trong Microsoft Excel. Mô hình đối tượng đầy đủ được trình
bày trong tài liệu hướng dẫn của Excel. Ở đây xin được giới thiệu lại mô hình đối tượngvới
một số đối tượng thường được sử dụng trong lập trình mở rộng Excel.

- 13 -
TỰ ĐỘNG HOÁ THIẾT KẾ CẦU ĐƯỜNG Lập trình trên ứng dụng nền

Application

Workbooks

Workbook

Worksheets
Rows
Worksheet

Columns
Chú giải:
Range
Tập đối tượng

Đối tượng
Cells

4.2.4.2. Giới thiệu về các đối tượng trong Excel


Đối tượng là một thực thể đại diện cho một thành phần nào đó của ứng dụng, chẳng hạn
như đối tượng bảng tính (Worksheet), ô (Cell),… Mỗi một đối tượng có hệ thống các
phương thức và thuộc tính. Để truy cập vào các thuộc tính và phương thức của đối tượng,
ta sử dụng cú pháp <Tên_đối_tượng>.<Thuộc_tính/Phương_thức>. Trong VB, ta
cần phải khai báo và gán đối tượng trước khi sử dụng các phương thức của đối tượng hay
thay đổi thuộc tính của đối tượng.
Lấy ví dụ gán giá trị cho ô “A1” của bảng tính hiện hành, ta thực hiện như sau:
ThisWorkbook.ActiveSheet.Range("A1").Value = 15
Tập đối tượng thực chất cũng là một đối tượng, nhưng đối tượng này có thể chứa nhiều
loại đối tượng tương tự nhau. Mặc dù vậy, các đối tượng trong tập đối tượng vẫn có thể
được xử lý bằng các kỹ thuật như nhau. Tập đối tượng cũng có các phương thức và thuộc
tính. Ví dụ như tập đối tượng Workbooks chứa tất cả các đối tượng Workbook đang được
mở trong Excel, đồng thời cũng có phương thức Add để thêm Workbook mới. Để truy cập
vào một đối tượng trong tập đối tượng, ta sử dụng các chỉ số hoặc tên của đối tượng cần
truy cập theo cú pháp:
<tập_đối_tượng>(chỉ_số/tên_đối_tượng).<thuộc_tính/phương_thức>.
Lấy ví dụ khi ta muốn đóng tài liệu đầu tiên trong tập đối tượng tài liệu (Workbook), ta
thực hiện như sau:
Sub CloseFirst()
Workbooks(1).Close
End Sub
Hệ thống đối tượng của Microsoft Excel rất phong phú, nhưng trong khuôn khổ của
chương trình, chỉ giới thiệu một số đối tượng thường dùng, bao gồm:

- 14 -
TỰ ĐỘNG HOÁ THIẾT KẾ CẦU ĐƯỜNG Lập trình trên ứng dụng nền

a. Đối tượng ứng dụng (Application)


Đối tượng Application được hiểu là toàn bộ chương trình Excel mà người dùng đang
làm việc trên đó. Mỗi lần chạy chương trình Excel là một đối tượng Application sẽ
được tạo ra. Đối tượng Application có chứa nhiều thiết lập cho ứng dụng (chẳng hạn
như các lựa chọn trong trình đơn ToolsðOptions…) và rất nhiều đối tượng trong ứng
dụng (chẳng hạn như các tài liệu đang được mở - Workbooks, hay bảng tính hiện hành -
ActiveSheet…).
Việc tạo mới một đối tượng Application tương đương với việc khởi động chương trình
Excel. Đoạn mã lệnh sau sẽ khởi động chương trình Excel từ chương trình ngoài và sẽ mở
một tài liệu trong Excel
Set xl = CreateObject("Excel.Sheet")
xl.Application.Workbooks.Open "newbook.xls"
Còn ở bên trong Excel (trong VBA dành cho Excel), ta bỏ qua bước khởi động Excel và
thực hiện mở một tài liệu như sau :
Workbooks.Open "newbook.xls"
Một số thuộc tính trong đối tượng Application thường được sử dụng như sau:

Thuộc tính Mô tả

ActiveCell trả về đối tượng kiểu Range thể hiện ô hiện hành của tài liệu hiện hành.

ActiveSheet Trả về đối tượng thể hiện bảng tính hiện hành của tài liệu hiện hành. Nếu
không có bảng tính hiện hành, thuộc tính này sẽ trả về giá trị Nothing.

ActiveWindow Trả về đối tượng kiểu Window thể hiện cửa sổ hiện hành. Nếu không có
cửa sổ nào mở sẽ trả về giá trị Nothing.

ActiveWorkbook Trả về đối tượng kiểu Workbook, thể hiện tài liệu trong cửa sổ hiện hành.
Sẽ trả về giá trị Nothing nếu không có cửa sổ nào được mở.

Workbooks Trả về tập đối tượng Workbooks thể hiện tất cả các tài liệu đang mở. Ta có
thể truy cập vào một tài liệu bất kỳ thông qua chỉ số hoặc tên của tài liệu.

CHÚ Ý: Với các phương thức và thuộc tính trả về các kiểu đối tượng phổ biến, chẳng hạn như ô
hiện hành (thuộc tính ActiveCell), ta có thể truy cập mà không cần sử dụng đối tượng Application ở
trước. Chẳng hạn như, thay vì viết đoạn mã Application.ActiveCell.Font.Bold=True ,
ta có thể viết ActiveCell.Font.Bold = True

b. Đối tượng tài liệu (Workbook)


Đối tượng tài liệu (Workbook) thể hiện một tài liệu Excel. Mỗi một tài liệu đang được mở
trong Excel tương ứng với một đối tượng Workbook. Đối tượng Workbook là một phần tử
của tập đối tượng Workbooks. Tập đối tượng Workbooks chứa tất cả các tài liệu hiện đang
được mở trong Excel.
Để truy cập vào đối tượng Workbook, ta có thể thực hiện thông qua:
§ Thuộc tính Workbooks
Đây chính là thuộc tính của đối tượng Application như đã được đề cập.

- 15 -
TỰ ĐỘNG HOÁ THIẾT KẾ CẦU ĐƯỜNG Lập trình trên ứng dụng nền

Để truy cập, ta sử dụng Workbooks(tên/chỉ_số), trong đó


<tên/chỉ_số> là tên hoặc chỉ số của một đối tượng Workbook. Ví dụ sau sẽ
kích hoạt tài liệu đầu tiên.
Workbooks(1).Activate
Chỉ số ở đây chính là thứ tự tạo hoặc mở các tài liệu. Workbooks(1) là tài
liệu đầu tiên, còn Workbooks(Workbooks.Count) là tài liệu cuối cùng
được tạo hoặc mở. Chỉ số này tính đến tất cả các tài liệu, ngay cả tài liệu đã
được ẩn đi.
§ Thuộc tính ActiveWorkbook
Đây cũng chính là một thuộc tính của đối tượng Application.
Thuộc tính này thể hiện tài liệu hiện hành trong Excel. Ví dụ sau sẽ thay đổi tên
tác giả của tài liệu hiện hành
ActiveWorkbook.Author = "TDHTKCĐ"
§ Thuộc tính ThisWorkbook
Thuộc tính này trả về đối tượng kiểu Workbook, nơi mà dòng mã lệnh Visual
Basic được thực thi. Trong hầu hết các trường hợp, thuộc tính này và thuộc tính
ActiveWorkbook là như nhau.
Để tạo mới, mở, hoặc đóng tài liệu, ta phải sử dụng một số phương thức của tập đối tượng
Workbooks:
§ Workbooks.Add: thêm một tài liệu mới vào Excel và đưa vào tập đối tượng
Workbooks.
§ Workbooks.Open “đường_dẫn”: mở một tài liệu có <đường_dẫn> được
chỉ định và đưa vào tập đối tượng Workbooks.
§ Workbooks.Close: đóng tất cả các tài liệu đang mở trong Excel.
§ Workbooks(chỉ_số/tên).Close: đóng một tài liệu có <chỉ_số/tên>
cho trước.
Một số thuộc tính và phương thức thường được sử dụng của đối tượng Workbook:

Phương thức Mô tả

Activate Kích hoạt tài liệu làm tài liệu hiện hành.

Close Đóng tài liệu.

Protect Bật chế độ bảo vệ, và do đó không thể chỉnh sửa tài liệu.

Unprotect([mật_khẩu]) Tắt chế độ bảo vệ. Khi tài liệu có đặt mật khẩu, ta phải thêm vào
tham số <mật_khẩu>.

Save Lưu tất cả các thay đổi trong tài liệu.

SaveAs Lưu tất cả các thay đổi trong tài liệu sang một tệp mới.

Chi tiết về tham số trong các phương thức, xin xem thêm tài liệu hướng dẫn của Microsoft
Excel.

- 16 -
TỰ ĐỘNG HOÁ THIẾT KẾ CẦU ĐƯỜNG Lập trình trên ứng dụng nền

Ví dụ sau sẽ tạo một tài liệu mới và nhắc người dùng nhập tên tệp, sau đó sẽ lưu lại tài liệu:
Set NewBook = Workbooks.Add
Do
fName = Application.GetSaveAsFilename
Loop Until fName <> False
NewBook.SaveAs Filename:=fName
Thuộc tính Mô tả

ActiveSheet Trả về bảng tính hiện hành của tài liệu.

Name Trả về tên của tài liệu.

Saved Kiểm tra xem tài liệu đã được lưu hay chưa. Trả về giá trị TRUE nếu tài liệu đã
được lưu, ngược lại là FALSE.

Worksheets Trả về tập đối tượng Worksheets, chứa tất cả các bảng tính trong tài liệu.

Ví dụ sau sẽ hiển thị thông báo nếu tài liệu chưa được lưu:
If Not ActiveWorkbook.Saved Then
MsgBox "Tài liệu vẫn chưa được lưu."
End If

c. Tập đối tượng Sheets


Tập đối tượng Sheets chứa tất cả các đối tượng biểu đồ (Chart) và bảng tính (Workbook)
trong tài liệu. Tập đối tượng Sheets rất hữu dụng khi ta muốn truy cập đến đối tượng mà
không cần phải biết rõ đối tượng đó là biểu đồ hay bảng tính. Ví dụ sau sẽ in tất cả các biểu
đồ và bảng tính
Sheets.PrintOut
Ta sử dụng phương thức Add để tạo một trang mới. Ví dụ sau sẽ thêm hai trang biểu đồ
vào tài liệu hiện hành và đặt sau trang thứ 2 trong tài liệu
Sheets.Add type:=xlChart, count:=2, after:=Sheets(2)

d. Đối tượng bảng tính (Worksheet)


Một đối tượng bảng tính (Worksheet) thể hiện một bảng tính trong tài liệu Excel. Trong
một tài liệu có thể có nhiều bảng tính khác nhau, tất cả các bảng tính này đều là phần tử
của tập đối tượng Worksheets, và đến lượt mình, Worksheets cũng là một thuộc tính của
đối tượng Workbook.
Đối tượng Worksheet được truy cập thông qua đối tượng Workbook, nơi chứa đối tượng
Worksheet, thông qua các thuộc tính sau
§ Thuộc tính Worksheets
Để truy cập, ta sử dụng Worksheets(tên/chỉ_số), trong đó
<tên/chỉ_số> là tên hoặc chỉ số của một đối tượng Worksheet. Ví dụ sau sẽ
ẩn bảng tính đầu tiên trong tài liệu hiện hành:
Worksheets(1).Visible = False

- 17 -
TỰ ĐỘNG HOÁ THIẾT KẾ CẦU ĐƯỜNG Lập trình trên ứng dụng nền

Chỉ số ở đây chính là thứ tự của bảng tính trên thanh công cụ chứa thẻ bảng
tính. Worksheets(1) là bảng tính đầu tiên (bảng tính ở bên trái nhất), còn
Worksheets(Worksheets.Count) là bảng tính cuối cùng. Chỉ số này tính
đến tất cả các bảng tính, ngay cả các bảng tính đã được ẩn đi.
§ Thuộc tính ActiveWorksheet
Khi một bảng tính đang hiện hành, ta có thể sử dụng thuộc tính này để tham
chiếu đến bảng tính đó.Ví dụ sau sẽ sử dụng phương thức Activate để kích hoạt
Sheet1 đặt hướng trang in và tiến hành in bảng tính:
Worksheets("Sheet1").Activate
ActiveSheet.PageSetup.Orientation = xlLandscape
ActiveSheet.PrintOut
Để thêm một đối tượng Worksheet, ta phải sử dụng các phương thức Add có trong tập đối
tượng Worksheets, <Worksheets.Add>. Bảng tính mới được thêm vào sẽ là bảng tính
hiện hành.
Dưới đây là một số phương thức và thuộc tính thường được sử dụng của đối tượng
Worksheet:

Phương thức Mô tả

Activate Kích hoạt bảng tính làm bản tính hiện hành

Calculate Thực hiện quá trình tính toán cho toàn bộ bảng tính hoặc cho một vùng được
chỉ định trước.

Copy Sao chép bảng tính đến một vị trí khác trong tài liệu.

Delete Xoá bảng tính.

Move Di chuyển bảng tính đến vị trí mới trong tài liệu.

Paste Dán nội dung trong bộ nhớ đệm vào bảng tính.

PrintOut In nội dung của bảng tính.

Protect Bật chế độ bảo vệ bảng tính, và do đó ta không thể chỉnh sửa nội dung bảng
tính được nữa.

Unprotect Tắt chế độ bảo vệ bảng tính.

Thuộc tính Mô tả

Cells Trả về đối tượng kiểu Range thể hiện tất cả các ô trong bảng tính.

Columns Trả về đối tượng kiểu Range thể hiện tất cả các cột trong bảng tính.

Index Trả về chỉ số của đối tượng Worksheet trong tập đối tượng Worksheets.

Name Tên của bảng tính.

PageSetup Trả về đối tượng PageSetup, nơi chứa thiết lập về trang in của bảng tính.

- 18 -
TỰ ĐỘNG HOÁ THIẾT KẾ CẦU ĐƯỜNG Lập trình trên ứng dụng nền

Range Trả về đối tượng kiểu Range thể hiện một ô hoặc một vùng nào đó trong bản
tính.

Rows Trả về đối tượng kiểu Range thể hiện tất cả các hàng trong bản tính.

Visible Thiết lập hiển thị/ẩn bảng tính.

e. Đối tượng biểu đồ (Chart và ChartObject)


Đối tượng biểu đồ thể hiện một biểu đồ trong tài liệu. Biểu đồ đó có thể nằm trong một
trang tài liệu riêng (đối tượng Chart) hoặc có thể được nhúng trong một bản tính (đối tượng
ChartObject).
Để truy cập vào đối tượng biểu đồ, ta sử dụng một số thuộc tính và phương thức có trả về
đối tượng kiểu Chart sau:
§ Thuộc tính ChartObjects
Ví dụ sau thiết lập mẫu tô cho biểu đồ nhúng trong bảng tính có tên “Sheet1”
Worksheets("Sheet1").ChartObjects(1).Chart. _
ChartArea.Interior.Pattern = xlLightDown
§ Tập đối tượng Charts
Ví dụ sau sẽ thay đổi màu của dữ liệu trong trang biểu đồ đầu tiên
Charts(1).SeriesCollection(1).Interior.Color=RGB(255,0,0)
§ Thuộc tính ActiveChart
Ví dụ sau sẽ kích hoạt một trang biểu đồ, sau đó thiết lập tiêu đề của biểu đồ
thông qua thuộc tính ActiveChart
Charts(1).Activate
With ActiveChart
.HasTitle = True
.ChartTitle.Text = "January Sales"
End With
§ Thuộc tính ActiveSheet
Ví dụ sau sẽ kích hoạt một trang biểu đồ, sau đó thiết lập lại kiểu của biểu đồ
thông qua thuộc tính ActiveSheet
Charts("chart1").Activate
ActiveSheet.Type = xlLine
f. Đối tượng vùng dữ liệu (Range). Thuộc tính Columns, Rows, Cells
Mỗi bảng tính được tạo thành từ tập hợp các ô (Cells). Các ô chính là nơi người sử dụng
thực hiện các công việc tính toán, xử lý và trình bày dữ liệu của mình. Trong quá trình làm
việc người dùng có thể làm việc với không chỉ một ô, mà còn có thể với tập hợp các ô hay
chính xác hơn là làm việc với một vùng dữ liệu (Range). Vùng dữ liệu có thể được thể
hiện theo nhiều cách khác nhau:
§ Một hoặc nhiều ô tính (Cells);
§ Dòng dữ liệu (Rows);
§ Cột dữ liệu (Columns);

- 19 -
TỰ ĐỘNG HOÁ THIẾT KẾ CẦU ĐƯỜNG Lập trình trên ứng dụng nền

§ Vùng dữ liệu (Range).


Để tham chiếu đến một vùng dữ liệu trong bảng tính, ta có thể sử dụng các thuộc tính
Cells, Columns, Rows, Range, Offset và phương thức Union có trong bảng tính:
§ Thuộc tính Cells: tham chiếu đến một ô trong bảng tính.
Cells(chỉ_số_hàng, chỉ_số_cột)
Ví dụ, muốn gán giá trị “5” cho ô B5 (hàng thứ 5, cột thứ 2) của bảng tính
Sheet1, ta sử dụng đoạn mã lệnh sau:
Sheets(“Sheet1”).Cells(5,2).Value = 5
§ Thuộc tính Rows: tham chiếu đến các dòng trong bảng tính
Rows (chỉ_số_hàng)
Ví dụ sau sẽ đổi màu dòng thứ 3 thành màu đỏ
Dim MySheet As Worksheet
Set MySheet = Worksheets("sheet1")
MySheet.Rows(3).Interior.Color = RGB(255, 0, 0)
§ Thuộc tính Columns: tham chiếu đến các cột trong bảng tính
Columns (chỉ_số_cột)
Ví dụ sau sẽ đổi kiểu phông chữ ở cột 2 thành kiểu in đậm
Dim MySheet As Worksheet
Set MySheet = Worksheets("sheet1")
MySheet.Columns(2).Font.Bold = True
§ Thuộc tính Range: tham chiếu đến một vùng dữ liệu trong bảng tính
Thuộc tính này có tính tổng quát hơn so với 3 kiểu thuộc tính đã được đề cập ở
trên. Có nhiều cách khác nhau để tham chiếu đến một vùng dữ liệu trong bảng
tính.
- Nếu vùng dữ liệu là một ô tính
Range(“Tên_ô_dữ_liệu”)
Ví dụ, muốn gán giá trị “5” cho ô B5, ta sử dụng đoạn mã lệnh sau
Sheets(“Sheet1”).Range(“B5”).Value = 5
- Nếu vùng dữ liệu nằm giới hạn trong hình chữ nhật giữa hai ô
Range(“tên_ô_1”, “tên_ô_2”)
’ hoặc
Range(“tên_ô_1 : tên_ô_2”)
Ví dụ, khi cần tham chiếu đến vùng “A2:C5” ta có thể sử dụng đoạn mã lệnh
sau
Sheets(“Sheet1”).Range(“A2”, “C5”)
’ hoặc
Sheets(“Sheet1”).Range(“A2:C5”)

- 20 -
TỰ ĐỘNG HOÁ THIẾT KẾ CẦU ĐƯỜNG Lập trình trên ứng dụng nền

- Nếu vùng dữ liệu là một vùng đã được đặt tên


Range(“tên_vùng_dữ_liệu”)
Ví dụ như trong bảng tính “Tai_trong”, có một vùng dữ liệu do người dùng đặt
tên là “luc_dong_dat”, thì có thể tham chiếu tới vùng dữ liệu đó theo cú pháp
sau
Worksheets("Tai_trong").Range("luc_dong_dat")
§ Thuộc tính Offset: tham chiếu đến một vùng dữ liệu với một khoảng dịch cho
trước so với vùng dữ liệu hiện tại
Offset(số_hàng, số_cột)
Ví dụ sau thực chất sẽ làm thay đổi màu nền của vùng dữ liệu “C4:D4”
Worksheets("Sheet1").Activate
Range("A1:B2").Offset(3, 2).Interior.Color = _
RGB(200, 0, 0)
§ Phương thức Union: dùng để nối các vùng dữ liệu khác nhau, sử dụng khi ta
muốn tham chiếu đến nhiều vùng dữ liệu khác nhau một lúc
Union(vùng_dữ_liệu_1,vùng_dữ_liệu_2,…)
Ví dụ sau sẽ chọn hai vùng dữ liệu “A1:B2” và “D4:D5”
Dim r1 As Range, r2 As Range
Dim myMultiAreaRange As Range
Worksheets("sheet1").Activate
Set r1 = Range("A1:B2")
Set r2 = Range("D4:E5")
Set myMultiAreaRange = Union(r1, r2)
myMultiAreaRange.Select
Quá trình tính toán, xử lý dữ liệu chủ yếu được thực hiện trên các vùng dữ liệu. Dưới đây
là danh sách các phương thức và thuộc tính thường dùng có trong đối tượng kiểu Range.

Phương thức Mô tả

Activate Kích hoạt một ô đơn, ô này phải nằm trong một vùng đã lựa chọn. Để lựa
chọn một vùng dữ liệu, ta sẽ dùng phương thức Select.

Clear Xoá nội dung trong vùng dữ liệu.

Delete [Shift] Xoá vùng dữ liệu khỏi bảng tính. Sau khi xoá, giá trị Shift sẽ quy định cách
thức các ô khác sẽ lấp đầy vào các ô trong vùng dữ liệu đã bị xoá

Merge [Across] Nối các ô trong vùng dữ liệu. Nếu biến Across là True thì chương trình chỉ
nối các ô trên cùng một hàng. Nếu là False thì tất cả các ô trong vùng dữ
liệu sẽ được nối thành một ô duy nhất. Mặc định, Across có giá trị False.

Select Phương thức này dùng để lựa chọn một vùng dữ liệu.

- 21 -
TỰ ĐỘNG HOÁ THIẾT KẾ CẦU ĐƯỜNG Lập trình trên ứng dụng nền

Sort Phương thức này dùng để sắp xếp dữ liệu trong vùng dữ liệu. Có rất nhiều
tham số áp dụng cho phương thức này, có thể tham khảo thêm trong các
tài liệu trợ giúp của Excel.

Unmerge Huỷ bỏ nối ô.

Thuộc tính Mô tả

Formula Trả về hoặc thiết lập công thức cho vùng dữ liệu. Ví dụ:
Range("A1").Formula = "=$A$4+$A$10"

FormulaArray Trả về hoặc thiết lập công thức kiểu mảng cho vùng dữ liệu. Nếu vùng dữ
liệu không chứa công thức kiểu mảng, thuộc tính này sẽ trả về giá trị Null. Ví
dụ: Range("E1:E3").FormulaArray = "=Sum(R1C1:R3C3)"

HasArray Trả về giá trị True nếu vùng dữ liệu là một phần trong công thức kiểu mảng.

Name Trả về hoặc thiết lập tên cho vùng dữ liệu.

Value Trả về hoặc thiết lập giá trị cho vùng dữ liệu.

CHÚ Ý Trong Excel, phổ biến có hai kiểu tham chiếu đến địa chỉ của vùng dữ liệu: kiểu A1 và kiểu
R1C1.
Kiểu tham chiếu A1 là kiểu tham chiếu mặc định trong Excel. Theo cách này, các cột được ký hiệu
từ A đến IV (gồm 256 cột) và các hàng được ký hiệu bằng số từ 1 đến 65536. Nếu muốn tham
chiếu đến ô ở cột thứ 2, hàng thứ 2, ta sử dụng địa chỉ là B2.
Với kiểu tham chiếu R1C1, tất cả cột và hàng đều được đánh số. Theo cách này, vị trí của một ô
được xác định bằng cách sử dụng: “R-số thứ tự hàng-C-số thứ tự cột”. Ví dụ, để tham chiếu đến ô
ở cột thứ 2, hàng thứ 2, ta sử dụng địa chỉ là R2C2.
Đối với kiểu tham chiếu R1C1, địa chỉ ô đều là địa chỉ tuyệt đối, nếu muốn sử dụng địa chỉ tương
đối, ta sẽ sử dụng cặp dấu ngoặc vuông “[]”. Ví dụ, để tham chiếu đến một ô nằm cách ô hiện tại
là 2 cột về phía trái và 2 hàng về phía dưới, ta sẽ sử dụng địa chỉ là R[2]C[-2]. Còn nếu muốn
tham chiếu đến một ô nằm cùng cột ô hiện tại và cách ô hiện tại 2 hàng về phía trên, ta sẽ sử
dụng địa chỉ là R[-2]C.
Cần phải lưu ý là với kiểu tham chiếu A1, địa chỉ cột ở trước địa chỉ hàng; còn đối với kiểu tham
chiếu R1C1, địa chỉ cột ở phía sau địa chỉ hàng.

4.3. Bài tập áp dụng


Tạo hàm tra bảng một chiều, áp dụng để tra “bảng tra mô đun đàn hồi yêu cầu”:
Số trục xe tính toán
50 100 200 500 1000 2000 5000 7000
(xe/ngđ/làn)
Eyc (Mpa) 133 147 160 178 192 207 224 235

Phân tích – Lập sơ đồ khối


Đối với bài toán này, yêu cầu phải tạo được một hàm mới để phục vụ cho việc tra bảng.
Theo cách suy nghĩ lô-gic, để tra bảng một chiều, ta cần phải có:
§ Bảng các giá trị, hay nói khác, là bảng tra, ở đây là “Bảng tra mô đun đàn hồi
yêu cầu”;
§ Số để tra, ở đây là “số trục xe tính toán”.

- 22 -
TỰ ĐỘNG HOÁ THIẾT KẾ CẦU ĐƯỜNG Lập trình trên ứng dụng nền

Để tra bảng nhanh chóng thì dữ liệu về số trục xe tính toán phải được sắp xếp theo thứ tự
tăng dần hoặc giảm dần.
Để thực hiện quá trình tra bảng, ta phải lần lượt tìm hai cột dữ liệu liền kề sao cho số cần
tra nằm trong khoảng giá trị ở hàng “số trục xe tính toán” của hai cột liền kề đó, ta gọi là số
X1 và X2. Tương ứng với hai giá trị X1 và X2, ta sẽ có được giá trị ở hàng “Eyc” tương
ứng là Y1 và Y2. Như vậy, giá trị cần tra, TraBang, sẽ được xác định dựa theo công thức:

TraBang = Y 1 +
(Y 2 − Y 1) × ( so _ tra − X 1)
( X 2 − X 1)
Với các trường hợp đặc biệt khác, cách thức xử lý như sau:
§ Nếu số_tra=X1 hoặc Số_tra=X2 thì giá trị tra bảng sẽ là Y1 hoặc Y2 tương
ứng;
§ Còn nếu Số_tra không nằm trong bảng tra, ta sẽ có nhiều cách xử lý khác
nhau, nhưng ở đây, ta thống nhất lựa chọn là thông báo cho người sử dụng biết
là số cần tra không nằm trong bảng tra.
Để chuyển đổi cách suy nghĩ theo lô-gic như trên thành chương trình, ta cần phải tạo một
hàm có tên là TraBang với các tham số như sau:
Function TraBang(so_tra as Double,Vung_tra as Range) as Double
Trong đó So_tra là số sử dụng để tra bảng, kiểu Double; còn Vung_tra là một vùng dữ
liệu chứa các giá trị trong bảng tra, kiểu Range.
Và sơ đồ khối của hàm tra bảng có thể được biểu diễn như sau:

- 23 -
TỰ ĐỘNG HOÁ THIẾT KẾ CẦU ĐƯỜNG Lập trình trên ứng dụng nền

Bắt đầu

Khai báo biến Thông báo:


Có_thể_tra= Sai
Có_thể_tra=False không tra được
True Tra_bảng=Null
I=1
Đúng

Đúng
X1=Số_tra Tra_bảng=Y1
Sai I<=(Số_cột_vùn
g_tra)- 1 Sai

Đúng I=I+1

X2=Số_tra Đúng Tra_bảng=Y2


Số_tra Є Sai
[Vùng_Tra(1,i), Sai
Vùng_tra(1,i+1)]

Đúng Tra_bảng=Y1+(Y2-Y1)/(X2-
X1)*(Số_tra-X1)
X1=Vùng_tra(1,i)
X2= Vùng_tra(1,i+1)
Y1=Vùng_tra(2,i)
Y2= Vùng_tra(2,i+1)
Có_thể_tra=True

Kết thúc

Cài đặt thuật toán


Với thuật toán như trên, ta có thể tiến hành cài đặt cho hàm TraBang theo các bước sau:
§ Lần lượt thực hiện các bước như đã nêu trong phần 4.2.3.2 Tạo hàm mới bằng
VBA, với tên hàm cần tạo là TraBang.
§ Nhập đoạn mã lệnh của hàm TraBang như sau:
Public Function TraBang(so_tra As Double, Vung_Tra As Range) As Double
Dim X1, X2, Y1, Y2 As Double
Dim i As Integer
Dim Co_the_tra As Boolean
Co_the_tra = False
’Vòng lặp để duyệt qua hàng đầu tiên của vùng dữ liệu
For i = 1 To Vung_Tra.Columns.Count - 1
If ((Vung_Tra(1, i).Value<=so_tra) And _
(Vung_Tra(1, i + 1) ).Value >=so_tra)) _

- 24 -
TỰ ĐỘNG HOÁ THIẾT KẾ CẦU ĐƯỜNG Lập trình trên ứng dụng nền

Or _
((Vung_Tra(1, i) ).Value >=so_tra) And _
(Vung_Tra(1, i + 1) ).Value <=so_tra)) _
Then
’Khi đã thoả mãn điều kiện thì lần lượt lấy các giá trị X1,X2,Y1,Y2
’và thoát khỏi vòng lặp
X1 = Vung_Tra(1, i).Value
X2 = Vung_Tra(1, i + 1).Value
Y1 = Vung_Tra(2, i).Value
Y2 = Vung_Tra(2, i + 1).Value
Co_the_tra = True
Exit For
End If
Next i

If Co_the_tra Then
’Kiểm tra điều kiện X1=Số_Tra
If so_tra = X1 Then
TraBang = Y1
Exit Function
End If
’Kiểm tra điều kiện X2=Số_Tra
If so_tra = X2 Then
TraBang = Y2
Exit Function
End If
’Nếu không thoả các điều kiện trên thì tính giá trị tra bảng theo
’công thức sau:
TraBang = (Y2 - Y1) / (X2 - X1) * (so_tra - X1) + Y1
Else
’Khi không nằm trong bảng tra thì thông báo
MsgBox ("Gia tri can tra khong nam trong bang tra")
TraBang = Null
End If
End Function

Sử dụng hàm mới

- 25 -
TỰ ĐỘNG HOÁ THIẾT KẾ CẦU ĐƯỜNG Lập trình trên ứng dụng nền

Sau khi đã tạo mã nguồn cho hàm mới, ta sử dụng hàm mới bằng cách tạo một bảng tra
như hình vẽ dưới, sau đó nhập công thức “=trabang(B9,B6:I7)”. Kết quả cho ra là
153.5, đúng như cách tính toán thông thường.
Lần lượt thay đổi “Số trục xe tính toán” bằng 100, 20, 7100 để thử nghiệm khả năng xử lý
của hàm TraBang.

- 26 -
TỰ ĐỘNG HOÁ THIẾT KẾ CẦU ĐƯỜNG Lập trình trên ứng dụng nền

5. AutoCAD và lập trình trên AutoCAD


5.1. AutoCAD
AutoCAD là một chương trình ứng dụng thuộc hệ CAD (Computer Aided Design) chuyên
dùng trong công tác thiết kế - tạo bản vẽ. AutoCAD là sản phẩm rất phổ biến do tính dễ
dùng và khả năng áp dụng cho nhiều lĩnh vực khác nhau. AutoCAD được tổ chức thành
một chương trình hoạt động độc lập trên nền Windows, số liệu bản vẽ thiết kế được
AutoCAD tổ chức dưới hai dạng là ẩn (nonvisual) và trực quan (visual). Các thao tác liên
quan đến các thành phần trong bản vẽ đều được thực hiện trực tiếp ngay trên màn hình
thông qua sự phối hợp giữa các câu lệnh và thao tác với bàn phím hoặc chuột.
Giao diện của chương trình AutoCAD như sau:

Mỗi bản vẽ trong AutoCAD được tổ chức thành 2 thành phần chính:
§ ModelSpace - Không gian mô hình: là nơi tạo các đối tượng hình học của bản
vẽ.
§ PaperSpace – Không gian in: tại đây các đối tượng hình học được thể hiện ở
dạng kết quả sau khi in. Mỗi đối tượng đều có thể được bố trí với tỷ lệ, vị trí, góc
quan sát một cách độc lập với những đối tượng khác theo ý tưởng của người

- 27 -
TỰ ĐỘNG HOÁ THIẾT KẾ CẦU ĐƯỜNG Lập trình trên ứng dụng nền

thiết kế. Kết quả hiển thị trên không gian in sẽ giống như khi in trên giấy. Số
lượng PaperSpace là không hạn chế.
Với AutoCAD, người dùng có thể tạo ra các bản vẽ, từ hình vẽ của những ý tưởng ban đầu
đến những bản vẽ chi tiết với độ chính xác cao. Hệ thống các trình đơn, thanh công cụ, cửa
sổ dòng lệnh và đặc biệt là khả năng tương tác với từng chi tiết của bản vẽ một cách trực
quan giúp cho người thiết kế có thể thể hiện ý tưởng của mình một cách thoải mái, dễ dàng
và nhanh chóng. Và hơn thế nữa, khả năng in ấn mạnh mẽ với rất nhiều lựa chọn khác
nhau giúp thể hiện ý tưởng thành bản vẽ và có thể in ra giấy một cách dễ dàng.
Toàn bộ các chi tiết trong bản vẽ đều được AutoCAD quản lý dưới dạng đối tượng, nghĩa
là mỗi chi tiết đều có những thuộc tính riêng và được quản lý bằng cơ sở dữ liệu bên trong
AutoCAD. Điều này rất thích hợp trong môi trường thiết kế đòi hỏi phải cập nhật, thay đổi
nhiều, bởi lẽ chỉ cần thay đổi thuộc tính của các đối tượng là ta đã có thể có ngay được một
bản vẽ mới. Bên cạnh đó, do cách tổ chức như trên nên ta có thể dễ dàng can thiệp vào các
đối tượng bản vẽ để biến đổi chúng cho phù hợp với mục đích riêng. Các đối tượng trong
AutoCAD được chia làm hai loại, loại thứ nhất là các đối tượng ẩn, được dùng để thiết lập
các thuộc tính cho các loại đối tượng khác, ví dụ như: DimStyle, FontStyle, Layer.... Loại
đối tượng thứ hai là các đối tượng có thể nhìn thấy được, nó chính là các thành phần hiển
thị của bản vẽ, ví dụ như: Line, Pline, Arc, Text, Dim...
AutoCAD là một chương trình được sử dụng rất rộng rãi bởi không những nó đáp ứng
được yêu cầu của đại đa số người dùng mà còn đáp ứng được những yêu cầu chuyên biệt
nhờ khả năng cho phép người dùng có thể lập trình trên nó để thực hiện những yêu cầu
chuyên biệt này của mình một cách dễ dàng. Việc mở rộng AutoCAD có thể được thực
hiện theo những cách sau:
§ Lệnh gộp (Script): tính năng này cho phép thực hiện các lệnh của AutoCAD từ
một tệp văn bản (có phần mở rộng là *.SCR).
§ AutoLISP và Visual LISP: AutoLISP dựa trên ngôn ngữ lập trình LISP, một
ngôn ngữ dễ sử dụng và cũng khá mạnh. Với môi trường phát triển tích hợp
Visual LISP có sẵn trong AutoCAD, người dùng có thể dễ dàng tạo ra các ứng
dụng mở rộng AutoCAD. Tất cả các mã lệnh viết bằng AutoLISP sẽ được lưu
trong tệp có phần mở rộng là *.LSP.
§ ObjectARX (AutoCAD Runtime Extension): ObjectARX chứa các thư viện
liên kết động, qua đó người dùng có thể tác động trực tiếp lên nhân của chương
trình AutoCAD. Chính vì vậy, chương trình viết với ObjectARX có khả năng rất
mạnh, và thường được sử dụng để viết các ứng dụng lớn, chẳng hạn như
SoftDesk hay NovaTDN. Các chương trình sử dụng ObjectARX được viết bằng
ngôn ngữ VC++ và được biên dịch thành tệp có phần mở rộng là *.ARX.
§ ActiveX Automation: công nghệ này cho phép chia sẻ dữ liệu của bản vẽ với
các chương trình khác. Và do đó, ta có thể phát triển ứng dụng bằng các ngôn
ngữ lập trình khác nhau như Visual Basic, Delphi hay C#, để tận dụng tất cả các
tính năng sẵn có của AutoCAD thông qua mô hình đối tượng của AutoCAD.
§ AutoCAD VBA: là môi trường lập trình được tích hợp sẵn trong AutoCAD. Các
chương trình VBA viết bằng ngôn ngữ Visual Basic, hoạt động dựa trên giao
diện ActiveX Automation. Sự kết hợp giữa AutoCAD, ActiveX Automation và
VBA tạo nên nhiều lợi thế cho các ứng dụng mở rộng viết bằng VBA.

- 28 -
TỰ ĐỘNG HOÁ THIẾT KẾ CẦU ĐƯỜNG Lập trình trên ứng dụng nền

Trong tài liệu này, chỉ trình bày về cách lập trình trên AutoCAD bằng VBA và một số nội
dung cơ bản nhất về AutoLISP sử dụng kết hợp với các chương trình VBA tạo nên các
lệnh mới trong AutoCAD.

5.2. Lập trình trên AutoCAD bằng VBA


Việc lập trình bằng VBA trên AutoCAD cũng giống như trên Microsoft Excel, các mã lệnh
đều được thực hiện thông qua VBA IDE. Do đều xuất phát từ một nhà cung cấp là
Microsoft nên VBA IDE trong hai ứng dụng nền trên là giống nhau. Điểm khác nhau cơ
bản cần phải lưu ý trong khi lập trình chính là sự khác biệt về mô hình đối tượng của hai
ứng dụng nền. Chính vì vậy, trong phần này, sau khi giới thiệu về một số thao tác cơ bản,
nội dung chủ yếu sẽ là giới thiệu về mô hình đối tượng của AutoCAD và một số thao tác
cơ bản trên các đối tượng của AutoCAD.

5.2.1. Quản lý dự án VBA


Khác với trong Excel, trong AutoCAD, các dự án VBA được phân biệt rõ ràng thành:
§ Dự án nhúng (Embedded Project): là dự án VBA được đính kèm cùng với tệp
bản vẽ và sẽ được tự động tải vào VBA IDE mỗi khi mở bản vẽ có chứa dự án
nhúng. Dự án nhúng có một số giới hạn khi làm việc, không thể đóng hoặc mở
các bản vẽ AutoCAD bởi lẽ mục đích của dự án nhúng chính là làm việc bên
trong bản vẽ có chứa nó. Điểm thuận lợi chính của dự án nhúng là người sử
dụng không cần phải nhớ nơi lưu trữ dự án, không cần phải thực hiện tải dự án
mỗi khi sử dụng các chức năng có trong dự án, tất cả các thao tác đó đều được
thực hiện tự động khi mở bản vẽ có chứa dự án nhúng.
§ Dự án độc lập (Global Project): là dự án được lưu tách biệt trong một tệp có
phần mở rộng là *.DVB. Dự án độc lập có khả năng làm việc linh hoạt hơn, có
khả năng đóng hoặc mở bản vẽ bất kỳ. Tuy nhiên, người sử dụng cần phải nhớ
nơi lưu trữ và các chức năng có trong từng dự án để khi cần sử dụng một chức
năng nào thì sẽ tải dự án đó vào VBA IDE để sử dụng. Mặc dù vậy, với dự án
độc lập, việc phân phối và chia sẻ mã lệnh được thực hiện dễ dàng hơn so với
loại dự án nhúng. Dự án độc lập cũng rất thích hợp để lưu trữ, tập hợp thành bộ
thư viện để sử dụng trong tất cả các bản vẽ.
Với AutoCAD, quá trình quản lý dự án VBA được thực hiện rất dễ dàng thông qua cửa sổ
“Quản lý dự án VBA – VBA Manager”. Để hiện cửa sổ VBA Manager, ta chọn trình đơn
ToolðMacroðVBA Manager… (hoặc gọi lệnh VBAMAN từ dòng lệnh của AutoCAD)

Giao diện của cửa sổ VBA Manager như hình dưới:

- 29 -
TỰ ĐỘNG HOÁ THIẾT KẾ CẦU ĐƯỜNG Lập trình trên ứng dụng nền

Ý nghĩa của từng thành phần trong cửa sổ VBA Manager:


1 Chứa danh sách các bản vẽ hiện có trong AutoCAD (sử dụng khi ta muốn nhúng một
dự án nào đó vào trong một bản vẽ).
2 Chứa danh sách các dự án VBA hiện đang được tải trong VBA IDE.
3 Tạo một dự án mới.
4 Lưu dự án VBA với tên khác (chỉ có hiệu lực với các dự án độc lập).
5 Tải một dự án độc lập vào trong VBA IDE.
6 Gỡ bỏ một dự án độc lập khỏi VBA IDE.
7 Nhúng một dự án VBA vào một bản vẽ định trước. Bản vẽ được định trước chính là
bản vẽ được lựa chọng trong danh sách 1.
8 Tách dự án nhúng ra khỏi bản vẽ (chỉ có hiệu lực khi bản vẽ có chứa dự án nhúng).
9 Hiển thị cửa sổ quản lý Macro trong AutoCAD.
10 Hiển thị VBA IDE, là nơi sẽ thực hiện quá trình thiết kế mã lệnh và giao diện của
chương trình.

CHÚ Ý Macro về bản chất là chương trình con dạng thủ tục. Trong AutoCAD, ta thường chỉ thao
tác với các chương trình con dạng thủ tục, còn chương trình con dạng hàm chỉ sử dụng bên trong
các dự án VBA.

5.2.2. Tạo Macro với VBA


Mỗi Macro đều phải nằm trong một dự án nhất định. Vì vậy, trước khi tạo mới một Macro,
ta cần phải xác định được nơi sẽ chứa Macro. Nếu chưa có một dự án nào hoặc khi cần lưu
Macro trong một dự án khác, ta cần phải tạo mới Macro. Sau đó, việc tạo Macro sẽ được
thực hiện một cách dễ dàng như cách tạo một chương trình con trong VBA.

5.2.2.1. Tạo mới và lưu dự án VBA

Để tạo mới dự án VBA:

- 30 -
TỰ ĐỘNG HOÁ THIẾT KẾ CẦU ĐƯỜNG Lập trình trên ứng dụng nền

1 Mở cửa sổ VBA Manager.


2 Chọn nút lệnh New.
Mặc định, dự án mới được tạo sẽ là một dự án độc lập, có tên dự án là ACADProject.
Sau khi tạo mới dự án, ta có thể nhúng dự án vào một bản vẽ nào đó hoặc có thể lưu ra một
tệp riêng thành dự án độc lập tuỳ thuộc vào nhu cầu sử dụng.

Để nhúng dự án vào một bản vẽ:


1 Mở cửa sổ VBA Manager.
2 Trong mục Drawing, chọn bản vẽ cần nhúng dự án vào.
3 Trong mục Projects, chọn dự án cần nhúng vào bản vẽ.
4 Chọn nút lệnh Embed.

Để lưu dự án VBA thành dự án độc lập:


1 Mở cửa sổ VBA Manager.
2 Chọn dự án cần lưu, chọn Save As. Hộp thoại Save As sẽ xuất hiện.
3 Điền tên tệp và vị trí để lưu dự án.
4 Chọn Save.

5.2.2.2. Tạo mới và hiệu chỉnh Macro


Để tạo mới Macro, ta có thể trực tiếp vào trong VBA IDE và chèn chương trình con (dạng
thủ tục) vào dự án mong muốn, hoặc ta có thể thực hiện thông qua cửa sổ Macros.

Để tạo Macro thông qua cửa sổ Macros:


1 Mở cửa sổ Macros bằng cách chọn từ trình đơn ToolsðMacroðMacros… (hoặc sử
dụng lệnh VBARUN từ dòng lệnh AutoCAD)

- 31 -
TỰ ĐỘNG HOÁ THIẾT KẾ CẦU ĐƯỜNG Lập trình trên ứng dụng nền

2 Trong mục Macros in, chọn nơi sẽ chứa Macro từ danh sách thả xuống.
3 Trong mục Macro name, nhập tên Macro cần tạo.
4 Chọn Create để tạo Macro mới.
5 Màn hình của VBA IDE sẽ được tự động hiện lên, và con trỏ chuột được đặt ngay vị trí
cài đặt mã lệnh cho Macro mới. Lúc này ta đã có thể bắt đầu viết mã lệnh cho Macro
mới.
6 Trong màn hình của VBA IDE chọn trình đơn FileðClose and Return to AutoCAD
để trở về màn hình của AutoCAD.

CHÚ Ý Cũng giống như VBA trong Excel, để chuyển đổi qua lại giữa màn hình AutoCAD và màn
hình VBA IDE, ta sử dụng phím tắt là ALT+F11.

Để soạn thảo/hiệu chỉnh Macro


1 Mở cửa sổ Macros.
2 Chọn Macro cần hiệu chỉnh trong danh sách các Macro.
3 Chọn Edit để bắt đầu hiệu chỉnh.

5.2.3. Sử dụng Macro


Để sử dụng Macro, hay nói cách khác là để thực thi các Macro, ta cần phải tải các dự án có
chứa Macro vào VBA IDE. Nếu Macro nằm trong các dự án đã mở, ta có thể bỏ qua bước
tải dự án VBA.

Để tải các dự án VBA


§ Đối với các dự án nhúng, ta chỉ cần mở bản vẽ có chứa dự án nhúng là đã thực
hiện quá trình tải dự án.
§ Đối với các dự án độc lập, ta cần phải tải các dự án bằng cách: mở cửa sổ VBA
Manager ð Chọn Load ð Chọn dự án cần tải trong hộp thoại Open VBA
Project ð Chọn Open.
Việc thực thi Macro cũng có thể được thực hiện theo nhiều cách khác nhau: trực tiếp từ
VBA IDE, thông qua cửa sổ Macros, thông qua dòng lệnh, hay qua hệ thống trình đơn.
Dưới đây là hai cách đơn giản nhất để thực thi Macro.

Để thực thi Macro


§ Trong VBA IDE, đặt con trỏ vào dòng mã lệnh của Macro trong cửa sổ mã lệnh
ð Nhấn phím F5 để thực thi Macro.
§ Mở cửa sổ Macros ð Chọn Macro cần thực thi trong danh sách ð Chọn Run.

5.2.4. Tạo lệnh mới sử dụng VBA kết hợp với AutoLISP
Có thể nói, một trong những điểm mạnh của AutoCAD chính là cửa sổ dòng lệnh. Thông
qua cửa sổ dòng lệnh này, mọi thao tác đối với bản vẽ đều có thể được thực hiện một cách
nhanh chóng với bàn phím thông qua hệ thống các lệnh đã được định nghĩa sẵn.
Để thực thi Macro, rõ ràng phải thực hiện qua khá nhiều bước. Để tạo sự thuận tiện, cần
thiết phải định nghĩa lệnh mới, qua đó ta có thể thực thi Macro chỉ với một dòng lệnh đơn
giản, giống như khi cần vẽ đường thẳng, ta chỉ cần sử dụng lệnh line ở dòng lệnh
AutoCAD. Sự kết hợp với AutoLISP là một cách làm tốt và dễ dàng để thực hiện mục tiêu
này.

- 32 -
TỰ ĐỘNG HOÁ THIẾT KẾ CẦU ĐƯỜNG Lập trình trên ứng dụng nền

Tuy nhiên, nếu chỉ được lưu trong những tệp dự án VBA và tệp AutoLISP thông thường
thì những lệnh đó chỉ có hiệu lực khi người dùng tải đồng thời dự án VBA và tệp
AutoLISP trong AutoCAD. Vì vậy, khi muốn các lệnh mà người dùng tự lập có hiệu lực
ngay khi sử dụng AutoCAD (nghĩa là người dùng không cần phải làm thêm bất cứ một
thao tác nào khác, chỉ cần khởi động AutoCAD là có thể dùng được ngay các lệnh này) ta
sẽ phải lưu dự án VBA thành tệp có tên là ACAD.DVB và tệp AutoLISP sẽ được lưu với
tên là ACAD.LSP, và cả hai tệp này phải được lưu vào thư mục cài đặt của AutoCAD (ví
dụ đối với AutoCAD 2002, nếu cài đặt thông thường, thư mục cài đặt của AutoCAD trong
Windows sẽ là: C:\Program Files\AutoCAD 2002).
Dưới đây là một ví dụ đơn giản để thực hiện mục tiêu này: chương trình (Macro)
HelloWorld.
Mô tả nội dung chương trình (Macro): Macro này sẽ hiển thị hộp thoại yêu cầu người sử
dụng nhập vào một thông điệp, sau đó thông điệp này sẽ được vẽ trên không gian mô hình
của AutoCAD. Để thực thi Macro này, ta chỉ cần gõ lệnh Hello trong dòng lệnh
AutoCAD. Và đây sẽ là lệnh thường trú trong AutoCAD.
Quá trình thực hiện để đáp ứng nhu cầu trên như sau:
a. Tạo dự án mới
1 Khởi động AutoCAD.
2 Mở cửa sổ VBA Manager (lệnh VBAMAN).
3 Chọn New.
4 Chọn Dự án VBA vừa được tạo trong danh sách các dự án, sau đó chọn Save As…
5 Trong hộp thoại Save As, chọn thư mục cài đặt của AutoCAD trong mục Save in; còn
trong mục File name nhập vào ACAD.DVB.
6 Chọn Save để lưu dự án và quay về cửa sổ VBA Manager.
b. Tạo và thực thi Macro HelloWorld
7 Trong cửa sổ VBA Manager, chọn Macros… để hiển thị hộp thoại Macros.
8 Chọn dự án ACAD.DVB trong mục Macros in

9 Trong mục Macro name, nhập vào tên Macro là HelloWorld

10 Chọn Create. Màn hình VBA IDE sẽ được hiển thị, trong cửa sổ mã lệnh, con trỏ sẽ
được đặt ở vị trí của Macro vừa được tạo. Ta sẽ thấy được đoạn mã lệnh đã được tạo
sẵn như sau:
Sub HelloWorld()
End Sub
11 Thay đoạn mã lệnh trên bằng đoạn mã lệnh sau:
Sub HelloWorld()
Dim strMsg As String
strMsg = InputBox("Nhap thong diep chao mung", _
"HelloWorld")
Dim objText As AcadText
Dim pInsert(0 To 2) As Double
pInsert(0) = 50: pInsert(1) = 100: pInsert(2) = 0
Set objText = ThisDrawing.ModelSpace.AddText _
(strMsg, pInsert, 2.5)

- 33 -
TỰ ĐỘNG HOÁ THIẾT KẾ CẦU ĐƯỜNG Lập trình trên ứng dụng nền

ZoomExtents
End Sub
12 Đặt con trỏ vào giữa hai dòng Sub HelloWorld() và End Sub, sau đó nhấn phím
F5 để thực thi Macro. Một hộp thoại nhỏ sẽ hiện lên yêu cầu người dùng nhập vào một
thông điệp ð Nhập vào thông điệp và nhấn OK ð Thông điệp mà bạn vừa nhập sẽ
được vẽ trên không gian mô hình của AutoCAD.

13 Trong màn hình của VBA IDE, chọn trình đơn File ð Save. Tiếp tục chọn trình đơn
File ð Close and Return to AutoCAD để trở về AutoCAD.
c. Tạo lệnh mới trong AutoCAD để thực thi Macro
Sau khi đã tạo xong Macro, ta sẽ tiến hành khai báo một lệnh mới trong AutoCAD thông
qua AutoLISP và lệnh đó sẽ thực thi Macro HelloWorld vừa được tạo.
14 Khởi động chương trình soạn thảo văn bản, ví dụ như chương trình Notepad có sẵn
trong Windows. Trong Windows, chọn trình đơn Start ð Run. Trong hộp thoại Run,
nhập notepad sau đó nhấn OK để khởi động trình soạn thảo văn bản Notepad.
15 Trong chương trình Notepad, nhập vào đoạn khai báo sau:
(defun C:Hello()
(command "-vbarun" "HelloWorld")
)
Trong đó Hello là lệnh được khai báo để đăng ký sử dụng trong AutoCAD. Còn
HelloWorld là tên Macro đã tạo trong VBA.
16 Chọn trình đơn File ð Save. Trong hộp thoại Save As…, chọn thưc mục cài đặt của
AutoCAD trong mục Save in. Trong mục File name nhập vào ACAD.LSP. Chọn Save.
17 Thoát khỏi chương trình AutoCAD (nếu đang thao tác trên AutoCAD). Khởi động
chương trình AutoCAD. Trong dòng lệnh của AutoCAD, gõ lệnh Hello. Thật bất ngờ,
Macro HelloWorld đã được thực thi.
Như vậy, bằng cách sử dụng VBA kết hợp với AutoLISP, ta đã có thể tạo thêm rất nhiều
lệnh mới trong AutoCAD một cách dễ dàng.
Để có thể hiểu thêm về AutoLISP, xin đọc thêm tài liệu hướng dẫn có sẵn trong AutoCAD.

5.2.5. Mô hình đối tượng của AutoCAD


Mô hình đối tượng thể hiện cấu trúc giao diện AutoCAD ActiveX. Mô hình này được thể
hiện dưới dạng cấu trúc phân nhánh, trong đó, mỗi đối tượng là một thành phần trong
AutoCAD. Nhờ có mô hình đối tượng này mà người sử dụng có thể hình dung một cách dễ
dàng cấu trúc của AutoCAD để có thể truy cập dần đến đối tượng mà mình quan tâm.
Để có thể lập trình tốt trên AutoCAD, người sử dụng trước hết phải quen thuộc và thao tác
thành thạo trên các đối tượng của AutoCAD và đồng thời phải nắm rõ mô hình đối tượng
của AutoCAD. Trong AutoCAD, có rất nhiều loại đối tượng khác nhau, chẳng hạn như:
§ Đối tượng đồ hoạ, như: line, arc, text,…;

- 34 -
TỰ ĐỘNG HOÁ THIẾT KẾ CẦU ĐƯỜNG Lập trình trên ứng dụng nền

§ Cấu hình về kiểu (style settings) như: linetype, dimension style,…;


§ Cấu trúc tổ chức như: layer, group, block,…;
§ Hiển thị bản vẽ như: view, viewport;
§ Và ngay cả bản thân bản vẽ trong chương trình AutoCAD cũng được xem là một
đối tượng.

5.2.5.1. Mô hình đối tượng


Mô hình đối tượng của AutoCAD trong VBA được thể hiện dưới dạng cấu trúc cây phân
cấp, trong đó đối tượng gốc là Application, là phiên làm việc hiện hành của AutoCAD.
Nhờ có mô hình đối tượng mà người lập trình có thể biết được một đối tượng có thể cho
phép truy cập đến những đối tượng nào ở cấp tiếp theo.
Dưới đây là mô hình đối tượng rút gọn trong AutoCAD VBA. Mô hình đối tượng đầy đủ
có thể tham khảo trong tài liệu “ActiveX and VBA Developer's Guide” đi kèm AutoCAD.
Application Chú giải:
Preferences Tập đối tượng
Documents Đối tượng

Document

ModalSpace Arc

PaperSpace Circle

PViewPort Hatch
DimStyles DimStyle
Line
Layers Layer
MText
Layouts Layout
Point
Linetypes Linetype

TextStyles Polyline
TextStyle

SelectionSets SelectionSet Ray

Plot Text

Utility

MenuGroups

a. Đối tượng Application


Đối tượng Application là đối tượng gốc của mô hình đối tượng trong AutoCAD VBA. Từ
đối tượng Application, ta có thể truy xuất đến bất kỳ đối tượng nào khác, hoặc thuộc tính,
phương thức gán cho một đối tượng. Vì là đối tượng gốc trong AutoCAD VBA nên ta có
thể tham chiếu trực tiếp đến các phương thức và thuộc tính của đối tượng Application mà
không cần phải có tiền tố Application ở trước.

- 35 -
TỰ ĐỘNG HOÁ THIẾT KẾ CẦU ĐƯỜNG Lập trình trên ứng dụng nền

b. Đối tượng Document


Đối tượng Document, thực chất là một bản vẽ AutoCAD, thuộc tập đối tượng Documents
cho phép truy cập vào tất cả các đối tượng đồ hoạ và hầu hết các đối tượng phi đồ họa của
AutoCAD. Các đối tượng đồ họa (đường thẳng, hình tròn, cung, …) được truy cập thông
qua tập ModelSpace và PaperSpace, còn các đối tượng phi đồ họa (layer, linetype, text
style, …) được truy cập thông qua tập đối tượng có tên tương tự như tên đối tượng nhưng
có thêm chữ “s” ở sau cùng, chẳng hạn như Layers, Linetypes, TextStyles. Đối tượng
Document còn cho phép truy cập đến đối tượng Plot (là đối tượng chứa các phương thức
và thuộc tính để cài đặt các thông tin về in ấn cho một Layout nhất định) và Utility (là
đối tượng chứa các phương thức tiện ích trong bản vẽ như nhập, chuyển đổi số liệu,…).
Trong VBA có thể sử dụng đối tượng ThisDrawing để truy cập vào bản vẽ hiện hành.
§ Đối với các dự án độc lập, đối tượng ThisDrawing tương ứng với bản vẽ hiện
hành.
§ Đối với các dự án nhúng, đối tượng ThisDrawing tương ứng với bản vẽ chứa
dự án nhúng.
c. Đối tượng Đồ hoạ và Phi đồ hoạ
Các đối tượng đồ hoạ, còn gọi là thực thể, là những đối tượng hữu hình cấu thành bản vẽ
(đường thẳng, hình tròn,…). Để tạo những đối tượng này, ta sử dụng phương thức
Add<Tên thực thể> tương ứng. Để hiệu chỉnh hoặc truy vấn các đối tượng, ta sử dụng các
phương thức và thuộc tính của bản thân từng đối tượng. Mỗi đối tượng đồ hoạ đều có các
thuộc tính cho phép ứng dụng có thể thực hiện hầu hết các lệnh hiệu chỉnh đối tượng trong
AutoCAD như Copy, Erase, Move, Mirror… Những đối tượng này còn có phương thức để
xác lập và gọi lại các dữ liệu mở rộng (xdata), lựa chọn và cập nhật. Các đối tượng đồ hoạ
đều có các thuộc tính điển hình như Layer, Linetype, Color, và Handle cũng như những
thuộc tính riêng biệt, phụ thuộc vào loại đối tượng, chẳng hạn như Center, Radius, và Area.
Các đối tượng phi đồ hoạ là những đối tượng không thể nhìn thấy được (đối tượng thông
tin) chẳng hạn như Layer, Linetype, DimStyle, SelectionSets… Để tạo những đối tượng
này, sử dụng phương thức Add của tập đối tượng cha. Còn để chỉnh sửa và truy vấn các
đối tượng thì sử dụng các phương thức và thuộc tính riêng của từng đối tượng. Mỗi đối
tượng phi đồ hoạ đều có các phương thức và thuộc tính đặc biệt tương ứng với từng mục
đích; tất cả đều có các phương thức để thiết lập và gọi lại dữ liệu mở rộng (xdata), và xoá
bản thân đối tượng.
d. Tập lựa chọn (Tập đối tượng SelectionSet)
Tập lựa chọn, một phần tử của tập đối tượng SelectionSets, là tập hợp của các đối tượng
được người dùng chọn trong bản vẽ AutoCAD. Tập lựa chọn có thể chứa rất nhiều loại đối
tượng khác nhau nhưng lại được xử lý như một đối tượng đơn nhất. Ngoài ra, ta cũng có
thể truy xuất đến từng đối tượng có trong tập lựa chọn.
Một trong những thao tác thường được sử dụng trong tập lựa chọn là thao tác lọc đối tượng
để có thể tìm được các đối tượng thực sự cần thao tác trong tất cả các đối tượng mà người
dùng lựa chọn. Quá trình lọc có thể được thông qua vòng lặp để duyệt từng đối tượng hoặc
thông qua cơ cấu lọc được định nghĩa trước. Để tìm hiểu rõ hơn về vấn đề này, có thể tham
khảo trong tài liệu “ActiveX and VBA Developer’s Guide” và “AutoCAD DXF
Reference”.

- 36 -
TỰ ĐỘNG HOÁ THIẾT KẾ CẦU ĐƯỜNG Lập trình trên ứng dụng nền

5.2.5.2. Các thao tác cơ bản


a. Khai báo và truy xuất đối tượng
Mặc dù có rất nhiều kiểu đối tượng khác nhau, nhưng ta cũng có thể dễ dàng biết được tên
kiểu đối tượng bằng cách thêm “Acad” vào trước tên của đối tượng có trong cây phân cấp
thể thiện mô hình đối tượng của AutoCAD. Ví dụ khi muốn khai báo một đối tượng có
kiểu là đường thẳng (trong mô hình đối tượng có tên là Line), ta sẽ thực hiện như sau:
Dim objLine As AcadLine
Để truy xuất vào đối tượng cũng như các phương thức và thuộc tính có trong đối tượng, ta
cần phải căn cứ vào mô hình đối tượng. Để truy cập vào đối tượng bên trong, ta cần phải
truy cập thông qua các đối tượng ở lớp cha. Trong đó đối tượng gốc là Application, và ta
không cần phải thể hiện rõ trong tham chiếu đến đối tượng. Ví dụ, để truy xuất đến đối
tượng Utility của bản vẽ hiện hành, ta sử dụng đoạn mã lệnh sau:
Application.ActiveDocument.Utility
Còn đối với các đối tượng nằm trong một tập đối tượng, ta có thể truy xuất thông qua chỉ
số hoặc tên của đối tượng trong tập đối tượng. Ví dụ, để truy xuất vào lớp có tên là
“Cot_Thep” của bản vẽ hiện hành, ta sử dụng đoạn mã sau:
ThisDrawing.Layers(“Cot_thep”)
hoặc
ThisDrawing.Layers.Item(“Cot_thep”)
Để truy xuất đến các phương thức và thuộc tính có trong đối tượng, ta sử dụng cú pháp
sau:
<Ten_doi_tuong>.<Thuoc_tinh>
<Ten_doi_tuong>.<Phuong_thuc>
Ví dụ khi cần thay đổi màu của lớp cốt thép thành màu đỏ, ta sử dụng đoạn mã lệnh sau:
ThisDrawing.Layers.Item(“Cot_thep”).Color = acRed
b. Làm việc với bản vẽ
Các thao tác liên quan đến bản vẽ được thực hiện thông qua đối tượng Document trong tập
đối tượng Documents và thông quan bản thân tập đối tượng Documents.
§ Tạo mới bản vẽ: sử dụng phương thức Add của tập đối tượng Documents
Sub Tao_moi()
Dim objDwg As AcadDocument
Set objDwg = Application.Documents.Add
End Sub
§ Mở bản vẽ đã có: sử dụng phương thức Open của tập đối tượng Documents.
Sub Mo_ban_ve()
Application.Documents.Open _
"C:\Program Files\Autocad 2002\sample\campus.dwg"
End Sub
Hoặc để kiểm tra sự tồn tại của bản vẽ trước khi thực sự mở bản vẽ, ta có thể sử
dụng đoạn mã lệnh sau:
Sub Mo_ban_ve ()
Dim dwgName As String

- 37 -
TỰ ĐỘNG HOÁ THIẾT KẾ CẦU ĐƯỜNG Lập trình trên ứng dụng nền

dwgName="C:\Program Files\Autocad 2002\sample\campus.dwg"


If Dir(dwgName) <> "" Then
Application.Documents.Open dwgName
Else
MsgBox "Tep " & dwgName & " khong ton tai."
End If
End Sub
§ Lưu bản vẽ: sử dụng phương thức Save hoặc SaveAs của đối tượng Document.
Sub Luu_ban_ve()
' Lưu bản vẽ hiện hành theo tên đang sử dụng
ThisDrawing.Save
' Lưu bản vẽ hiện hành theo tên mới
ThisDrawing.SaveAs "MyDrawing.dwg"
End Sub
§ Đóng bản vẽ: sử dụng phương thức Close của đối tượng Document để đóng một
bản vẽ, hoặc sử dụng phương thức Close của tập đối tượng Documents để đóng
tất cả các bản vẽ đang được mở trong AutoCAD.
Sub Dong_ban_ve()
'Đóng bản vẽ hiện hành và không lưu bản vẽ
ThisDrawing.Close SaveChanges:=False
'Đóng bản vẽ hiện hành và lưu bản vẽ.
'Nếu bản vẽ chưa được lưu trước đó thì sẽ được lưu
'với tên được chỉ định
ThisDrawing.Close SaveChanges:=True, _
FileName:="C:\MyDrawing.DWG"
'Đóng tất cả các bản vẽ đang được mở
Application.Documents.Close
End Sub
c. Làm việc với các đối tượng

Tạo mới đối tượng


Theo mô hình đối tượng của AtuoCAD, các đối tượng đồ hoạ đều thuộc trong ModelSpace
và PaperSpace, còn các đối tượng phi đồ hoạ thì nằm chủ yếu trong đối tượng Document.
Để tạo mới một đối tượng đối tượng đồ hoạ, trước tra cần phải khai báo biến đối tượng, sau
đó sử dụng phương thức Add<tên_đối_tượng> tạo đối tượng mới và câu lệnh set để
gán đối tượng vừa được tạo trong bản vẽ cho biến đối tượng mà ta khai báo.
Đối với đối tượng phi đồ hoạ, thông thường, để tạo một đối tượng mới, ta chỉ cần sử dụng
phương thức Add có trong tập đối tượng chứa đối tượng phi đồ hoạ đó.
Ví dụ sau sẽ minh hoạ cách tạo một đường thẳng mới (đối tượng đồ hoạ) và một lớp mới
(đối tượng phi đồ hoạ)
'Tạo mới một đường thẳng và đổi màu thành màu đỏ
Dim P1(0 To 2) As Double
Dim P2(0 To 2) As Double
Dim objLine As AcadLine
P1(0) = 0: P1(1) = 0: P1(2) = 0
P2(0) = 100: P2(1) = 100: P2(2) = 0
Set objLine = ThisDrawing.ModelSpace.AddLine(P1, P2)

- 38 -
TỰ ĐỘNG HOÁ THIẾT KẾ CẦU ĐƯỜNG Lập trình trên ứng dụng nền

objLine.Color = acRed

'Tạo mới lớp và đổi tên lớp thành “Be_tong”


Dim objLayer As AcadLayer
Set objLayer = ThisDrawing.Layers.Add("Cot_thep")
objLayer.Name = "Be_tong"

Hiệu chỉnh đối tượng


Việc hiệu chỉnh đối tượng có thể được thực hiện một cách dễ dàng thông qua hệ thống các
phương thức và thuộc tính mà đối tượng đó cung cấp.
Đối với các đối tượng đồ hoạ (hay còn gọi là các thực thể - AcadEntity), mỗi đối tượng đều
có những phương thức và thuộc tính riêng. Tuy nhiên, do được xây dựng xuất phát từ một
đối tượng nên chúng cũng có những thuộc tính và phương thức chung. Dưới đây sẽ liệt kê
các phương thức và thuộc tính thường sử dụng với các đối tượng đồ hoạ

Phương thức Giải thích

Move(P1,P2)
Thủ tục tịnh tiến đối tượng đồ hoạ theo véc tơ P1-P2

Copy()
Hàm sao chép đối tượng, trả về đối tượng giống như đối tượng gốc

Mirror(P1,P2)
Hàm lấy đối xứng trục đối tượng, trả về đối tượng đã được lấy đối xứng với đối
tượng ban đầu qua đường thẳng P1-P2

Rotate(P, A)
Thủ tục quay đối tượng đối tượng quanh điểm P với góc quay A

ScaleEntity(P, TL)
Thủ tục co dãn đối tượng đều nhau theo các phương X, Y và Z với điểm cơ sở là P
là tỉ lệ co dãn là TL

ArrayPolar(N, A, P)
Hàm nhân bản dạng cực, trả về mảng chứa N đối tượng sau khi được nhân bản
để lấp đầy góc A có tâm là điểm P

ArrayRectangular(Y, X, Z, dY, dX, dZ)


Hàm nhân bản dạng chữ nhật, trả về YxXxZ đối tượng sau khi sao chép và bố trí
theo Y hàng, X cột, Z tầng với các khoảng cách theo hàng, cột, tầng tương ứng là
dY, dX, dZ

GetBoundingBox MinPoint, MaxPoint


Thủ tục lấy hình chữ nhật bao, MinPoint là điểm ở góc dưới trái còn điểm
MaxPoint là điểm ở góc trên phải của hình chữ nhật bao

IntersectWith(ĐT, Opt)

- 39 -
TỰ ĐỘNG HOÁ THIẾT KẾ CẦU ĐƯỜNG Lập trình trên ứng dụng nền

Hàm lấy giao điểm, trả về mảng chứa các điểm giao giữa đối tượng đang xét và
đối tượng ĐT, ta có thể thiết lập thêm về chế độ xét giao cắt trong biến Opt

Update
Thủ tục cập nhật, cập nhật các đối tượng đồ hoạ trên bản vẽ. Thủ tục này thường
được gọi sau khi ta thay đổi một số thuộc tính của đối tượng đồ hoạ

Thuộc tính Giải thích

Color Gán/trả về định màu của đối tượng đồ hoạ

Layer Gán/trả về tên lớp chứa đối tượng đồ hoạ

Linetype Gán/trả về kiểu đường của đối tượng đồ hoạ

LinetypeScale Gán/trả về tỉ lệ kiểu đường của đối tượng đồ hoạ

Lineweight Gán/trả về bề dày nét của đối tượng đồ hoạ

Visible Quy định sự hiển thị/ẩn của đối tượng đồ hoạ, giá trị kiểu boolean

Đối với các đối tượng phi đồ hoạ, mỗi đối tượng đều có những phương thức và thuộc tính
riêng của từng loại đối tượng. Chính vì vậy, trong tài liệu này chỉ giới thiệu một số phương
thức và thuộc tính của đối tượng Layer, một đối tượng được sử dụng rất nhiều trong khi lập
trình trên AutoCAD.

Phương thức Giải thích

Delete Xoá lớp. Phương thức này cũng có hiệu lực trong hầu hết các đối
tượng trong AutoCAD

Thuộc tính Giải thích

Color Gán/trả về màu của lớp

Freeze1 Bật/tắt chế độ làm đông lớp, có giá trị kiểu boolean

LayerOn Bật/tắt hiển thị lớp, có giá trị kiểu boolean

Linetype Gán/trả về kiểu đường của lớp

1
Phân biệt giữa các chế độ Làm đông (Freeze) – Hiển thị (LayerOn) – Khoá (Lock) lớp: Với chế độ làm
đông, khi bật chế độ làm đông, các đối tượng thuộc lớp sẽ không được hiển thị trong bản vẽ và cũng sẽ
không được in ra, và đồng thời qua trình tái tạo bản vẽ (lệnh regen trong AutoCAD) sẽ không có tác dụng với
lớp đã được làm đông; và do đó sẽ giảm tải khả năng xử lý của máy tính. Với chế độ hiển thị, khi đã tắt lớp,
các đối tượng trong lớp sẽ không được hiển thị trên màn hình cũng như khi in ra, tuy vậy, các đối tượng vẫn
được tái tạo khi sử dụng lệnh regen. Với chế độ khoá, khi lớp đã bị khoá, các đối tượng trong lớp sẽ vẫn
được hiển thị trên màn hình và vẫn được in ra, nhưng người sẽ không thể hiệu chỉnh các đối tượng đó.

- 40 -
TỰ ĐỘNG HOÁ THIẾT KẾ CẦU ĐƯỜNG Lập trình trên ứng dụng nền

LineWeight Gán/trả về bề dày nét của lớp

Lock Bật/tắt chế độ khoá lớp, giá trị kiểu Boolean

Name Gán/trả về tên của lớp

d. Thao tác trên tập lựa chọn – SelectionSet


Trong quá trình thao tác với bản vẽ, đôi lúc người dùng cần phải nhóm các đối tượng lại để
sau đó thực hiện một thao tác nào đó trên nhóm đối tượng đó, chẳng hạn như khi cần đổi
màu các đường thẳng do người dùng chọn chẳng hạn, lúc đó, ta sẽ xử dụng đến tập lựa
chọn – SelectionSet.
Để sử dụng tập lựa chọn, cần phải thực hiện qua hai bước: tạo một đối tượng SelectionSet
và thêm vào tập đối tượng SelectionSets; Thêm các đối tượng vào tập lựa chọn.

Tạo tập lựa chọn mới


Để tạo một tập lựa chọn mới, ta sử dụng phương thức Add có trong tập đối tượng
SelectionSets, với chỉ một tham số cần truyền vào là tên của tập lựa chọn.
’Tạo tập lựa chọn mới
Dim sset As AcadSelectionSet
Set sset = ThisDrawing.SelectionSets.Add("NewSelectionSet")
Nếu có một tập lựa chọn trùng tên, AutoCAD sẽ báo lỗi. Chính vì vậy, trong khi lập trình,
ta nên xoá tập lựa chọn đi nếu ta không dùng đến tập lựa chọn đó nữa.
’Xoá tập lựa chọn
ThisDrawing.SelectionSets.Item("NewSelectionSet").Delete

Thêm đối tượng vào tập lựa chọn


Ta có thể thêm các đối tượng vào trong tập lựa chọn hiện hành bằng cách sử dụng một
trong những phương thức sau:

Phương thức Giải thích

AddItems ITEMS Thêm các đối tượng có trong mảng đối tượng ITEMS vào tập lựa chọn

Select Lựa chọn các đối tượng và thêm vào trong tập lựa chọn. Ta có thể chọn tất
cả các đối tượng, các đối tượng bên trong và cắt ngang qua một hình chữ
nhật, các đối tượng bên trong và cắt ngang qua hình đa giác, đối tượng
vừa mới tạo, đối tượng trong tập lựa chọn vừa mới tạo, đối tượng bên
trong một cửa sổ, đối tượng bên trong hình đa giác.

SelectAtPoint Chọn các đối tượng đi qua một điểm và thêm vào tập lựa chọn

SelectByPolygon Chọn các đối tượng bên trong một đa giác và thêm vào tập lựa chọn

SelectOnScreen Nhắc người dùng chọn đối tượng trên màn hình và thêm vào tập lựa chọn

Ví dụ sau sẽ minh hoạ cách thức thêm đối tượng vào tập lựa chọn
Sub Ch4_AddToASelectionSet()
’ Tạo tập đối tượng mới
Dim sset As AcadSelectionSet

- 41 -
TỰ ĐỘNG HOÁ THIẾT KẾ CẦU ĐƯỜNG Lập trình trên ứng dụng nền

Set sset = ThisDrawing.SelectionSets.Add("SS1")


’ Nhắc người dùng chọn đối tượng để thêm vào tập lựa chọn
’ Để kết thúc việc chọn đối tượng, nhấn phím ENTER.
sset.SelectOnScreen
’ Duyệt qua tập lựa chọn và gán màu đối tượng là màu xanh
Dim entry As AcadEntity
For Each entry In sset
entry.Color = acBlue
entry.Update
Next entry
End Sub

Loại bỏ đối tượng ra khỏi tập lựa chọn


Sau khi tạo tập lựa chọn, ta có thể xử lý tất cả các đối tượng hoặc chỉ lựa chọn để xử lý
một số đối tượng trong tất cả các đối tượng đã được lựa chọn. Để loại bỏ đối tượng khỏi
tập lựa chọn, ta sử dụng một trong những phương thức sau:

Phương thức Giải thích

RemoveItems ITEMS Phương thức này sẽ gỡ bỏ các đối tượng có trong mảng đối tượng
ITEMS. Các đối tượng đã được gỡ bỏ sẽ không nằm trong tập lựa
chọn, nhưng vẫn tồn tại bình thường trong bản vẽ.

Clear Phương thức này sẽ gỡ bỏ tất cả các đối tượng trong tập lựa chọn.
Tập lựa chọn vẫn tồn tại nhưng không chứa đối tượng nào cả. Các
đối tượng đã được gỡ bỏ vẫn tồn tại bình thường trong bản vẽ.

Erase Phương thức này sẽ xoá tất cả các đối tượng có trong tập lựa chọn.
Tập lựa chọn vẫn tồn tại nhưng không chứa đối tượng nào cả. Các
đối tượng có trong tập lựa chọn sẽ bị xoá và không còn tồn tại trong
bản vẽ.

Delete Phương thức này sẽ xoá tập lựa chọn. Tập đối tượng sẽ không còn
tồn tại nữa. Các đối tượng có trong tập lựa chọn vẫn tồn tại bình
thường trong bản vẽ.

Sử dụng bộ lọc trong tập lựa chọn


Đôi lúc, trong quá trình chọn đối tượng, ta chỉ cần quan tâm đến một số đối tượng nào đó,
chẳng hạn như chỉ chọn các đối tượng có màu đỏ. Khi đó, ta có thể sử dụng bộ lọc cho tập
lựa chọn, và như thế, chỉ có các đối tượng thoả mãn các yêu cầu đã chỉ ra trong bộ lọc thì
mới được thêm vào tập lựa chọn. Để sử dụng được bộ lọc, ta cần phải xác định được kiểu
bộ lọc và dữ liệu tương ứng với kiểu bộ lọc. Danh sách của các loại bộ lọc có thể tham
khảo trong tài liệu “AutoCAD DXF Reference” trong tài liệu trợ giúp của AutoCAD.
Ví dụ sau minh họa nhiều bộ lọc khác nhau.
’Chỉ thêm những đối tượng kiểu Text vào tập lựa chọn:
FilterType = 0
FilterData = "TEXT"
sset.SelectOnScreen FilterType, FilterData
’Chỉ thêm những đối tượng thuộc lớp FLOOR9 vào tập lựa chọn:
FilterType = 8

- 42 -
TỰ ĐỘNG HOÁ THIẾT KẾ CẦU ĐƯỜNG Lập trình trên ứng dụng nền

FilterData = "FLOOR9"
sset.SelectOnScreen FilterType, FilterData
’Chỉ thêm những đối tượng có màu đỏ vào tập lựa chọn:
Filter Type = 62
Filter Data = 5
sset.SelectOnScreen FilterType, FilterData
e. Nhập dữ liệu từ người dùng
Trong quá trình lập trình, việc tạo ra sự tương tác với người sử dụng trong chương trình là
điều không thể thiếu. Ngoài cách nhập dữ liệu thông qua hệ thống các cửa sổ (Form), ta
còn có thể tạo ra tương tác với người dùng thông qua các phương thức có trong đối tượng
Utility. Các phương thức này sẽ hiển thị một dòng nhắc trên dòng lệnh của AutoCAD và
yêu cầu người sử dụng nhập vào nhiều kiểu dữ liệu khác nhau (tuỳ thuộc vào từng loại
phương thức) như chọn một điểm trên màn hình, chọn đối tượng, nhập vào một số
nguyên,…
Dưới đây là một số phương thức thường được sử dụng của đối tượng Utility:

Phương thức Giải thích

GetInteger([dòng_nhắc])
AutoCAD sẽ dừng lại, hiển thị dòng_nhắc và chờ người dùng nhập vào một số nguyên.
Phương thức này sẽ trả về số nguyên mà người dùng nhập vào.

GetString([dòng_nhắc])
AutoCAD sẽ dừng lại, hiển thị dòng_nhắc và chờ người dùng nhập vào một chuỗi.
Phương thức này sẽ trả về chuỗi mà người dùng nhập vào.

GetPoint([điểm_cơ_sở] [, dòng_nhắc])
AutoCAD sẽ dừng lại, hiển thị dòng_nhắc và chờ người dùng chọn một điểm trên màn
hình. Khi muốn chọn một điểm tương đối với một điểm nào đó, ta sẽ truyền toạ độ
điểm đó thông qua tham số điểm_cơ_sở. Phương thức này sẽ trả về toạ độ điểm mà
người dùng nhập vào.

GetDistance([điểm_cơ_sở] [, dòng_nhắc])
AutoCAD sẽ dừng lại, hiển thị dòng_nhắc và chờ người dùng nhập vào khoảng cách.
Khoảng cách nhập vào có thể là một số nguyên, hoặc người dùng chọn hai điểm, hoặc
chỉ định trước một điểm (thông qua tham số điểm_cơ_sở) và người dùng chọn một
điểm trên màn hình. Phương thức này sẽ trả về khoảng cách giữa hai điểm.

GetAngle([điểm_cơ_sở] [, dòng_nhắc])
AutoCAD sẽ dừng lại, hiển thị dòng_nhắc và chờ người dùng nhập vào góc. Góc nhập
vào có thể là một số chỉ góc (đơn vị là độ), hoặc người dùng chọn hai điểm, hoặc chỉ
định trước một điểm (thông qua tham số điểm_cơ_sở) và người dùng chọn một điểm.
Giá trị trả về có đơn vị là Radian chỉ góc giữa tia nối hai điểm đã chọn và trục Ox (trong
mặt phẳng Oxy).

Ví dụ sau minh hoạ cách nhập toạ độ điểm, sử dụng phương thức GetPoint:
Sub Ví_dụ_GetPoint()
' Ví dụ sau trả về điểm do người dùng nhập vào
Dim returnPnt As Variant

- 43 -
TỰ ĐỘNG HOÁ THIẾT KẾ CẦU ĐƯỜNG Lập trình trên ứng dụng nền

' Không sử dụng điểm cơ sở


returnPnt = ThisDrawing.Utility.GetPoint(, "Enter a point: ")
MsgBox "The WCS of the point is: " & returnPnt(0) & ", " _
& returnPnt(1) & ", " & returnPnt(2) & vbCrLf & _
"(Enter the next value without prompting.)"
' Sử dụng điểm cơ sở
Dim basePnt(0 To 2) As Double
basePnt(0) = 2#: basePnt(1) = 2#: basePnt(2) = 0#
returnPnt = ThisDrawing.Utility.GetPoint(basePnt, _
"Enter a point: ")
MsgBox "The WCS of the point is: " & returnPnt(0) & ", _
" & returnPnt(1) & ", " & returnPnt(2)
' Tạo một đường thẳng từ điểm cơ sở và điểm mà người dùng
' nhập vào sau cùng
Dim lineObj As AcadLine
Set lineObj = ThisDrawing.ModelSpace.AddLine _
(basePnt, returnPnt)
ZoomAll
End Sub
f. Một số thao tác khác

Gán và lấy biến hệ thống


§ Gán biến hệ thống: Document.SetVariable
§ Lấy biến hệ thống: Document.GetVariable
Ví dụ sau sẽ lấy và gán biến hệ thống MIRRTEXT, là biến quy định cách thức lấy đối
xứng một đối tượng văn bản.
'Lấy giá trị biến hệ thống và hiển thị thông báo
MsgBox ThisDrawing.GetVariable("MIRRTEXT")
'Gán biến hệ thống bằng 1
ThisDrawing.SetVariable "MIRRTEXT", 0

Sử dụng các lệnh sẵn có của AutoCAD


Khi cần thực hiện một số lệnh thông qua cửa sổ dòng lệnh của AutoCAD, ta có thể sử
dụng phương thức SendCommand có trong đối tượng Document.
Ví dụ sau sẽ vẽ một đường thẳng trong AutoCAD thông qua dòng lệnh
'Vẽ đường thẳng từ điểm (0,0) đến (100,100)
ThisDrawing.SendCommand "line 0,0 100,100" & vbCr & vbCr

Một số lệnh khác


§ Thu phóng toàn bộ đối tượng: ZoomExtent
§ Thu phóng toàn bộ bản vẽ: ZoomAll
§ Cập nhật toàn bộ bản vẽ: Update
§ Thoát khỏi AutoCAD: Quit

5.3. Bài tập áp dụng

- 44 -
TỰ ĐỘNG HOÁ THIẾT KẾ CẦU ĐƯỜNG Lập trình trên ứng dụng nền

- 45 -
TỰ ĐỘNG HOÁ THIẾT KẾ CẦU ĐƯỜNG Lập trình trên ứng dụng nền

6. Phụ lục: Cơ bản về ngôn ngữ Visual Basic


6.1. Quy tắc viết mã lệnh
Cũng giống như các ngôn ngữ lập trình khác, VB cũng đưa ra những quy tắc cho người lập
trình trong quá trình viết mã lệnh. 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.
§ 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.
Các lỗi cú pháp này sẽ được VBA IDE phát hiện và báo lỗi cho người lập trình ngay trong
quá trình viết mã lệnh.
Ngoài ra, Visual Basic còn có khả năng gợi nhớ và tự hoàn thành mã lệnh (Auto code)
giúp người lập trình có thể tạo mã lệnh một cách thuận tiện và nhanh nhất.

6.2. 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 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:
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

6.3. Các kiểu dữ liệu cơ bản


Dưới đây sẽ liệt kê các kiểu dữ liệu cơ bản thường được sử dụng trong quá trình lập trình
với VBA:

6.3.1. Kiểu logic (boolean)


Chỉ chứa hai giá trị TRUE và FALSE. 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ừ

- 46 -
TỰ ĐỘNG HOÁ THIẾT KẾ CẦU ĐƯỜNG Lập trình trên ứng dụng nền

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.

6.3.2. Kiểu số nguyên


Dùng để chứa các giá trị là số nguyên. Một số kiểu số nguyên thường dùng bao gồm:
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

6.3.3. Kiểu số thực


Dùng để chứa các giá trị là số thực. Một số kiểu số thực thường dùng bao gồm:
Kiểu số thực K.thước Phạm vi
Single 4 byte Từ -3.402823E38 đến -1.401298E-45
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

6.3.4. Kiểu mảng (array)


Mảng là một khối dữ liệu gồm các phần tử có cùng tên và kiểu dữ liệu. Các phần tử trong
mảng phân biệt với nhau bằng các chỉ số. 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 VB có hai loại biến mảng là mảng có chiều dài cố định và mảng động (chiều dài có
thể thay đổi lúc thực thi). Mảng động có thể dùng tương tự như kiểu con trỏ, là kiểu dữ liệu
mà VB không trực tiếp hỗ trợ.

6.3.5. Kiểu chuỗi (String)


Kiểu chuỗi có thể được coi là mảng một chiều với kiểu dữ liệu của các phần tử là kiểu 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 biến đó. Người dùng cũng có thể khai báo biến kiểu chuỗi có
chiều dài cố định.
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,… Ta có thể tra cứu các hàm này trong các tài liệu tham khảo như
MSDN hoặc Object Browse (thư viện Strings).

6.3.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ờ.

- 47 -
TỰ ĐỘNG HOÁ THIẾT KẾ CẦU ĐƯỜNG Lập trình trên ứng dụng nền

6.3.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.

6.3.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.

6.3.9. Kiểu lớp (Class)


Kiểu lớp dùng để mô tả đối tượng. Trong lớp, các thuộc tính và phương thức của đối tượng
sẽ được định nghĩa và cài đặt. Trong VBA lớp được xây dựng trong Class Module hoặc sử
dụng lại trong các thư viện lớp sẵn có.
Lớp có thể gồm các thành phần sau:
§ Các thuộc tính (Property): thực chất là các biến thành viên khai báo trong lớp
đó, các thuộc tính có kiểu thông thường hoặc bản thân nó có thể có kiểu là một
lớp khác.
§ Các phương thức (Method): thực chất là các chương trình con được khai báo
bên trong lớp, gồm hàm (Function) hoặc thủ tục (Sub) thành viên.
§ Ngoài ra trong VB, lớp có thể 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.

6.4. Khai báo trong VB


6.4.1. Khai báo hằng số
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ố
Khi sử dụng từ khoá Public, thì hằng số khai báo sẽ có thể sử dụng trong tất cả các
chương trình con của tất cả các mô-đun của tất cả các ứng dụng.
Còn nếu sử dụng từ khoá Private, thì hằng số vừa khai báo chỉ có thể sử dụng bên trong
mô-đun nơi khai báo hằng số đó mà thôi.

6.4.2. Khai báo biến


Cú pháp: Dim <tên_biến> as <Kiểu_dữ_liệu>
Ngoài ra còn có thể dùng các từ khóa Public hay Private nhằm xác định phạm vi hiệu
lực của biến.
Public <tên_biến> as <Kiểu_dữ_liệu>
Hay: Private <tên_biến> as <Kiểu_dữ_liệu>

- 48 -
TỰ ĐỘNG HOÁ THIẾT KẾ CẦU ĐƯỜNG Lập trình trên ứng dụng nền

6.4.3. Khai báo kiểu tự định nghĩa


Trong VB có thể khai báo các kiểu dữ liệu dạng bản ghi gồm các trường 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, ta dùng toán tử (.)
hoặc dùng cặp từ khóa With… End With
Ví dụ: Dữ liệu về điểm đo trong khảo sát địa hình có thể được xây dựng gồm: chỉ số của
điểm (id), tên điểm (Ten), tọa độ x, tọa độ y, cao độ z, mã địa vật (ma_dia_vat). Để tạo
được biến nhằm lưu giữ thông tin về một điểm đo, ta tiến hành khai báo kiểu và khai báo
biến như sau
‘ Khai báo kiểu
Type diemdo
Id as Long
Ten as String
X as Double, Y as Double, Z as Double
Ma_dia_vat as Long
End Type

‘ Tạo biến và gán dữ liệu


Dim diem as diemdo
With diem
.Id = 1
.x = 1.5: .y = 24: .z = 11.3
.Ten = “Điểm 1”
.Ma_dia_vat = 1
End With

6.4.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 (chỉ số xuất phát mặc định
là 0 hoặc được xác định thông qua khai báo Option Base, như vậy trong
trường hợp này 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ố đến 6.

- 49 -
TỰ ĐỘNG HOÁ THIẾT KẾ CẦU ĐƯỜNG Lập trình trên ứng dụng nền

6.4.5. Khai báo mảng động


Cú pháp: [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, ta 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.
Ví dụ:
Dim a() as Long
Redim a(1 to 5) as Long
a(1) = 100: a(2) = 200
‘ Sau dòng lệnh này a(1) và a(2) có giá trị tương ứng 100
‘ và 200
Redim a(1 to 3, 2 to 4) as Long
‘ Sau dòng lệnh này mảng được tạo mới hoàn toàn
‘ và là một mảng 2 chiều. Các giá trị a(1) và a(2)
‘ không còn giá trị là 100 và 200 nữa
Trong trường hợp muốn thay đổi kích thước của mảng mà không làm mất dữ liệu sẵn có, ta
dùng lệnh ReDim với từ khóa Preserve. Tuy nhiên, chỉ có thay đổi biên trên của chiều
cuối cùng của mảng, nếu không sẽ làm phát sinh lỗi.
Ví dụ
Dim a() as Long
ReDim a(1 to 2, 1 to 2) as Long
a(1,1) = 100: a(1,2) = 200
a(2,1) = 150: a(2,2) = 250

ReDim Preserve a(1 to 2, 1 to 3) as Long


‘ Thay đổi mở rộng mảng thêm chiều cuối cùng của mảng
‘ mà không ảnh hưởng đến các dữ liệu trước. Các phần tử
‘ a(1,1), a(1,2), a(2,1) và a(2,2) vẫn giữ nguyên giá trị
‘ ban đầu

6.4.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ị>

- 50 -
TỰ ĐỘNG HOÁ THIẾT KẾ CẦU ĐƯỜNG Lập trình trên ứng dụng nền

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>
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, sử dụng toán tử (.)
<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)>

6.5. Toán tử và các hàm thông dụng


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, kiểm tra tính bằng nhau, gán, thao tác trên biến và thực hiện nhiều thao tác khác.
Dưới đây là danh sách một số toán tử thông dụng:

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. And(TRUE,TRUE)=FALSE; các trường hợp khác cho kết quả
bằng FALSE
Or Or(FALSE,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

- 51 -
TỰ ĐỘNG HOÁ THIẾT KẾ CẦU ĐƯỜNG Lập trình trên ứng dụng nền

Toán tử Mô tả

< Nhỏ hơn


<= Nhỏ hơn hoặc bằng

Để tạo điều kiện thuận lợi cho người lập trình khi viết chương trình, trong VB có chứa sẵn
một thư viện hàm đã được định nghĩa trước. Dưới đây xin giới thiệu 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
Val(str) Chuyển đổi chuỗi <str> thành giá trị kiểu số

6.6. Cấu trúc lệnh


6.6.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_1
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 không đúng thì chương trình sẽ
thực hiện các dòng lệnh tiếp theo sau từ khoá End If.
Sơ đồ khối của cấu trúc lệnh kiểu này có thể được biểu diễn như sau:

True
Điều kiện Khối lệnh

False

Ngoài cấu trúc cơ bản trên, trong nhiều trường hợp, ta phải sử dụng cấu trúc điều kiện mở
rộng như sau:
Cú pháp:

- 52 -
TỰ ĐỘNG HOÁ THIẾT KẾ CẦU ĐƯỜNG Lập trình trên ứng dụng nền

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>, 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:

True
Điều kiện Khối_lệnh_1

False

Khối_lệnh_2

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]
[ElseIf <điều_kiện_n> Then
[khối_lệnh_của ElseIf] ...
[Else
[Khối_lệnh_của_Else]]
End If

6.6.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

- 53 -
TỰ ĐỘNG HOÁ THIẾT KẾ CẦU ĐƯỜNG Lập trình trên ứng dụng nền

Diễn giải tiến trình của cấu trúc lựa chọn như sau: <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. 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
<khối_lệnh_else> sẽ được thực hiện nếu có từ khoá Case Select, nếu không có từ
khoá Case Select thì chương trình sẽ thực hiện các dòng lệnh tiếp theo sau từ khoá End
Select.
Sơ đồ khối của cấu trúc lệnh kiểu này có thể được biểu diễn như sau:

<BTKT> thoả mãn <ĐK_1> TRUE khối_lệnh_1

FALSE
... ...

<BTKT> thoả mãn <ĐK_n> TRUE khối_lệnh_n

FALSE

khối_lệnh_else

Chú thích
BTKT: biểu thức kiểm tra
ĐK: điều kiện

6.6.3. Vòng lặp xác định


Thực hiện một khối lệnh lặp theo một biến đếm với số lần lặp đã được xác định
Các từ khóa: For, to, Step, Next
Cú pháp
For <biến_đếm>=<điểm_đầu> to <điểm_cuối> [Step <bước_nhảy>]
[Khối_lệnh]
Next
Diễn giải tiến trình của vòng lặp xác định: sau khi thực hiện <khối_lệnh>,
<biến_đếm> sẽ được cộng thêm giá trị <bước_nhẩy> nếu sử dụng từ khoá step, nếu
không có từ khoá step thì giá trị bước nhảy mặc định là 1. Vòng lặp kết thúc khi
<biến_đếm> lớn hơn <điểm_cuối>.

6.6.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, theo một biểu thức điều kiện.
(biểu thức điều kiện có giá trị Boolean: True hoặc False). Có các kiểu cú pháp như sau:
§ Kiểu 1: Lặp trong khi điều kiện là TRUE

- 54 -
TỰ ĐỘNG HOÁ THIẾT KẾ CẦU ĐƯỜNG Lập trình trên ứng dụng nền

Do While <đ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 While <điều kiện>
§ Kiểu 2: Lặp cho đến khi điều kiện là TRUE
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>

6.7. 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 là Hàm (Function) và Thủ tục (Sub).

6.7.1. Hàm (Function)


Là chương trình con có trả về giá trị. Cú pháp khai báo như sau:
[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ụ: 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

6.7.2. Thủ tục (Sub)


Là chương trình con không trả về giá trị. Cú pháp khai báo như sau:
[Private/Public] Sub <Tên_hàm> ([danh sách tham số])
[Khối_lệnh]
End Sub

- 55 -

You might also like