bai giang vba

55
TĐỘNG HOÁ THI T KCU ĐƯỜNG Lp trình trên ng dng nn - 1 - MÔN HC TĐỘNG HÓA THIT KCU ĐƯỜNG PHN: LP TRÌNH TRÊN NG DNG NN 1. Tng quan Ngày nay, sphát trin mnh mvnhiu mt ca máy tính (phn cng) cũng như các chương trình ng dng (phn mm) đã to ra mt tin đề rt thun li cho vic ng dng máy tính trong quá trình l p hsơ thiết kế ca các loi công trình xây dng. Thc tế đã chng trng, hin nay, hu hết các đơn vtư vn thiết kế đều trang bhthng phn cng và phn mm để phc vcông tác thiết kế, nói cách khác, mc độ tin hc hoá trong thiết kế đã được chú trng và đang trong giai đon phát tri n rt nhanh. Mc độ này được đánh giá chyếu da trên khnăng ng dng chương trình máy tính trong các bước ca quá trình thiết kế. Phn mm phc vvic thiết kế công trình giao thông, nói chung, hin có nhiu vslượng nhưng có thđược chia làm hai loi chính: § Các phn mm do đơn vtư vn thiết kế tphát tri n, hu hết là các phn mm có quy mô không ln và tp trung gii quy ết các bài toán cc b, chuyên bit trong lĩnh vc chuyên ngành. § Các phn mm thương mi do các công ty tin hc chuyên nghip thc hin, chúng có quy mô ln, gii quy ết được nhng bài toán chính, phbiến. Tuy nhiên các phn mm này vn còn nhng khiếm khuyết bi sđa dng ca thc tế thiết kế. Chính vì vy, vic xây dng thêm nhng chương trình mi, như là mt công cbsung, nhm khc phc nhng khiếm khuyết trên là cn thiết và có tính hi u qucao. Trong hsơ thiết kế công trình giao thông, vi đặc đim là phn bn vvà bn tính chiếm mt khi lượng đáng k, nên hin nay, AutoCAD và Microsoft Excel được sdng rt phbiến bi chúng đáp ng rt tt nhim vtrên. Hai phn mm này, ngoài tính ddùng, chúng còn có chung mt đặc đim rt quan trng mà các phn mm khác không có được, đó là khnăng cho phép sdng chính bn thân chúng làm nn để xây dng nhng phn mm chuyên dng khác. Và vì vy, AutoCAD và Excel trong giáo trình này còn được gi ng dng nn (theo quan nim này thì hđiu hành Windows cũng chính là mt loi ng dng nn nhưng cơ bn nht, là nn tng để xây dng mi loi chương trình ng dng khác nhau). ng dng nn Hđiu hành ng dng mrng

Upload: namhung49

Post on 18-Jun-2015

2.305 views

Category:

Documents


10 download

TRANSCRIPT

Page 1: Bai giang VBA

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

- 1 -

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 nền

Hệ điều hành

Ứng dụng mở rộng

Page 2: Bai giang VBA

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

- 2 -

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.

Page 3: Bai giang VBA

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

- 3 -

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.

Page 4: Bai giang VBA

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

- 4 -

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:

Page 5: Bai giang VBA

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

- 5 -

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.

Page 6: Bai giang VBA

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

- 6 -

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.

Page 7: Bai giang VBA

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

- 7 -

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;

Page 8: Bai giang VBA

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

- 8 -

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;

Page 9: Bai giang VBA

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

- 9 -

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.

Page 10: Bai giang VBA

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

- 10 -

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.

Page 11: Bai giang VBA

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

- 11 -

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

Page 12: Bai giang VBA

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

- 12 -

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.

Page 13: Bai giang VBA

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

- 13 -

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:

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.

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

Page 14: Bai giang VBA

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

- 14 -

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:

Rows

Application

Columns

Workbooks

Worksheets

Workbook

Worksheet

Range

Cells

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

Đối tượng

Page 15: Bai giang VBA

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

- 15 -

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.

Page 16: Bai giang VBA

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

- 16 -

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

Page 17: Bai giang VBA

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

- 17 -

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

Page 18: Bai giang VBA

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

- 18 -

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.

Page 19: Bai giang VBA

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

- 19 -

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);

Page 20: Bai giang VBA

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

- 20 -

§ 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”)

Page 21: Bai giang VBA

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

- 21 -

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

Page 22: Bai giang VBA

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

- 22 -

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 (xe/ngđ/làn) 50 100 200 500 1000 2000 5000 7000

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

Page 23: Bai giang VBA

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

- 23 -

Để 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:

( )( ) )1_(

12121 Xtraso

XXYYYTraBang −×

−−

+=

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:

Page 24: Bai giang VBA

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

- 24 -

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)) _

Kết thúc

Khai báo biến Có_thể_tra=False

I=1

I<=(Số_cột_vùng_tra)- 1

Số_tra Є [Vùng_Tra(1,i),

Vùng_tra(1,i+1)]

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

Bắt đầu

Có_thể_tra=True

X1=Số_tra

X2=Số_tra

Tra_bảng=Y1+(Y2-Y1)/(X2-X1)*(Số_tra-X1)

I=I+1

Tra_bảng=Y1

Tra_bảng=Y2

Thông báo: không tra được Tra_bảng=Null

Sai

Đúng

Đúng

Sai

Đúng

Đúng

Sai

Sai

Đúng

Sai

Page 25: Bai giang VBA

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

- 25 -

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

Page 26: Bai giang VBA

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

- 26 -

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.

Page 27: Bai giang VBA

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

- 27 -

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

Page 28: Bai giang VBA

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

- 28 -

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.

Page 29: Bai giang VBA

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

- 29 -

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:

Page 30: Bai giang VBA

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

- 30 -

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

Page 31: Bai giang VBA

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

- 31 -

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)

Page 32: Bai giang VBA

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

- 32 -

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.

Page 33: Bai giang VBA

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

- 33 -

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)

Page 34: Bai giang VBA

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

- 34 -

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,…;

Page 35: Bai giang VBA

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

- 35 -

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

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.

Application

Preferences

Documents

Document

ModalSpace

PaperSpace

PViewPort

DimStyles

Layers

Arc

Circle

Hatch

Line

MText

Point

Polyline

Ray

Text

Layouts

Linetypes

TextStyles

SelectionSets

Plot

DimStyle

Layer

Layout

Linetype

TextStyle

SelectionSet

MenuGroups

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

Đối tượng

Utility

Page 36: Bai giang VBA

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

- 36 -

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

Page 37: Bai giang VBA

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

- 37 -

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

Page 38: Bai giang VBA

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

- 38 -

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)

Page 39: Bai giang VBA

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

- 39 -

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)

Page 40: Bai giang VBA

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

- 40 -

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

Page 41: Bai giang VBA

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

- 41 -

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

Page 42: Bai giang VBA

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

- 42 -

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

Page 43: Bai giang VBA

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

- 43 -

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

Page 44: Bai giang VBA

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

- 44 -

' 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

Page 45: Bai giang VBA

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

- 45 -

Page 46: Bai giang VBA

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

- 46 -

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ừ

Page 47: Bai giang VBA

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

- 47 -

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

Page 48: Bai giang VBA

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

- 48 -

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>

Page 49: Bai giang VBA

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

- 49 -

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.

Page 50: Bai giang VBA

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

- 50 -

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

Page 51: Bai giang VBA

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

- 51 -

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

Page 52: Bai giang VBA

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

- 52 -

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:

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:

False

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

Page 53: Bai giang VBA

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

- 53 -

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:

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

False

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

Khối_lệnh_2

Page 54: Bai giang VBA

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

- 54 -

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:

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

<BTKT> thoả mãn <ĐK_1>

<BTKT> thoả mãn <ĐK_n>

khối_lệnh_1

khối_lệnh_n

khối_lệnh_else

TRUE

TRUE

FALSE

FALSE

...

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

...

Page 55: Bai giang VBA

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

- 55 -

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