Giáo trình Tự động hóa thiết kế cầu đường - Lê Quỳnh Mai

pdf 485 trang ngocly 2840
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình Tự động hóa thiết kế cầu đường - Lê Quỳnh Mai", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdfgiao_trinh_tu_dong_hoa_thiet_ke_cau_duong_le_quynh_mai.pdf

Nội dung text: Giáo trình Tự động hóa thiết kế cầu đường - Lê Quỳnh Mai

  1. Lê Quỳnh Mai (chủ biên) – Bùi Cơng Độ – Trương Thanh Hồng – Hồng Thuỳ Linh Nguyễn Đình Phương – Lê Đắc Hiền – Đỗ Xuân Cảnh – Phan Thị Thu Hiền Giáo trình TTựự đđộộnngg hhĩĩaa TThhiiếếtt kkếế ccầầuu đđưườờnngg NXB Đại học Giao thơng vận tải - 2009
  2. Lê Quỳnh Mai (chủ biên) – Bùi Cơng Độ – Trương Thanh Hồng – Hồng Thuỳ Linh Nguyễn Đình Phương – Lê Đắc Hiền – Đỗ Xuân Cảnh – Phan Thị Thu Hiền Giáo trình Tự động hĩa Thiết kế cầu đường NXB Đại học giao thơng vận tải - 2009
  3. Lời nĩi đầu Tự động hĩa trong tất cả lĩnh vực hiện đang được xã hội quan tâm đặc biệt bởi nhờ nĩ năng suất lao động được nâng cao, chất lượng sản phẩm ổn định và tốt hơn, nhiều ý tưởng mới cĩ cơ hội trở thành hiện thực. Tự động hĩa cơng tác thiết kế cơng trình giao thơng cũng khơng nằm ngồi quy luật chung đĩ. Hiện nay, hầu hết các cơng ty trong lĩnh vực tư vấn thiết kế cơng trình giao thơng đều rất chú trọng thực hiện tự động hĩa cơng tác thiết kế trong cơng ty của mình. Điều này được thể hiện rõ nét trong việc đầu tư của các cơng ty (mua sắm máy tính, phần mềm và đào tạo nhân lực) cũng như triển khai tự động hĩa thiết kế rất nhiều cơng trình trong thực tế. Với sự đa dạng của mình, các bài tốn trong cơng tác thiết kế luơn địi hỏi sự linh hoạt của cơng tác tự động hĩa. Chính vì vậy, để phần nào đáp ứng được yêu cầu cấp bách từ thực tế sản xuất, nội dung cuốn giáo trình này đề cập đến tất cả các vấn đề cơ bản nhất của việc thực hiện tự động hĩa thiết kế cơng trình giao thơng cũng như phương pháp để nâng cao mức độ tự động hĩa cho phù hợp với từng yêu cầu chuyên biệt xuất hiện trong quá trình thiết kế. Nội dung của giáo trình này là sự đúc kết kinh nghiệm giảng dạy mơn Tự động hĩa thiết kế cầu đường cho sinh viên ngành xây dựng cơng trình giao thơng và quá trình tham gia thực hiện tự động hĩa cơng tác thiết kế ngồi sản xuất của các tác giả cũng như cập nhật mới nhất những cơng nghệ chủ chốt phục vụ cho việc tự động hĩa. Hơn nữa, nội dung chính tập trung vào những thành phần cốt lõi phục vụ cho mục đích tự động hĩa thiết kế cầu đường, cùng với những nội dung mang tính gợi mở và định hướng cho từng chuyên ngành, khiến cho cuốn giáo trình này hồn tồn phù hợp với định hướng đào tạo theo tín chỉ của Nhà trường. Chúng tơi xin chân thành cảm ơn sự đĩng gĩp ý kiến của các đồng nghiệp trong quá trình hồn thiện cuốn giáo trình này. Với tốc độ phát triển rất nhanh của cơng nghệ như hiện nay thì chắc chắn rằng trong thời gian tới, nhiều vấn đề liên quan đến việc thực hiện tự động hĩa thiết kế sẽ phải thay đổi, và chúng tơi hy vọng rằng, cùng với các ý kiến đĩng gĩp của bạn đọc và sự cập nhật kiến thức của bản thân, thì lần xuất bản sau của cuốn sách này sẽ hồn thiện hơn nữa, sẽ đáp ứng tốt hơn nữa yêu cầu của bạn đọc. Hà Nội, ngày 15 tháng 01 năm 2009 Các tác giả.
  4. MỤC LỤC PHẦN I: MỞ ĐẦU 1 1. Tổng quan về thiết kế và tự động hĩa thiết kế cơng trình giao thơng 1 2. Đơi nét về các phần mềm dùng cho thiết kế cơng trình giao thơng 3 3. Lựa chọn phần mềm dùng cho thiết kế cơng trình giao thơng 5 4. Chuyên biệt hĩa phần mềm 6 5. Kết chương 11 PHẦN II: LẬP TRÌNH TRÊN ỨNG DỤNG NỀN 12 CHƯƠNG I: KHÁI NIỆM 12 CHƯƠNG II: TỔNG QUAN VỀ VBA 17 1. Đặc điểm của VBA 17 2. Trình tự xây dựng một dự án bằng VBA 17 3. Cấu trúc của một dự án VBA 18 4. Mơi trường phát triển tích hợp VBA IDE 19 5. Ví dụ đầu tiên với VBA 21 CHƯƠNG III: CƠ BẢN VỀ NGƠN NGỮ LẬP TRÌNH VISUAL BASIC 23 1. Những qui định về cú pháp 23 2. Các trợ giúp về cú pháp trong quá trình viết mã lệnh 23 3. Tính năng gợi nhớ và tự hồn thiện mã lệnh 24 4. Từ khố trong VB 26 5. Các kiểu dữ liệu cơ bản 26 6. Khai báo biến trong VB 33 7. Các tốn tử và hàm thơng dụng 39 8. Các cấu trúc điều khiển 42 9. Chương trình con 50 10. Tổ chức các chương trình con theo hệ thống các mơ‐đun chuẩn 58 11. Làm việc với UserForm và các thành phần điều khiển. 59 12. Các hộp thoại thơng dụng. 75 13. Lập trình xử lý tập tin 79 14. Gỡ rối và bẫy lỗi trong VBAIDE 89 15. Bài tập ứng dụng 97 CHƯƠNG IV: LẬP TRÌNH TRÊN MICROSOFT EXCEL 103 1. Tổng quan về Microsoft Excel 103 2. Macro 105 3. Xây dựng hàm mới trong Excel 111 4. Add‐in và Phân phối các ứng dụng mở rộng 117 5. Hệ thống các đối tượng trong Excel 121 6. Sự kiện của các đối tượng trong Excel 141 7. Các thao tác cơ bản trong Excel 150 8. Giao diện người dùng 161 9. Bài tập ứng dụng 183
  5. CHƯƠNG V: LẬP TRÌNH TRÊN AUTOCAD 187 1. Tổng quan về AutoCAD 187 2. Quản lý dự án VBA trong AutoCAD 190 3. Macro 194 4. Hệ thống đối tượng trong AutoCAD 199 5. Các thao tác cơ bản trong AutoCAD 206 6. Giao diện người dùng 277 7. Bài tập ứng dụng 281 PHẦN III: SỬ DỤNG PHẦN MỀM TRONG THIẾT KẾ CƠNG TRÌNH GIAO THƠNG 283 CHƯƠNG I: MỞ ĐẦU 283 1. Khái niệm về thiết kế và tự động hĩa thiết kế cơng trình giao thơng 283 2. Thiết kế cơng trình giao thơng trên máy tính 285 3. Thiết kế đường ơ tơ trên máy tính 286 4. Thiết kế cầu trên máy tính 287 CHƯƠNG II: XÂY DỰNG BẢN ĐỒ SỐ 288 1. Khái niệm về bản đồ số 288 2. Nguyên tắc xây dựng bản đồ số 288 3. Xây dựng bản đồ số từ số liệu đo tồn đạc với Nova‐TDN 291 4. Xây dựng bản đồ số từ bản đồ địa hình in trên giấy với Nova‐TDN sử dụng phần mềm CAD Overlay 298 5. Xây dựng bản đồ số từ bản đồ địa hình in trên giấy với Nova‐TDN khơng dùng phần mềm CAD Overlay 301 6. Tạo trắc dọc và trắc ngang đường tự nhiên của tuyến đường trên bản đồ số 303 CHƯƠNG III: PHÂN TÍCH, TÍNH TỐN KẾT CẤU 310 1. Tổng quan về phân tích, tính tốn kết cấu 310 2. Quá trình mơ hình hĩa kết cấu 313 3. Phân tích kết cấu ‐ Quá trình xử lý 323 4. Các thao tác với kết quả ‐ Quá trình hậu xử lý 324 5. Xuất kết quả 326 6. Ứng dụng MIDAS/Civil trong mơ hình hĩa và phân tích kết cấu. 327 7. Một số ví dụ minh họa 402 PHẦN IV: TÀI LIỆU THAM KHẢO 466 PHẦN V: MỤC LỤC HÌNH VẼ 467
  6. MỞ ĐẦU PHẦN I: MỞ ĐẦU 1. Tổng quan về thiết kế và tự động hĩa thiết kế cơng trình giao thơng Cơng tác thiết kế luơn cĩ một vị trí quan trọng từ khi lập dự án cho đến khi thi cơng, hồn thành và đưa cơng trình vào sử dụng. Từ trước đến nay, cơng tác khảo sát thiết kế được biết đến như một quá trình gồm nhiều cơng đoạn khác nhau, mà mục đích cuối cùng là xác lập cấu tạo của cơng trình, cách thức thi cơng chủ đạo để tạo ra cơng trình trên thực địa và phương pháp khai thác cơng trình một cách hiệu quả nhất. Kết quả của cơng tác thiết kế được thể hiện dưới dạng hồ sơ thiết kế, nghĩa là quá trình thiết kế nhắm đến việc tạo ra một bộ hồ sơ thiết kế, mà trong đĩ nĩ mơ tả một cách đầy đủ tồn bộ mục đích của quá trình thiết kế. Thơng thường hồ sơ thiết kế bao gồm những thành phần cơ bản như sau: Bản thuyết minh: nơi thể hiện những cơ sở cho cơng tác thiết kế, lập luận của người thiết kế và giải thích những vẫn đề cơ bản của phương án thiết kế. Các loại bảng tính, bảng thống kê: nơi trình bày các kết quả tính tốn trong quá trình thiết kế, là cơ sở cho việc lập bản vẽ và xác định chi phí đầu tư cho cơng trình. Bản vẽ: nơi thể hiện chi tiết nhất cấu tạo của cơng trình cũng như phương pháp chủ đạo để thi cơng cơng trình. Dự tốn: nơi thể hiện cách thức xác định tổng mức đầu tư cho cơng trình. Mức độ chi tiết của những thành phần trong hồ sơ thiết kế phụ thuộc vào yêu cầu trong từng giai đoạn của quá trình đầu tư cho cơng trình. Ví dụ, giai đoạn lập bản vẽ thi cơng địi hỏi mức độ chi tiết cao nhất. Nếu xem xét kỹ hơn bên trong của hồ sơ thiết kế cơng trình giao thơng thì ai cũng nhận thấy rằng chúng cĩ mối liên hệ chặt chẽ với nhau theo một quan hệ logic khá rõ ràng, ví dụ các kích thước hình học trong bản vẽ sẽ phải phù hợp với kết quả tính tốn được trình bày trong các bảng tính. Điều này nĩi lên rằng, khi mơ tả mối liên hệ trên thành một chuỗi các lệnh thì ta đã cĩ trong tay thành phần cơ bản nhất của tự động hĩa thiết kế cơng trình giao thơng. Vấn đề cịn lại là tìm kiếm giải pháp thích hợp để thực hiện tự động hĩa. Tự động hĩa một cơng việc được hiểu là cơng việc đĩ được thực hiện tự động hồn tồn hay một phần nhờ cĩ sự trợ giúp của các thiết bị. Ví dụ như quá trình chế tạo xe hơi được tự động hĩa nhờ hệ thống robot trong các dây truyền sản xuất. Trong lĩnh vực thiết kế cơng trình giao thơng, do sản phẩm của cơng tác này là hồ sơ thiết kế, cho nên thiết bị trợ giúp phù hợp là các hệ thống cĩ khả năng tạo văn bản, tính tốn kết cấu, vẽ các đối tượng hình học, dựng mơ hình Hệ thống thơng tin, bao gồm phần cứng (máy tính, máy in, máy quét ) và phần mềm (các chương trình ứng dụng), đã và đang được triển khai rộng rãi trong khắp các cơng ty tư vấn thiết kế cơng trình giao thơng bởi chúng cĩ những đặc điểm rất phù hợp cho việc lập hồ sơ thiết kế cơng trình: Máy tính cùng với các phần mềm chạy trên chúng cho phép thực hiện nhiều cơng việc khác nhau như: phân tích kết cấu, vẽ đối tượng hình học, tạo văn bản, dựng mơ hình Tốc độ tính tốn nhanh, điều này cho phép đưa ra nhiều hơn một phương án thiết kế với thời gian cĩ thể chấp nhận được. Khả năng lưu trữ và tận dụng lại dữ liệu đạt hiệu quả rất cao, điều này cho phép người thiết kế cĩ thể tận dụng lại tối đa dữ liệu đã cĩ từ trước. Ví dụ, với hệ thống các bản vẽ in trên giấy, việc tận dụng lại đạt hiệu quả rất thấp, hầu như chỉ ở mức tham khảo thơng tin, 1
  7. GIÁO TRÌNH TỰ ĐỘNG HỐ THIẾT KẾ CẦU ĐƯỜNG trong khi đĩ, nếu như cũng các bản vẽ này được lưu trữ trong máy tính, ngồi việc cho phép tham khảo tương tự như bản vẽ in trên giấy, nĩ cịn cho phép tận dụng lại chính các thành phần trong bản vẽ đĩ để chỉnh sửa, kế thừa, và kết quả ta sẽ cĩ được một bản vẽ mới từ những dữ liệu cũ. Cĩ thể nĩi rằng mức độ tự động hĩa thiết kế cơng trình hiện nay đang ở nhiều cấp độ khác nhau, tùy theo từng cơng việc cụ thể, điều này được thể hiện rõ trong cách thức tạo ra từng thành phần trong hồ sơ thiết kế. Ví dụ, trong thiết kế cầu, phần phân tích kết cấu cĩ mức độ tự động hĩa rất cao, nhưng việc tạo bản vẽ lại cĩ mức độ tự động hĩa thấp hơn nhiều. Tuy vậy, xu hướng nâng cao mức độ tự động hĩa đang ngày càng rõ nét bởi sự phát triển rất mạnh của các phần mềm chuyên dụng, chúng đang là cơng cụ hỗ trợ khơng thể thiếu cho các kỹ sư thiết kế, đồng thời là thành phần chủ chốt cho quá trình tự động hĩa. Nhờ chúng mà việc phân tích kết cấu cơng trình trở nên nhanh chĩng và chính xác, nhờ chúng mà việc đưa ra các phương án thiết kế của tuyến đường cũng nh ư việc tạo mơ hình ba chiều động trở thành hiện thực. Hình I-1: Tự động hĩa thiết kế hình học đường ơ tơ với Civil 3D 2008 2
  8. MỞ ĐẦU Hình I-2: Tự động hĩa phân tích kết cấu với MIDAS/Civil 2. Đơi nét về các phần mềm dùng cho thiết kế cơng trình giao thơng Các phần mềm dùng trong thiết kế cơng trình nĩi chung rất đa dạng và hỗ trợ hầu hết các cơng đoạn trong quá trình thiết kế. Ngay từ cơng đoạn khảo sát địa hình, tồn bộ quá trình từ xử lý dữ liệu (bình sai, chuyển đổi định dạng) đến dựng mơ hình bề mặt đều đã được tự động hĩa ở mức cao, hầu hết các nội dung liên quan đến xử lý số liệu khảo sát đều được tự động thực hiện như: vẽ đường đồng mức, phân tích độ dốc bề mặt, xác định đường tụ thủy, xác định lưu vực, vẽ mặt cắt và dựng mơ hình ba chiều. Dựa vào cơng năng của các phần mềm cĩ thể chia chúng làm hai nhĩm: Nhĩm các phần mềm đa năng: là những phần mềm cĩ thể dùng cho nhiều mục đích khác nhau, đại diện cho nhĩm này là AutoCAD và Excel, ta cĩ thể sử dụng chúng trong hầu hết các giai đoạn của quá trình tạo hồ sơ thiết kế. Tuy nhiên, để cĩ thể sử dụng đa năng, các phần mềm này được thiết kế khơng tập trung vào một lĩnh vực cụ thể nào, khiến cho mức độ tự động hĩa cho từng cơng việc khơng được cao khi thực hiện trực tiếp trên các phần mềm này. Ta cĩ thể dùng AutoCAD để tạo các bản vẽ kỹ thuật cho ngành cơ khí cũng như cơng trình, bởi nguyên tắc tạo bản vẽ trong AutoCAD là “lắp ghép” từ những đối tượng hình học cơ bản. Với Excel, ta cĩ thể dùng để lập dự tốn hay tạo bảng tính duyệt kết cấu, bởi mỗi ơ trong bảng tính của nĩ đều cĩ thể nhận bất cứ nội dung nào. 3
  9. GIÁO TRÌNH TỰ ĐỘNG HỐ THIẾT KẾ CẦU ĐƯỜNG Hình I-3: Phần mềm AutoCAD và MS Excel Nhĩm các phần mềm chuyên dụng: là các phần mềm chỉ dùng được cho một mục đích cụ thể nào đĩ. Bởi đích nhắm đến của chúng là rõ ràng cho nên mức độ tự động hĩa là rất cao. Ví dụ trong phân tích kết cấu, sau khi nhập xong số liệu, phần mềm phân tích kết cấu sẽ tự động hồn tồn trong việc tính và xuất kết quả. Bởi sự đa dạng của các bài tốn thiết k ế, cho nên các phần mềm loại này cũng rất đa dạng về chủng loại và nguồn gốc, chúng cĩ thể được tạo ra từ những cơng ty sản xuất phần mềm chuyên nghiệp như Hài Hịa, AutoDesk, MIDAS IT, hay từ chính những cơng ty tư vấn thiết kế, và thậm chí từ chính những kỹ sư thiết kế. Cũng bởi tính đa dạng này mà việc lựa chọn để tìm được một phần mềm phù hợp đơi khi là một bài tốn khĩ đối với người sử dụng. Dựa trên mức độ phổ biến trong sử dụng, cĩ thể kể ra một số phần mềm chuyên dụng sau: ƒ Trong lĩnh vực phân tích kết cấu: MIDAS/Civil, RM, SAP, ANSYS, LUSAS, ABAQUS ƒ Trong lĩnh vực địa kỹ thuật: Geo-Slope, Plaxis, MIDAS GTS ƒ Trong lĩnh vực địa hình, bản đồ: Land Desktop, Topo, MapInfo, CAD Overlay ƒ Trong lĩnh vực thiết kế hình học đường ơ tơ: Nova-TDN, Civil 3D Do cơng trình giao thơng luơn phụ thuộc vào rất nhiều yếu tố xung quanh nĩ, cho nên quá trình thiết kế luơn gặp phải những bài tốn riêng, đặc biệt và khơng thể khái quát được. Những bài tốn này hầu như khơng cĩ lời giải tổng quát, và cũng bởi điều này khiến cho khơng cĩ một phần mềm chuyên dụng nào cĩ thể giải quyết được mọi vấn đề, nhất là trong thiết kế đường ơtơ. Bên cạnh đĩ, do cĩ sự khác nhau trong cách trình bày và thể hiện bản vẽ, nên thơng thường các phần mềm chuyên dụng chỉ cĩ thể đáp ứng việc tạo bản vẽ ở mức cơ bản, cịn việc bổ sung thêm chi tiết để hồn thiện bản vẽ thường được làm thủ cơng. Những nhược điểm này của các phần mềm chuyên dụng lại là điều kiện cho sự ra đời các phần mềm dạng Add-in1, chúng thường được phát triển bởi các kỹ sư cầu đường trong cơng ty tư vấn thiết kế cơng trình giao thơng và chạy cùng với các phần mềm chính, chúng tác động trực tiếp lên kết quả do phần mềm chính tạo ra với mục đích là hồn thiện chúng theo yêu cầu riêng của chính cơng ty đĩ. 1 Add-in: đây là các chương trình dạng phụ trợ hoặc tiện ích được thiết kế để cùng hoạt động với chương trình chính. Mục đích dùng để mở rộng các khả năng cho chương trình chính. Các chương trình dạng Add-in này cĩ thể do chính người dùng tạo ra bằng nhiều loại cơng cụ khác nhau. Khơng phải chương chính chính nào cũng chấp nhận Add-in, AutoCAD, MS.Office là hai phần mềm cho phép sử dụng Add-in điển hình. 4
  10. MỞ ĐẦU 3. Lựa chọn phần mềm dùng cho thiết kế cơng trình giao thơng Với sự đa dạng về chủng loại và xuất xứ của các phần mềm chuyên dụng, khiến cho việc chọn mua phần mềm gặp nhiều khĩ khăn, nhất là đối với những đơn vị ít kinh nghiệm trong việc triển khai các hệ thống phần mềm. Do đĩ, để trang bị được phần mềm phù hợp với cơng việc của mình cần phải thực hiện một số cơng việc chính sau: Chuẩn bị về nhân lực: để khai thác hiệu quả phần mềm, nhất là các phần mềm chuyên dụng, cần cĩ nhân lực đáp ứng được cả hai yêu cầu: ƒ Cĩ kiến thức tin học cơ bản: sử dụng tốt hệ điều hành Windows (hoặc tương đương), in ấn, tìm kiếm tài liệu trên Internet. ƒ Cĩ kiến thức chuyên mơn phù hợp. Phân tích cơng việc cần tự động hĩa để xác định rõ các yêu cầu cần được thỏa mãn khi triển khai ứng dụng phần mềm. Ví dụ, để tự động hĩa cơng tác thiết kế kết cấu, những yêu cầu sau cần được thỏa mãn: ƒ Tính được nội lực và chuyển vị của kết cấu dưới tác dụng của các loại tải trọng (cần nêu cụ thể, ví dụ như các trường hợp tổ hợp tải trọng). ƒ Đưa ra được mơ tả về phân bố ứng suất tại một số vị trí (cần nêu cụ thể, ví dụ tại các nơi cĩ cấu tạo hình học thay đổi đột ngột). ƒ Cĩ thể tính duyệt được mặt cắt. ƒ Cĩ thể tạo bản vẽ (cần nêu cụ thể mức độ chi tiết của bản vẽ) và hỗ trợ in ra máy in. ƒ Cĩ thể kết nối dữ liệu với các phần mềm khác (cần chỉ rõ định dạng kết nối, ví dụ yêu cầu nhập/xuất cấu tạo hình học của kết cấu từ/sang định dạng *.DXF). ƒ Cĩ thể thêm các tính năng mới cho phần mềm bằng các cơng cụ dạng Add-in (yêu cầu này cĩ thể khơng bắt buộc phải cĩ). Tìm hiểu, càng nhiều càng tốt, các phần mềm chuyên dụng mà cĩ thể đáp ứng được những yêu cầu trên. Cĩ nhiều cách để thu thập thơng tin: ƒ Kinh nghiệm của các đơn vị, cá nhân đã sử dụng. ƒ Giới thiệu từ nhà sản xuất phần mềm về tính năng, giá cả và chế độ hỗ trợ trong quá trình dùng sản phẩm của họ. ƒ Đánh giá phần mềm của các tạp chí chuyên ngành. ƒ Tìm thơng tin liên quan trên Internet. 5
  11. GIÁO TRÌNH TỰ ĐỘNG HỐ THIẾT KẾ CẦU ĐƯỜNG Hình I-4: Tìm kiếm thơng tin trên Internet với Google.com ƒ Sử dụng phiên bản dùng thử miễn phí của phần mềm để tự kiểm chứng. Đàm phán với nhà cung cấp phần mềm để tìm ra một giải pháp hợp lý nhất trước khi quyết định mua sản phẩm. 4. Chuyên biệt hĩa phần mềm Khi được trang bị phần mềm với mục đích tự động hĩa cơng tác thiết kế thì ta mới giải quyết được các bài tốn cơ bản trong quá trình thiết kế, bởi khơng cĩ phần mềm nào, mà ngay từ đầu, lại cĩ thể đáp ứng được mọi vấn đề sẽ xuất hiện sau này, cịn rất nhiều vấn đề mới sẽ liên tục phát sinh trong quá trình thiết kế những cơng trình cụ thể. Nĩi cách khác, việc trang bị phần mềm nào đĩ chỉ là bước đầu cho quá trình tự động hĩa, nhưng đây là bước đi quan trọng nhất. Cĩ nhiều cách giải quyết các vấn đề phát sinh này, mà cơ bản và tốt nhất là hai giải pháp: Phản hồi những vấn đề phát sinh cho nhà sản xuất phần mềm để họ nâng cấp phiên bản, sau đĩ cập nhật lại. Giải pháp này thường mất nhiều thời gian và trong nhiều trường hợp là khơng khả thi. Tự bổ sung thêm những khả năng mới cho phần mềm đang sử dụng để chúng cĩ thể giải quyết được vấn đề phát sinh. Giải pháp này địi hỏi phải cĩ nhân lực am hiểu về chuyên mơn cầu đường và cơng nghệ thơng tin, đồng thời phần mềm đang sử dụng phải cho phép cập nhật tính năng mới từ phía người dùng. Nhân lực đáp ứng được yêu cầu này chính là kỹ sư xây dựng cơng trình giao thơng được trang bị thêm những kiến thức về tin học phù hợp, đây là mục tiêu chính của mơn học Tự động hĩa thiết kế cầu đường và cũng là mục tiêu của chính giáo trình này. Phần mềm, mà người dùng cĩ thể tự tạo thêm các khả năng mới cho nĩ, phải cĩ một số đặc điểm sau: ƒ Cung cấp tính năng cho phép người dùng cĩ thể tự mình bổ sung thêm chức năng cho chính phần mềm đĩ. Ví dụ phần mềm AutoCAD cho phép người dùng sử dụng cơng cụ lập trình, như AutoLISP hay ObjectARX, để tự xây dựng thêm những chức năng mới trong AutoCAD. 6
  12. MỞ ĐẦU Hình I-5: Bổ sung tính năng mới cho AutoCAD ƒ Cho phép nhúng các phần mềm dạng Add-in vào bên trong, ví dụ như các chương trình trong bộ MS.Office (Excel, Word, Power Point ). Các chương trình dạng Add- in cĩ thể được xây dựng từ một số cơng cụ lập trình (ví dụ ta cĩ thể dùng VSTO - Visual Studio Tools for Office - để xây dựng các chương trình dạng Add-in nhúng vào trong bộ Office) Hình I-6: Bổ sung thêm chức năng lập dự tốn cho MS. Excel 7
  13. GIÁO TRÌNH TỰ ĐỘNG HỐ THIẾT KẾ CẦU ĐƯỜNG ƒ Số liệu đầu vào và kết quả được lưu trữ trên tệp với định dạng cĩ thể hiểu được. Những chương trình dạng này chỉ cho phép người dùng tạo ra những tính năng mới phục vụ cho việc nhập dữ liệu (các chương trình dạng Wizard1) hoặc trình bày kết quả. Hình I-7: Wizard trợ giúp nhập dữ liệu cho kết cấu cầu đúc hẫng của MIDAS/Civil Cơng cụ lập trình để tạo ra các tính năng mới cho phần mềm hiện cĩ rất nhiều và khá dễ dùng. Hầu hết chúng tập trung hỗ trợ cho AutoCAD và Office, bởi hai phần mềm này được dùng rất phổ biến trong cơng tác thiết kế. Với AutoCAD ta cĩ thể sử dụng những cơng cụ sau: ƒ Các cơng cụ lập trình nhúng sẵn bên trong AutoCAD: AutoLISP: là một ngơn ngữ lập trình dạng thơng dịch, cho phép người dùng tận dụng tối đa những lệnh sẵn cĩ của AutoCAD để tổ hợp lại nhằm tạo ra những tính năng mới cĩ mức độ tự động hĩa cao. 1 Wizard: thường được hiểu là một chương trình cĩ chức năng trợ giúp người dùng nhập dữ liệu (nhanh và tránh sai sĩt), nĩ đặc biệt hữu ích khi dùng những phần mềm đa năng, bởi những phần mềm này thướng hay yêu cầu người dùng đưa vào rất nhiều loại dữ liệu mà nhiều khi chúng khơng thực sự cần thiết cho một bài tốn cụ thể. Chương trình dạng Wizard sẽ tự động lọc những thơng tin cần thiết cho bài tốn cụ thể (để người dùng chỉ cần nhập những dữ liệu cần thiết cho bài tốn của mình) cịn những số liệu khác mà phần mềm yêu cầu sẽ được chương trình Wizard tự động bổ sung. Bên cạnh đĩ chương trình Wizard cịn cĩ chức năng dẫn dắt người dùng thực hiện bài tốn theo một trình tự nhất định để tránh nhầm lẫn. 8
  14. MỞ ĐẦU Hình I-8: Visual LISP: cơng cụ hỗ trợ cho lập trình với AutoLISP trong AutoCAD VBA (Visual Basic for Applications): là một cơng cụ lập trình dựa trên Visual Basic, nĩ cho phép người dùng kết hợp tính dễ dùng và hiệu quả của mơi trường lập trình Visual Basic với các tính năng và hệ thống đối tượng sẵn cĩ trong AutoCAD. Hiện nay đây là cơng cụ được dùng rất phổ biến để xây dựng thêm những tính năng mới, với quy mơ khơng lớn và khơng quá phức tạp trên AutoCAD. Trong lĩnh vực thiết kế cơng trình giao thơng, cơng việc chiếm khối lượng lớn nhất và mất nhiều cơng nhất là tạo bản vẽ kỹ thuật. Mặc dù hầu hết người thiết kế đều dùng AutoCAD để tạo bản vẽ kỹ thuật nhưng mức độ tự động hĩa vẫn rất thấp, chủ yếu sử dụng các lệnh đơn của AutoCAD (thơng qua dịng lệnh hay nút bấm trong AutoCAD) cùng với các thơng số hình học tính tốn được (cĩ thể bằng các phần mề m khác, ví dụ phần mềm tính kết cấu) để xây dựng bản vẽ. Vấn đề này hồn tồn cĩ thể tự động hĩa được khi người dùng biết kết hợp quy tắc vẽ đối tượng thiết kế với số liệu hình học tính được trong một chương trình VBA do chính họ tạo ra. 9
  15. GIÁO TRÌNH TỰ ĐỘNG HỐ THIẾT KẾ CẦU ĐƯỜNG Hình I-9: Mơi trường lập trình VBA trong AutoCAD ƒ Cơng cụ lập trình bên ngồi: bao gồm bất cứ ngơn ngữ lập trình nào mà cĩ hỗ trợ cơng nghệ COM (Component Object Model) của Microsoft như: VB, VC++, Delphi ƒ Cơng cụ lập trình ObjectARX (AutoCAD Runtime Extension): là một cách mở rộng AutoCAD hiệu quả nhất và phức tạp nhất. Các phần mở rộng AutoCAD được xây dựng trên VC++ với việc sử dụng các thư viện lập trình mở rộng của AutoCAD (chính là ObjectARX). Bởi việc cho phép điều khiển trực tiếp nhân và cấu trúc dữ liệu của chương trình AutoCAD, cho nên những chương trình được viết với ObjectARX sẽ cĩ tính linh hoạt rất cao, tốc độ chạy nhanh và nhỏ gọn hơn so với chương trình cùng loại viết bằng cơng cụ lập trình khác, nhưng mức độ phức tạp của việc lập trình sẽ tăng lên. Hầu hết các ứng dụng lớn chạy trên nền AutoCAD đều được xây dựng dựa trên ObjectARX: Land Desktop, Civil 3D, Nova-TDN 10
  16. MỞ ĐẦU Hình I-10: Mở rộng khả năng cho AutoCAD dùng ObjectARX 5. Kết chương Như vậy, trong chương này, tồn cảnh về việc ứng dụng cơng nghệ thơng tin để tự động hĩa cơng tác thiết kế cơng trình giao thơng đã được đề cập đến. Vấn đề cốt lõi để tự động hĩa thiết kế bao gồm: Quá trình thiết kế cơng trình giao thơng và sản phẩm của từng cơng đoạn. Khả năng của phần cứng máy tính và các hệ thống phần mềm, bao gồm cả các phần mềm chuyên dụng. Sự đa dạng của các bài tốn thiết kế cũng như những hạn chế trong các phần mềm chuyên dụng. Những đặc điểm của phần mềm và các cơng cụ phát triển, để từ đĩ cĩ được định hướng trong việc giải quyết các vấn đề phát sinh, vốn thường gặp suốt quá trình thiết kế. Trong khuơn khổ giáo trình của một mơn học, nhiều mảng kiến thức sẽ được kế thừa từ những mơn học khác là điều đương nhiên, và do đĩ, chỉ cĩ những nội dung mới, chưa được đề cập đến trong những mơn học khác, mới được trình bày chi tiết ở đây. Với các chương tiếp theo trong giáo trình này, những kiến thức chi tiết để thực hiện tự động hĩa thiết kế cầu đường sẽ được đưa ra theo những ý chính của chương đầu tiên này. 11
  17. GIÁO TRÌNH TỰ ĐỘNG HỐ THIẾT KẾ CẦU ĐƯỜNG PHẦN II: LẬP TRÌNH TRÊN ỨNG DỤNG NỀN CHƯƠNG I: KHÁI NIỆM Trong hồ sơ thiết kế, phần tài liệu được trình bày dưới dạng bảng biểu (bảng tính kết cấu, bảng tính khối lượng, ) và bản vẽ (mơ tả cấu tạo hình học của cơng trình) chiếm một khối lượng đáng kể. Nội dung của những tài liệu trong phần này lại luơn cĩ mối quan hệ rõ ràng và chặt chẽ với phần tính tốn trong quá trình thiết kế, chính vì vậy, khả năng thực hiện tự động hĩa cơng đoạn này là hồn tồn khả thi và mang lại hiệu quả cao. Những cơng việc cụ thể cĩ thể tự động hĩa bao gồm: tính tốn, lập bảng tính, lập bản vẽ, trong đĩ, phần tính tốn tạo tiền đề cho quá trình thực hiện lập bảng tính và bản vẽ. Phần tính tốn cĩ thể được tách ra thành một mơ-đun riêng và thực hiện độc lập với bất cứ cơng cụ lập trình nào, và hiện nay, cơng nghệ lập trình cho phép dễ dàng kết nối các mơ-đun loại này với các ứng dụng khác. Phần lập bảng tính và bản vẽ, thực chất sử dụng kết quả thực hiện của mơ-đun tính tốn và thể hiện kết quả này dưới dạng bản vẽ kỹ thuật và bảng tính, bảng biểu phù hợp với các quy định về trình bày tài liệu trong hồ sơ thiết kế. Trong nhiều trường hợp ngườ i ta cĩ thể kết hợp mơ-đun tính tốn vào cùng với quá trình tạo bảng tính hay bản vẽ, cách làm này rất hiệu quả đối với các bài tốn khơng quá phức tạp về tính tốn (như thiết kế hình học đường ơ tơ hay tính duyệt mặt cắt kết cấu). Nhưng đối với các bài tốn cĩ độ phức tạp cao trong tính tốn (như bài tốn tính kết cấu hay ổn định trượt mái dốc) thì mơ-đun tính tốn thường được tách riêng ra và kết quả tính tốn sẽ được trình bày bởi mơ-đun tạo bản vẽ và mơ- đun tạo bảng tính riêng. Trong khuơn khổ giáo trình này, do nhắm đến tính phổ biến của các bài tốn thơng thường cĩ độ phức tạp khơng cao nhưng đa dạng, cho nên việc định hướng giải quyết bài tốn hướng đến việc hợp nhất phần tính tốn vào trong mơ-đun tạo bảng tính hay mơ- đun tạo bản vẽ. Do bảng tính và bản vẽ cĩ cấu trúc tài liệu rất khác biệt, cho nên hầu như khơng cĩ phần mềm nào cĩ thể hỗ trợ tốt cho cả hai mục đích trên cùng lúc, và trong thực tế, người ta sử dụng những phần mềm riêng để tạo bản vẽ hay bảng tính. Ví dụ, trong lĩnh vực thiết kế cơng trình giao thơng, MS Excel thường được dùng như là phần mềm hỗ trợ tạo bảng tính chuyên nghiệp, trong khi đĩ, AutoCAD lại thường được sử dụng trong việc tạo bản vẽ kỹ thuật. Bên cạnh AutoCAD và Excel, cịn cĩ nhiều phần mềm chuyên dụng khác, mà khả năng của chúng tập trung vào một số lĩnh vực hẹp, ví dụ như MIDAS/Civil tập trung vào lĩnh vực phân tích kết cấu, Nova-TDN tập trung vào lĩnh vực thiết kế hình học đường ơ tơ. Kết quả mà các phần mềm chuyên dụng này mang lại khá đầy đủ, cĩ thể bao gồm hầu hết các bảng tính và bản vẽ liên quan đến bài tốn được giải quyết. Tuy vậy, trong phạm vi lĩnh vực của mình, khơng phần mềm chuyên dụng nào cĩ thể đáp ứng được mọi nhu cầu, và do đĩ, chúng thường được thiết kế theo hướng cĩ thể kết nối với các phần mềm khác nhằm mục đích hỗ trợ người dùng giải quyết được vấn đề phát sinh bằng cách kết hợp vài phần mềm với nhau. 12
  18. CHƯƠNG I: KHÁI NIỆM Hình II-1: Lập bảng tính kết cấu mặt đường trên Excel Hình II-2: Tạo bản vẽ bình đồ tuyến đường ơ tơ trên AutoCAD Để cĩ thể kết nối với nhau, các phần mềm chuyên dụng thường cung cấp kết quả tính tốn dưới dạng dữ liệu cĩ cấu trúc và được lưu trữ trong các tệp cĩ định dạng TEXT, ví dụ như CSV hay DXF. Với các dữ liệu cĩ cấu trúc này, người dùng sẽ tự thực hiện việc kết nối các phần mềm lại với nhau. Việc kết nối này cũng chỉ cĩ thể giải quyết thêm một số bài tốn phát sinh, cho nên một số phần mềm đã cho phép người dùng cĩ thể can thiệp sâu hơn nữa vào bên trong nĩ bằng các cơng cụ lập trình, để họ cĩ thể tự giải quyết các bài tốn phát sinh mà người thiết kế 13
  19. GIÁO TRÌNH TỰ ĐỘNG HỐ THIẾT KẾ CẦU ĐƯỜNG phần mềm khơng thể dự kiến trước được. Khi người dùng xây dựng những chương trình của họ dựa trên những ứng dụng được thiết kế theo cấu trúc mở này, họ sẽ tận dụng những khả năng sẵn cĩ của chúng để làm nền, giúp cho việc lập trình được nhanh và hiệu quả hơn rất nhiều so với cách lập trình thơng thường, và do đĩ, cĩ thể gọi chúng là các ứng dụng nền, điển hình và được sử dụng nhiều nhất làm ứng dụng nền trong lĩnh vực thiết kế là AutoCAD và Excel, ngồi việc phù hợp với định dạng tài liệu trong hồ sơ thiết kế (bản vẽ và bảng tính) chúng cịn cho phép người dùng xây dựng các chương trình chạy cùng với mục đích bổ sung thêm các chức năng chuyên biệt. Như vậy, một phần mềm được gọi là ứng dụng nền khi nĩ thỏa mãn đồng thời các tiêu chí sau: Cho phép một chương trình chạy bên trong và cùng với nĩ (tương tự như một lệnh). Cho phép sử dụng các tính năng của nĩ thơng qua cơng cụ lập trình thích hợp. Hình II-3: Mơ hình lập trình trên ứng dụng nền Một lệnh mới hay một chức năng mới được xây dựng trên ứng dụng nền thực chất là một chương trình hồn chỉnh, vì vậy, để xây dựng nĩ cần cĩ cơng cụ lập trình tương ứng. Thơng thường cơng cụ lập trình được hiểu như là một tập hợp bao gồm: Ngơn ngữ lập trình. Mơi trường lập trình. Thư viện hỗ trợ lập trình. Một ví dụ về cơng cụ lập trình trên AutoCAD, đĩ là AutoLISP. Với cơng cụ lập trình này, khơng nhất thiết phải cĩ mơi trường lập trình và thư viện hỗ trợ lập trình, ta chỉ cần tạo ra một tệp dạng TEXT chứa các mã lệnh viết bằng ngơn ngữ AutoLISP. Tuy nhiên từ phiên bản AutoCAD R14, để thuận tiện cho người lập trình, một mơi trường lập trình dành cho AutoLISP đã được bổ sung, đĩ là Visual LISP. Với mơi trường lập trình này, việc lập và kiểm sốt chương trình trở nên thuận lợi hơn rất nhiều, bởi Visual LISP đã được tích hợp nhiều tính năng hỗ trợ lập trình chuyên nghiệp, trong khi đĩ, nếu ta khơng sử dụng mơi trường lập trình, thì tuy ta cĩ thể viết được một chương trình AutoLISP hồn chỉnh, song trong suốt quá trình xây dựng chương trình này ta luơn phải vất vả để tự kiểm sốt chương trình. 14
  20. CHƯƠNG I: KHÁI NIỆM Hình II-4: Xây dựng chương trình bằng ngơn ngữ AutoLISP khi khơng sử dụng mơi trường lập trình, ta sẽ luơn phải tự kiểm sốt cú pháp và các lệnh mà khơng cĩ bất cứ hỗ trợ nào vì thế khả năng nhầm lẫn là rất lớn. Hình II-5: Lập trình bằng ngơn ngữ AutoLISP trên mơi trường lập trình Visual LISP, ta luơn nhận được sự hỗ trợ tự động bằng màu sắc hay các tính năng khác trong mơi trường lập trình. Thư viện hỗ trợ lập trình cĩ thể rất đa dạng và thường là những phần bổ sung giúp cho việc xây dựng chương trình được nhanh hơn thơng qua sự kế thừa những thứ đã được làm từ trước. Khi lập trình bằng AutoLISP thì thư viện hỗ trợ lập trình là tập hợp các chương trình hồn chỉnh cũng viết bằng AutoLISP. Để sử dụng thư viện hỗ trợ lập trình thì mỗi cơng cụ lập trình cĩ một quy định về cách thức sử dụng riêng, ví dụ với AutoLISP, để sử dụng một chương trình con trong thư viện, ta chỉ cần tải chương trình AutoLISP chứa chương trình con đĩ thơng qua một câu lệnh từ chương trình chính. Tương ứng với từng ứng dụng nền thì sẽ cĩ các cơng cụ lập trình phù hợp. Một ứng dụng nền cĩ thể hỗ trợ một hay nhiều cơng cụ lập trình khác nhau, tùy mục đích sử dụng. AutoCAD hỗ trợ các cơng cụ lập trình trên ứng dụng nền sau: 15
  21. GIÁO TRÌNH TỰ ĐỘNG HỐ THIẾT KẾ CẦU ĐƯỜNG AutoLISP ObjectARX VBA (Visual Basic for Applications) Cịn Excel hỗ trợ các cơng cụ lập trình: VBA (Visual Basic for Applications) VSTO (Visual Studio Tools for Office) Mỗi cơng cụ lập trình luơn cĩ những đặc điểm riêng và khĩ cĩ thể phán xét cái nào hay hơn hoặc kém hơn một cách tổng quát. Do đĩ, để lựa chọn được cơng cụ lập trình thích hợp khi lập trình trên ứng dụng nền, cần dựa vào mục đích cụ thể. Ví dụ, khi lập trình trên AutoCAD, để tạo các cơng cụ trợ giúp vẽ thì AutoLISP là lựa chọn hợp lý. Nhưng để xây dựng những ứng dụng lớn, phức tạp, địi hỏi phải can thiệp sâu vào bên trong AutoCAD thì chỉ cĩ thể dùng ObjectARX mới làm được. Trong lĩnh vực tự động hĩa thiết kế cơng trình giao thơng, hầu hết các bài tốn lớn và cơ bản đã được giải quyết, nhưng cịn rất nhiều các bài tốn khác, tuy khơng lớn và khơng quá phức tạp, nhưng lại rất đa dạng và khĩ khái quát, vẫn chưa cĩ phần mềm thực hiện, và do đĩ, phạm vi ứng dụng của lập trình trên ứng dụng nền là rất lớn và cĩ tính hiệu quả cao. Hơn nữa, với quy mơ của các bài tốn này, thì việc lựa chọn VBA làm cơng cụ lập trình là rất phù hợp bởi: Ngơn ngữ lập trình Visual Basic (VB) là một loại ngơn ngữ dễ sử dụng, cĩ số lượng người dùng đơng đảo và tài liệu tham khảo rất phong phú. Điều này cho phép người dùng trao đổi kỹ năng, tìm kiếm tài liệu, mã nguồn một cách dễ dàng. Mơi trường lập trình thân thiện, dễ dùng và đầy đủ nên việc xây dựng ứng dụng sẽ nhanh và khơng cần thêm cơng cụ lập trình nào khác. Trên tất cả các ứng dụng nền hỗ trợ VBA, giao diện lập trình là đồng nhất, do đĩ người dùng cĩ thể lập trình mở rộng trên nhiều ứng dụng nền một cách thuận lợi. Thư viện lập trình cĩ rất nhiều và đa dạng cho nên người dùng cĩ thể xây dựng ứng dụng của mình nhanh và chuyên nghiệp. Tốc độ thực thi của chương trình nhanh. Khai thác được hầu hết các tính năng sẵn cĩ của ứng dụng nền. Chương trình VBA cĩ thể được nhúng trong tệp của ứng dụng nền (chẳng hạn như tệp bảng tính của Excel hay tệp bản vẽ của AutoCAD) hoặc cĩ thể được lưu dưới dạng một dự án độc lập. Điều này giúp cho việc phân phối, chia sẻ mã lệnh được thuận tiện. Kết chương Tự động hĩa cơng tác lập hồ sơ thiết kế cơng trình giao thơng là hồn tồn khả thi và cĩ thể được thực hiện theo nhiều cách khác nhau. Dự án VBA nên xây dựng theo hướng gộp cả phần tính tốn và xuất kết quả vào một mơ-đun thống nhất. Sử dụng AutoCAD và Excel làm ứng dụng nền để xây dựng các ứng dụng bằng VBA nhằm mục đích hỗ trợ thiết kế là lựa chọn mang tính khả thi cao và cĩ nhiều ưu điể m. Để lập trình với VBA, cách tốt nhất, là làm chủ từng phần. Đầu tiên cần nắm vững ngơn ngữ lập trình Visual Basic và cách sử dụng VBA IDE để viết mã lệnh cũng như thiết kế giao diện. Sau đĩ nghiên cứu mơ hình đối tượng của ứng dụng nền (là những thành phần của ứng dụng nền mà người dùng cĩ thể sử dụng) cũng như cách sử dụng chúng bằng VBA. 16
  22. CHƯƠNG II: TỔNG QUAN VỀ VBA CHƯƠNG II: TỔNG QUAN VỀ VBA 1. Đặc điểm của VBA Từ các đặc điểm cơ bản đã được phân tích ở cuối chương I ta cĩ thể thấy rằng VBA là một cơng cụ lập trình cho phép phát triển nhanh phần mềm và được tích hợp vào trong ứng dụng nền. Về thực chất, VBA được xây dựng dựa trên kiến trúc COM1, cho nên người dùng cĩ thể sử dụng các thành phần sẵn cĩ của ứng dụng nền trong việc xây dựng chương trình của mình với VBA. Một dự án được xây dựng bằng VBA dựa trên ứng dụng nền nào thì nĩ phụ thuộc chặt chẽ vào ứng dụng nền đĩ, bởi theo mặc định, dự án VBA sẽ hoạt động và sử dụng các thành phần trong chính ứng dụng nền đĩ. Điều này cĩ ngh ĩa là ta rất khĩ cĩ thể chuyển đổi một dự án VBA từ loại ứng dụng nền này sang một ứng dụng nền khác cũng như tạo ra một ứng dụng chạy độc lập. Sự khác biệt cơ bản nhất của VBA trong các ứng dụng nền (ví dụ giữa VBA trong AutoCAD và VBA trong Excel) là cách thức sử dụng các thành phần (đối tượng) của ứng dụng nền. Cho nên khi xây dựng ứng dụng bằng VBA, việc đầu tiên là phải tìm hiểu mơ hình đối tượng của ứng dụng nền và cách sử dụng chúng. Như trong chương trước đã trình bày, xây dựng một dự án VBA, một cách tổng quát, người dùng cần nắm vững hai phần: Ngơn ngữ lập trình Visual Basic và giao diện lập trình VBA IDE. Phần này sẽ bao gồm các nội dung kiến thức trong chương II và III. Mơ hình đối tượng của ứng dụng nền và cách sử dụng chúng. Nội dung kiến thức của phần này sẽ được trình bày trong chương IV và V. 2. Trình tự xây dựng một dự án bằng VBA Về mặt trình tự thực hiện, việc xây dựng một dự án VBA bao gồm các bước sau: 1. Xác định rõ nhu cầu xây dựng chương trình: nhu cầu này được xác định dựa trên hoạt động thực tế của người dùng và thường do chính người dùng đề xuất. Đây là bước xác định các chức năng của chương trình. 2. Xác định rõ mục tiêu mà chương trình cần đạt được: bước này là phần cụ thể hĩa của bước 1, ví dụ như bước 1 cĩ nhu cầu hồn thiện bản vẽ kết cấu BTCT, cịn bước này sẽ cụ thể mức độ hồn thiện (đến đâu và như thế nào). 3. Lựa chọn ứng dụng nền và cơng cụ lập trình phù hợp cho việc xây dựng chương trình: Ví dụ với nhu yêu cầu tính và tạo bản vẽ của cấu kiện BTCT, thì ứng dụng nền thích hợp là AutoCAD và cơng cụ lập trình cĩ thể là AutoLISP, VBA, ObjectARX. Tùy theo mức độ phức tạp của bài tốn mà ta lựa chọn cơng cụ lập trình phù hợp. Ở đây, VBA đảm bảo sự thuận tiện trong việc xây dựng các mơ-đun tính tốn và tạo bản vẽ đối với những bài tốn thơng thường. 1 COM (Component Object Model): là một kiến trúc lập trình được thiết kế bởi Microsoft. Mục đích của cơng nghệ này là tạo ra một chuẩn cơng nghệ trong lập trình, mà ở đĩ cho phép xây dựng chương trình theo mơ hình lắp ghép hay sử dụng lại các sản phẩm đã được hồn thiện từ trước theo chuẩn COM. 17
  23. GIÁO TRÌNH TỰ ĐỘNG HỐ THIẾT KẾ CẦU ĐƯỜNG 4. Thiết kế hệ thống cho chương trình (hay dự án): bao gồm việc lập sơ đồ khối, xác định các mơ-đun của chương trình, thiết kế giao diện nhập xuất dữ liệu và kết quả, xây dựng hệ thống cơ sở dữ liệu sao cho thỏa mãn những đề xuất ở bước 1 và 2. 5. Viết mã lệnh (lập trình): là việc sử dụng cơng cụ lập trình để tạo ra chương trình phù hợp với hệ thống đã được thiết kế ở bước 4. 6. Kiểm thử chương trình: là cơng đoạn hồn thiện và chuẩn bị đưa chương trình vào sử dụng. Những cơng việc chính của bước này bao gồm: Kiểm tra xem các chức năng của chương trình đã thỏa mãn các yêu cầu đề ra từ trước chưa bằng cách chạy thử tất cả các tính năng của chương trình dựa trên một kịch bản cụ thể. Kiểm tra hiệu năng của chương trình: xem thời gian thực hiện và quy trình sử dụng chương trình cĩ hợp lý khơng. Kiểm tra khả năng chịu lỗi của chương trình, ví dụ như khi nhập số liệu sai. Một chương trình đảm bảo khả năng chịu lỗi là nĩ sẽ khơng bị dừng lại đột ngột do lỗi thao tác của người dùng hay dữ liệu sai. 7. Đĩng gĩi, đưa chương trình vào sử dụng: bao gồm việc xây dựng tài liệu hướng dẫn cài đặt và sử dụng chương trình nhằm mục đích giúp người dùng cĩ thể triển khai chương trình vào thực tế. 8. Tiếp nhận các gĩp ý, phản hồi của người dùng: để bổ sung hay hồn thiện những khiếm khuyết của chương trình mà trong quá trình thiết kế hệ thống hay kiểm thử đã bỏ qua hoặc chưa phát hiện được. 9. Nâng cấp chương trình: sau một thời gian sử dụng, dựa trên những phản hồi của người dùng, nếu thấy rằng chương trình cần bổ sung thêm những tính năng mới thì người phát triển phần mềm sẽ thực hiện sự bổ sung này dựa trên những thành phần đã cĩ từ trước. 3. Cấu trúc của một dự án VBA Khi nĩi đến các thành phần tạo nên một dự án VBA thì cấu trúc của nĩ, về tổng quát, như sau: Mơ-đun chuẩn (Module): là nơi chứa các mã lệnh khai báo, các chương trình con (hàm và thủ tục). Việc tạo ra các mơ-đun chuẩn thường căn cứ theo các khối chức năng mà người thiết kế hệ thống đặt ra. Mơ-đun lớp (Class Module): là nơi chứa định nghĩa cho các lớp của dự án. UserForm: là giao diện dạng hộp thoại giúp cho việc giao tiếp giữa người sử dụng và chương trình được thuận tiện. Thơng thường người ta sử dụng UserForm để nhập số liệu, xuất kết quả của chương trình. Trong một số dự án, nếu việc nhập số liệu và biểu diễn kết quả được thực hiện trực tiếp trên ứng dụng nền, thì cĩ thể khơng cần sử dụng UserForm. Những thành phần này là bộ khung để người dùng xây dựng chương trình của mình lên trên đĩ, ví dụ như viết mã lệnh hay thiết kế giao diện cho chương trình. Mơ-đun lớp và UserForm là hai thành phần cĩ thể xuất hiện hoặc khơng thùy thuộc vào từng dự án và tất cả những thành phần sử dụng trong dự án đều được hiển thị trên giao diện của VBA IDE. 18
  24. CHƯƠNG II: TỔNG QUAN VỀ VBA Hình II-6: Cấu trúc của dự án thể hiện trên VBA IDE Tuy nhiên, khi xây dựng chương trình (viết mã lệnh) cụ thể thì khái niệm cấu trúc của một chương trình là sự bố trí, sắp xếp các câu lệnh trong chương trình đĩ. Như vậy khái niệm cấu trúc này phụ thuộc vào từng loại ngơn ngữ lập trình. Đối với ngơn ngữ lập trình Visual Basic (VB), cấu trúc của nĩ chỉ tập trung vào chương trình con (hàm và thủ tục) chứ khơng cĩ một quy định về cấu trúc nào đối với chương trình chính. Chi tiết của cấu trúc của chương trình con sẽ được đề cập đến trong các phần sau. 4. Mơi trường phát triển tích hợp VBA IDE Trong mỗi cơng cụ lập trình trên ứng dụng nền, luơn cĩ một mơi trường lập trình nhằm hỗ trợ người dùng cĩ thể xây dựng, thử nghiệm và hồn thiện chương trình của mình. Trong AutoCAD và Excel, khi sử dụng VBA để lập trình, mơi trường lập trình được gọi là Mơi trường phát triển tích hợp (viết tắt là VBA IDE). Trên tất cả các ứng dụng nền, VBA IDE cĩ cấu trúc và hoạt động tương đương nhau. Giao diện chính và cách gọi VBA IDE từ ứng dụng nền như sau: Phím tắt: từ giao diện chính của ứng dụng nền, nhấn tổ hợp phím Alt+F11. Menu: Tools Ư Macro Ư Visual Basic Editor. 19
  25. GIÁO TRÌNH TỰ ĐỘNG HỐ THIẾT KẾ CẦU ĐƯỜNG Hình II-7: Giao diện chính của VBA IDE 1. Thanh trình đơn (Menu bar): chứa tất cả các lựa chọn cần thiết để thao tác với VBA IDE. 2. Cửa sổ dự án (Project Explorer Window): liệt kê dưới dạng cây phân cấp các dự án hiện đang được mở trong VBA IDE và các thành phần cĩ trong từng dự án như các tài liệu thành phần, các mơ-đun chứa chương trình con, các mơ-đun lớp, các cửa sổ do người dùng tạo. GỢI Ý Việc thêm các thành phần mới vào trong một dự án được thực hiện trong menu Insert của VBA IDE. Ví dụ muốn thêm một mơ-đun chuẩn vào trong dự án, chọn menu Insert Ư Module 3. Cửa sổ mã lệnh (Code Window): mỗi thành phần được liệt kê trong cửa sổ dự án đều cĩ một cửa sổ mã lệnh riêng, chứa mã lệnh cho thành phần đĩ. Người dùng cĩ thể hiệu chỉnh mã lệnh, tạo ra mã lệnh mới trong cửa sổ mã lệnh. 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. 20
  26. CHƯƠNG II: TỔNG QUAN VỀ VBA Ta cĩ thể sử dụng cửa sổ này để tìm kiếm, tra cứu tất cả các đối tượng mà ta vừa tạo ra cũng như các đối tượng trong các chương trình khác. 5. Cửa sổ đối tượng trực quan (Visual Object Window): khi người dùng tạo các đối tượng trực quan thì cửa sổ này sẽ cho phép người dùng thao tác trên các điều khiển một cách dễ dàng và thuận tiện. 6. Hộp cơng cụ chứa điều khiển (Tool Box): chứa các thanh cơng cụ giúp người dùng cĩ thể chèn các điều khiển vào cửa sổ người dùng (UserForm). 7. Cửa sổ thuộc tính (Properties Window): cửa sổ này liệt kê tất cả các thuộc tính của đối tượng, qua đĩ người dùng cĩ thể tham khảo và thay đổi các thuộc tính khi cần như màu chữ, tên đối tượng 5. Ví dụ đầu tiên với VBA Ví dụ này được trình bày với mục đích giúp người dùng làm quen với VBA IDE trong Excel. Kết quả của ví dụ là hiển thị nội dung ơ A1 trong Sheet1 của bảng tính lên tiêu đề của một hộp thoại người dùng (UserForm). Trình tự thực hiện như sau: 1. Mở ứng dụng Excel, nhấn tổ hợp phím ALT+F11 để vào VBA IDE. 2. Trong VBA IDE, chọn menu Insert Ư UserForm để thêm một hộp thoại người dùng vào trong dự án. 3. Chọn tiếp menu Insert Ư Module để thêm một mơ-đun chuẩn vào trong dự án. Hình II-8: Ví dụ một dự án VBA 4. Chọn Module1 và soạn thảo mã lệnh trong mơ-đun đĩ như sau: Public Sub FirstPro() UserForm1.Show 21
  27. GIÁO TRÌNH TỰ ĐỘNG HỐ THIẾT KẾ CẦU ĐƯỜNG UserForm1.Caption = Sheets("Sheet1").Range("A1").Value End Sub Sau đĩ quay trở lại Excel, và chạy chương trình theo trình tự: 1. Gõ vào ơ A1 của Sheet1 nội dung “Hello, World”. 2. Chọn menu Tools Ư Macro Ư Macros (hoặc nhấn tổ hợp phím ALT+ F8). 3. Trong hộp thoại Macro, chọn macro cĩ tên FirstPro rồi nhấn nút Run. Kết quả chương trình sẽ hiển thị như hình dưới đây: Hộp thoại Macro Kết quả trên Excel Hình II-9: Sử dụng Macro trong MS Excel 22
  28. CHƯƠNG III: CƠ BẢN VỀ NGƠN NGỮ LẬP TRÌNH VISUAL BASIC CHƯƠNG III: CƠ BẢN VỀ NGƠN NGỮ LẬP TRÌNH VISUAL BASIC Trong chương này sẽ trình bày những kiến thức cơ bản trong ngơn ngữ lập trình Visual Basic (VB) như: cú pháp, các từ khố, các kiểu dữ liệu, các khai báo, Tất cả các ví dụ sẽ được viết và trình bày kết quả trong VBA IDE. 1. Những qui định về cú pháp Cú pháp được hiểu là một một tập hợp bao gồm các quy tắc, luật lệ về trật tự và hình thức viết của một câu lệnh hay một cấu trúc lệnh. Trong ngơn ngữ lập trình Visual Basic (VB), cũng như các ngơn ngữ lập trình khác, đều cĩ những quy định về cú pháp cho việc viết mã lệnh và người lập trình cần phải tuân theo các quy tắc này để trình biên dịch cĩ thể dịch mã lệnh mà khơng phát sinh lỗi. Sau đây là các quy định cơ bản về cú pháp của VB: Các câu lệnh phải là các dịng riêng biệt. Nếu cĩ nhiều lệnh trên cùng một dịng thì giữa các lệnh ngăn cách nhau bằng dấu hai chấm (:). Nếu dịng lệnh quá dài, muốn ngắt lệnh thành hai dịng thì sử dụng dấu cách và dấu gạch dưới ( _ ). Nếu muốn chèn thêm ghi chú, phải bắt đầu dịng chú thích bằng dấu nháy đơn (’). Qui ước khi đặt tên: phải bắt đầu bằng kí tự kiểu chữ cái thơng thường; khơng chứa dấu chấm, dấu cách hay các ký tự đặc biệt khác; khơng quá 255 kí tự; khơng trùng với các từ khố; các biến cĩ cùng một phạm vi thì khơng được đặt tên trùng nhau. 2. Các trợ giúp về cú pháp trong quá trình viết mã lệnh Các quy tắc về cú pháp thường khĩ nhớ đối với những người mới học lập trình hay mới sử dụng ngơn ngữ lập trình mới, cho nên, để thuận tiện cho người lập trình, VBA IDE cung cấp tính năng tự động phát hiện lỗi cú pháp trong quá trình viết mã lệnh. Tuy nhiên việc kiểm tra tự động này cĩ thể gây khĩ chịu cho những lập trình viên chuyên nghiệp, những người rất hiếm khi mắc lỗi cú pháp khi lập trình, cho nên chức năng này chỉ hoạt động khi được kích hoạt, bằng cách chọn trình đơn Tools Ư Options Ư Editor ƯCode Settings. Hình II-10: Bật / Tắt trợ giúp phát hiện lỗi cú pháp của VBA IDE Ý nghĩa của hai tùy chọn này như sau: Tự động kiểm tra lỗi cú pháp (Auto Syntax Check): Tùy chọn này cho phép VBA IDE tự động phát hiện lỗi cú pháp ngay sau khi người dùng kết thúc dịng lệnh (xuống dịng mới), một hộp thoại (như hình dưới đây) sẽ thơng báo vị trí gây lỗi cũng như nguyên 23
  29. GIÁO TRÌNH TỰ ĐỘNG HỐ THIẾT KẾ CẦU ĐƯỜNG nhân gây lỗi. Nếu người dùng bỏ qua khơng sửa ngay thì dịng lệnh cĩ lỗi sẽ được đánh dấu. Hình II-11: VBA IDE tự động kiểm tra lỗi cú pháp và thơng báo cho người dùng Kiểm tra các biến (Require Variable Declaration): Trong VB, người dùng cĩ thể sử dụng một biến mà khơng cần khai báo. Trong trường hợp này biến sẽ được khởi tạo và nhận một giá trị mặc định. Tuy nhiên, nếu lạm dụng điều này, rất cĩ thể sẽ làm cho chương trình khĩ quản lý và dễ nhầm lẫn, vì thế VBA IDE cung cấp tùy chọn này để cho phép người dùng thiết lập tính năng kiểm sốt quá trình khai báo biến. Khi tùy chọn này được kích hoạt, tất cả các biến đều phải khai báo trước khi sử dụng và VBA IDE sẽ tự động thêm vào đầu của mỗi mơ-đun dịng lệnh “Option Explicit”. Hình II-12: VBA IDE tự động thơng báo lỗi khi biến được sử dụng mà chưa khai báo 3. Tính năng gợi nhớ và tự hồn thiện mã lệnh Mã lệnh, thơng thường là một tập hợp bao gồm các từ khĩa, câu lệnh, tên biến hay tốn tử được sắp xếp theo một trật tự nhất định. Tên của các thành phần này cĩ thể khĩ nhớ chính xác hoặc quá dài, cho nên VBA IDE đưa ra tính năng này bằng cách hiển thị những thành phần cĩ thể phù hợp với vị trí dịng lệnh đang soạn thảo trong một danh sách và sẽ tự động điền vào chương trình theo lựa chọn của người dùng (bấm phím Tab). Để kích hoạt tính năng này, trong VBAIDE, chọn menu Tools Ư Options Ư Editor. 24
  30. CHƯƠNG III: CƠ BẢN VỀ NGƠN NGỮ LẬP TRÌNH VISUAL BASIC Hình II-13: Bật / tắt trợ giúp hồn thiện mã lệnh tự động trong VBA IDE Ý nghĩa của các tùy chọn này như sau: Tự động hiển thị danh sách các thành phần của đối tượng (Auto List Members): Với tùy chọn này, khi một đối tượng của ứng dụng nền hay của chương trình được gọi ra để sử dụng thì một danh sách các thành phần của nĩ (bao gồm các phương thức và thuộc tính) sẽ được tự động hiển thị để người dùng chọn, sau khi bấm phím Tab, tên của thành phần này sẽ được tự động điền vào vị trí thích hợp trong dịng lệnh. Hình II-14: Danh sách các thành phần được tự động hiển thị. Tự động hiển thị cú pháp cho chương trình con (Auto Quick Info): Với tùy chọn này, VBA IDE sẽ hiển thị những thơng tin về tham số của một hàm hay thủ tục (đã được xây dựng từ trước) khi người dùng sử dụng nĩ. Các thơng tin này bao gồm tên của tham số cùng với kiểu của nĩ. Hình II-15: Tự động hiển thị thơng tin của các tham số trong chương trình con. 25
  31. GIÁO TRÌNH TỰ ĐỘNG HỐ THIẾT KẾ CẦU ĐƯỜNG Tự động hiển thị giá trị của biến (Auto Data Tips): Với tùy chọn này, trong chế độ gỡ rối (Break mode), giá trị của biến (được gán trong quá trình chạy của chương trình) sẽ được hiển thị khi người dùng đặt chuột tại vị trí biến. Ngồi ra, nếu những tính năng trợ giúp trên chưa được kích hoạt, trong quá trình viết mã lệnh, người dùng cĩ thể kích hoạt tạm thời chúng bằng cách nhấn tổ hợp phím Ctrl + Space. Cần chú ý rằng, khi danh sách trợ giúp hiện ra, người dùng cĩ thể sử dụng chuột hoặc phím mũi tên để lựa chọn mục cần sử dụng trong danh sách đĩ rồi bấm phím Tab để xác nhận. 4. Từ khố trong VB Từ khố là tập hợp các từ cấu thành một ngơn ngữ lập trình. Mỗi ngơn ngữ lập trình đều cĩ một bộ từ khố riêng, dưới đây là danh sách các từ khố 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 Các từ khĩa là những từ được dùng riêng cho những chức năng khác nhau trong ngơn ngữ lập trình, ví dụ từ khĩa “Private” hạn chế phạm vi sử dụng của biến hay chương trình con. Do đĩ việc đặt tên (biến, chương trình con) bắt buộc phải khác so với các từ khĩa, nếu khơng sẽ phát sinh lỗi cú pháp. Hình II-16: VBA IDE báo lỗi do tên biến trùng tên với từ khĩa 5. Các kiểu dữ liệu cơ bản Khi một chương trình vận hành, nĩ sẽ tác động và làm thay đổi giá trị của một vài thơng số trong chương trình, ví dụ trong chương trình giải phương trình bậc 2, các thành phần trong phương trình: y=ax2+bx+c sẽ cần thay đổi giá trị khi chương trình hoạt động. Như vậy giá trị của các thơng số này cĩ nhu cầu thay đổi trong những lần hoạt động khác nhau của chương 26
  32. CHƯƠNG III: CƠ BẢN VỀ NGƠN NGỮ LẬP TRÌNH VISUAL BASIC trình cũng như trong một lần hoạt động nào đĩ, ví dụ giá trị của y sẽ thay đổi khi ta thay đổi giá trị của a trong phương trình trên. Chính bởi nhu cầu thay đổi giá trị này mà người ta đưa khái niệm “biến” để mơ tả sự “động” của những thơng số này. Với mỗi biến, giá trị của nĩ luơn được quy định là phải thuộc một kiểu dữ liệu nào đĩ, ví dụ giá trị của y trong phương trình trên phải là kiểu số thực. Do ngơn ngữ lập trình được thiết kế để thực hiện nhiều nhiệm vụ khác nhau cho nên trong ngơn ngữ lập trình nào cũng luơn cĩ nhiều kiểu dữ liệu để thích ứng với nhu cầu đa dạng của việc lập trình. Kiểu dữ liệu là loại giá trị mà một biến cĩ thể nhận, nĩi cách khác, khi một biến được khai báo thì ta buộc phải gán cho nĩ một kiểu dữ liệu nhất định. Về tổng thể cĩ thể chia các kiểu dữ liệu trong VB ra làm hai loại: Các kiểu dữ liệu được định nghĩa sẵn trong VB: là những kiểu dữ liệu cơ bản và thường gặp như kiểu số thực (Double), số nguyên (Integer), Chuỗi (String) Các kiểu dữ liệu do người dùng tự định nghĩa: là kiểu dữ liệu được tự xây dựng dựa trên những thành phần dữ liệu cơ bản trong VB. Cách xây dựng kiểu dữ liệu này được đề cập trong phần dưới. 5.1. Kiểu logic (Boolean) Chỉ chứa hai giá trị TRUE và FALSE (đúng và sai). Khi chuyển từ các dữ liệu dạng số sang kiểu logic, 0 sẽ được chuyển thành FALSE cịn giá trị khác sẽ được chuyển thành TRUE. Khi chuyển từ kiểu logic sang kiểu số, giá trị FALSE sẽ được chuyển thành 0 cịn giá trị TRUE sẽ được chuyển thành -1. ‘Khai báo biến A là kiểu logic Dim A As Boolean Biến A lúc này chỉ cĩ thể nhận cặp giá trị: True hay False. 5.2. Kiểu số nguyên Dùng để chứa các giá trị là số nguyên và cĩ vài loại dữ liệu kiểu này. Sự khác nhau của những loại dữ liệu này là giới hạn giá trị (lớn nhất và nhỏ nhất) mà biến cĩ thể nhận được (tham khảo bảng dưới). Kiểu số nguyên Kích thước Phạm vi Byte 1 byte 0 đến 255 Integer 2 bytes -32,768 đến 32,767 Long 4 bytes -2,147,483,648 đến 2,147,483,647 5.3. Kiểu số thực Dùng để chứa các giá trị là số thực. Các kiểu số thực thường dùng được trình bày trong bảng dưới đây: Kiểu số thực K.thước Phạm vi Single 4 byte Từ -3.402823E38 đến -1.401298E-45 và từ 1.401298E-45 đến 3.402823E38 Double 8 bytes Từ - 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 27
  33. GIÁO TRÌNH TỰ ĐỘNG HỐ THIẾT KẾ CẦU ĐƯỜNG 5.4. Kiểu mảng (Array) Khi gặp trường hợp phải xử lý một loạt các biến tương tự như nhau, ví dụ các phần tử của một ma trận, nếu ta phải đặt tên khác nhau cho tất cả các biến này thì rất bất tiện, thay vào đĩ ta cĩ thể dùng kiểu mảng để đặt tên chung cho cả nhĩm các phần tử đĩ và khi nào cần sử dụng từng phần tử ta sẽ gọi tên theo chỉ số của chúng trong mảng. ‘Khai báo mảng Dim Matrix_1(10) As Double Mảng Matrix_1 trên cĩ 11 phần tử liên tục được đánh số từ 0 đến 10 (ma trận cĩ 1 hàng và 11 cột). Khi sử dụng ta chỉ việc gọi phần tử cần dùng theo chỉ số tương ứng. ‘Gán giá trị 100 cho phần tử thứ 2 Matrix_1(1)=100 ‘Gán giá trị 100 cho phần tử cuối cùng Matrix_1(10)=100 Ta cũng cĩ thể cố định phạm vi chỉ số của mảng bằng cách khai báo như sau: ‘Khai báo mảng Dim Matrix_2(1 To 10) As Double Lúc này chỉ số của mảng Matrix_2 sẽ bắt đầu từ 1 và mảng này cĩ 10 phần tử: ‘Gán giá trị 200 cho phần tử thứ 2 Matrix_2(2)=200 ‘Gán giá trị 200 cho phần tử cuối cùng Matrix_2(10)=200 Ví dụ sau khai báo và sử dụng (gán giá trị cho phần tử) một ma trận 3 hàng 5 cột: ‘Khai báo mảng (3x5) Dim Matrix_3(1 To 3, 1 To 5) As Double ‘Gán giá trị 100 cho phần tử tại hàng thứ 2 cột thứ 3 Matrix_3(2,3)=100 Trong VB, mảng cĩ thể cĩ một chiều hoặc nhiều chiều, kích thước của mảng được xác định dựa trên số chiều và biên trên, biên dưới của mỗi chiều. Các thành phần trong mảng là liên tục giữa hai biên. Trong các ví dụ trên, các mảng cĩ kích thước (hay số lượng phần tử) là khơng thay đổi trong suốt quá trình hoạt động của chương trình. Người ta gọi loại mảng này là mảng tĩnh và thường được dùng cho những bài tốn biết trước số phần tử của mảng hay kích thước mảng khơng lớn. Ngồi loại mảng tĩnh này, trong VB cịn cho phép định nghĩa một loại mảng khác mà kích thước (hay số lượng phần tử) của nĩ cĩ thể thiết lập lại ngay trong lúc chương trình đang hoạt động, người ta gọi loại mảng này là mảng động. Với mảng động, người lập trình khơng cần biết số phần tử của mảng trong lúc lập trình, số phần tử này sẽ được thiết lập trong quá trình chương trình hoạt động dựa theo nhu cầu của từng bài tốn cụ thể. Khi một mảng động, mà các phần tử của nĩ đã được gán giá trị, cần thay đổi kích thước, sẽ cĩ hai tình huống cần xét đến: Tồn bộ giá trị ban đầu (trước lúc thay đổi kích thước mảng) sẽ bị hủy bỏ, các phần tử mảng mới (sau khi thay đổi kích thước) sẽ nhận giá trị mặc định. 28
  34. CHƯƠNG III: CƠ BẢN VỀ NGƠN NGỮ LẬP TRÌNH VISUAL BASIC ‘ Khai báo mảng A là mảng động Dim A() As Long ‘ Xác định kích thước cho mảng động A: mảng 1 chiều cĩ 5 phần tử Redim A(1 to 5) As Long ‘ Gán giá trị cho phần tử của mảng A A(1) = 100: A(2) = 200 ‘ Định lại kích thước cho mảng A: mảng hai chiều với 3x3=9 phần tử Redim A(1 to 3, 2 to 4) as Long Sau dịng cuối cùng này, tồn bộ giá trị của mảng A cũ (cĩ A[1]=100 và A[2]=200) sẽ bị xĩa bỏ và tất cả các phần tử mới của mảng A (9 phần tử) sẽ nhận giá trị mặc định (thường được gán bằng 0). Giá trị cũ của các phần tử mảng sẽ được giữ lại khi cả hai điều kiện sau thỏa mãn: ƒ Sử dụng lệnh ReDim với từ khĩa Preserve. ƒ Sự thay đổi kích thước mảng chỉ được thực hiện ở biên trên của chiều cuối cùng của mảng, nghĩa là các phần tử cần giữ lại giá trị cĩ chỉ số khơng đổi ngay cả khi mảng được định lại kích thước. ‘Khai báo mảng động A Dim A() As Long ‘Gán kích thước cho mảng A ReDim A(1 To 3, 1 To 3) As Long ‘Gán giá trị cho phàn tử của mảng A A(1,1) = 100: A(1,2) = 200 A(2,1) = 150: A(2,2) = 250 ‘Định lại kích thước cho mảng A, giữ lại giá trị ban đầu ‘của các phần tử, lưu ý đến phạm vi của mảng mới ReDim Preserve A(1 To 3, 1 To 5) As Long Hình II-17: Các phần tử cĩ thể giữ lại giá trị ban đầu và các phạm vi cĩ thể thay đổi kích thước của mảng động Trong ví dụ trên, các phần tử của mảng A được giữ lại giá trị sau khi kích thước của mảng được thay đổi lại. Lưu ý, ta chỉ cĩ thể giữ lại giá trị của mảng ban đầu khi sự mở rộng được thực hiện ra biên cuối cùng của nĩ như hình trên. 5.5. Kiểu chuỗi (String) Chuỗi là một hàng bao gồm các ký tự liên tục nhau, các ký tự ở đây rất đa dạng: cĩ thể là chữ số, chữ cái, dấu cách (space), ký hiệu. Số lượng ký tự trong một chuỗi là rất lớn (216 ký tự). 29
  35. GIÁO TRÌNH TỰ ĐỘNG HỐ THIẾT KẾ CẦU ĐƯỜNG Mặc định trong VB, các biến hay tham số kiểu chuỗi cĩ chiều dài thay đổi tùy theo giá trị dữ liệu được gán cho nĩ. Dim S As String S=”ABCD 1234 @#$%” Để tạo điều kiện thuận lợi cho người dùng, bên trong VB cĩ sẵn một số hàm liên quan đến xử lý chuỗi, ví dụ như cắt chuỗi, tách chuỗi, ghép chuỗi, tìm kiếm, Các hàm cơ bản này được trình bày ở phần sau trong giáo trình này hoặc cĩ thể tra cứu tồn bộ các hàm liên quan trong MSDN (Microsoft Developer Network) hoặc Object Browser (thư viện Strings) bằng cách nhấn phím F2 trong giao diện lập trình VBA IDE. Hình II-18: Thơng tin về các hàm trong thư viện lập trình của VBA được hiển thị trong Object Browser 5.6. Kiểu thời gian (Date) Dùng để lưu trữ và thao tác trên các giá trị thời gian (ngày và giờ). Định dạng ngày và giờ phụ thuộc vào các thiết lập về hiển thị trong hệ thống của người dùng. Khi chuyển từ các dữ liệu kiểu số sang kiểu ngày tháng, các giá trị ở bên trái dấu phẩy chuyển thành thơng tin về ngày cịn giá trị ở bên phải dấu phẩy sẽ được chuyển thành thơng tin về giờ. Dim D As Date Dim S As String D = Now() S = "Ngay: " & Day(D) & " - Thang: " & Month(D) & " - Nam: " & Year(D) Debug.Print (S) Ví dụ trên sẽ hiển thị thơng tin về thời gian (ngày - tháng - năm) trong cửa sổ Immediate của VBA IDE. 5.7. Kiểu Variant Kiểu Variant là một kiểu dữ liệu đặc biệt cĩ thể chứa tất cả các loại dữ liệu, ngoại trừ kiểu chuỗi cĩ chiều dài cố định. Kiểu Variant cũng cĩ thể chứa các giá trị đặc biệt như Empty, Error, Nothing và Null. 30
  36. CHƯƠNG III: CƠ BẢN VỀ NGƠN NGỮ LẬP TRÌNH VISUAL BASIC Tuy kiểu dữ liệu Variant cĩ vẻ tiện dụng nhưng khi sử dụng một cách quá thoải mái thì nguy cơ gây lỗi của loại biến này là rất lớn, đặc biệt khi thao tác với các tốn tử. Dim V As Variant ‘ Gán biến V với một chuỗi V = “String” ‘ Gán biến V với một số V = 16 ‘ Gán biến V với giá trị kiểu logic V = True ‘ Gán biến V với một dữ liệu kiểu thời gian V = #01/06/2007# Sử dụng hàm VarType(Variant) sẽ cho ta mã của kiểu dữ liệu hiện đang lưu trữ trong biến Variant. Giá trị VarType Chú thích 0-vbEmpty Khơng cĩ gì trong variant 1-vbNull Khơng cĩ dữ liệu hợp lệ trong variant 2-vbInteger Variant chứa Integer 4-vbSingle Variant chứa Single 7-vbDate Variant chứa Date/Time 8-vbString Variant chứa String 9-vbObject Variant chứa một Object 11-vbBoolean Variant chứa Boolean 5.8. Kiểu tự định nghĩa (User-defined type) Kiểu tự định nghĩa là kiểu dữ liệu do người dùng định nghĩa, tương tự như kiểu bản ghi (Record) trong ngơn ngữ lập trình Pascal hay kiểu cấu trúc (Struct) trong ngơn ngữ lập trình C. Kiểu tự định nghĩa bao gồm nhiều trường dữ liệu, mỗi trường dữ liệu cĩ thể là các kiểu dữ liệu cơ bản hoặc các kiểu tự định nghĩa khác. Ví dụ, khi đo tồn đạc bằng máy kinh vĩ cơ, với mỗi điểm đo ta cần lưu lại các thơng tin sau: Ký hiệu Ý nghĩa Kiểu giá trị TrM Số hiệu trạm đặt máy Integer STT Thứ tự của điểm đo Integer DT Số đọc dây trên Double DG Số đọc dây giữa Double DD Số đọc dây dưới Double 31
  37. GIÁO TRÌNH TỰ ĐỘNG HỐ THIẾT KẾ CẦU ĐƯỜNG H Gĩc bằng Double V Gĩc đứng Double MT Mơ tả đặc điểm của điểm đo String Với một chương trình xử lý số liệu đo tồn đạc, cách tốt nhất là quản lý theo điểm đo, và do đĩ mỗi điểm đo là một biến cĩ kiểu dữ liệu phù hợp với bảng trên. Đĩ chính là kiểu dữ liệu tự định nghĩa. ‘Định nghĩa kiểu dữ liệu cho điểm đo tồn đạc Type DiemDo TrM As Integer STT As Integer DT As Double DG As Double DD As Double H As Double V As Double MT As String End Type Sau khi định nghĩa kiểu dữ liệu DiemDo xong, ta cĩ thể sử dụng nĩ như những kiểu dữ liệu thơng thường khác. ‘Khai báo biến sử dụng kiểu dữ liệu tự định nghĩa Dim P1 As DiemDo Dim P_Array(1 to 1000) As DiemDo With P1 .TrM = 1 .STT = 1 .DT = 2130 .DG = 2120 .DD = 2110 .H = 130.5 .V = 78.25 .MT = “Goc nha C4” End With P_Array(1) = P1 Từ khĩa: With End With dùng để tránh phải nhập lại nhiều lần tên biến kiểu dữ liệu tự định nghĩa. Dấu chấm ( . ) được sử dụng để thao tác với các thành phần bên trong của biến cĩ kiểu dữ liệu tự định nghĩa. Ví dụ sau là tương đương với ví dụ trên, nhưng khơng sử dụng cặp từ khĩa With End With, chú ý là dấu chấm ( . ) luơn cĩ: ‘Khai báo biến sử dụng kiểu dữ liệu tự định nghĩa Dim P1 As DiemDo Dim P_Array(1 to 1000) As DiemDo P1.TrM = 1 P1.STT = 1 P1.DT = 2130 P1.DG = 2120 P1.DD = 2110 P1.H = 130.5 P1.V = 78.25 P1.MT = “Goc nha C4” 32
  38. CHƯƠNG III: CƠ BẢN VỀ NGƠN NGỮ LẬP TRÌNH VISUAL BASIC P_Array(1) = P1 5.9. Kiểu lớp (Class) Kiểu lớp (Class) là một mở rộng của kiểu dữ liệu tự định nghĩa, sự khác biệt cơ bản ở đây là trong kiểu lớp cịn cĩ những đoạn chương trình dùng để xử lý chính những dữ liệu trong nĩ. Dữ liệu bên trong lớp thường được gọi là các thuộc tính (Properties), cịn những đoạn chương trình trong lớp để xử lý dữ liệu này thực chất là các Hàm / Thủ tục (Function / Sub) được định nghĩa bên trong lớp và thường được gọi là các Phương thức (Methods). Một biến cĩ kiểu dữ liệu là lớp được gọi là một đối tượng (Object) và cách sử dụng các Properties, Methods của đối tượng này tương tự như cách sử dụng các thành phần của kiểu dữ liệu tự định nghĩa. Lớp cần được xây dựng trong Class Module hoặc ta cĩ thể sử dụng lại các lớp sẵn cĩ từ các thư viện lập trình. Như vậy lớp cĩ thể gồm các thành phần sau: Các thuộc tính (Property): là các dữ liệu mơ tả trạng thái của bản thân đối tượng hoặc các quan hệ của nĩ với các đối tượng khác.Về bản chất, thuộc tính là các biến được khai báo trong lớp đĩ. Kiểu dữ liệu của các thuộc tính cĩ thể là các kiểu dữ liệu cơ bản hoặc cĩ thể là một lớp khác (kiểu Class). Các phương thức (Method): mơ tả hành vi, chức năng của đối tượng. Về bản chất, phương thức là các chương trình con được xây dựng bên trong lớp và chúng cĩ nhiệm vụ xử lý các dữ liệu của chính lớp đĩ. Các sự kiện (Event): Sự kiện giúp cho lớp cĩ khả năng giao tiếp với các lớp khác hoặc với mơi trường ngồi. Trong khuơn khổ của giáo trình này, các vấn đề liên quan đến xây dựng lớp sẽ khơng được đề cập chi tiết. Tuy nhiên nếu ai quan tâm cĩ thể tìm hiểu thêm trong giáo trình “Lập trình hướng đối tượng trong xây dựng” của bộ mơn Tự động hĩa thiết kế Cầu đường. 6. Khai báo biến trong VB Trong VB, muốn sử dụng một biến cĩ thể khơng cần khai báo, tuy nhiên cách làm này chỉ nên dùng khi viết các chương trình nhỏ, cịn đối với các chương trình lớn, cĩ nhiều mơ-đun, thì nên bắt buộc khai báo biến trước khi sử dụng (theo cách thiết lập ở mục 2 của chương này). Khai báo biến, về thực chất, chính là việc tạo mã lệnh (lập trình) cho nên các đoạn mã lệnh khai báo biến cĩ thể đặt ở bất cứ thành phần nào trong dự án VBA (mơ-đun chuẩn, mơ-đun lớp, và UserForm). Tùy theo nhu cầu sử dụng biến mà người ta giới hạn phạm vi sử dụng của biến đĩ sao cho việc lập trình được thuận tiện nhất dựa trên những nguyên tắc sau: Khi biến khai báo trong chương trình con nào thì phạm vi sử dụng của nĩ được giới hạn trong chính chương trình con đĩ. Biến loại này được gọi là biến cục bộ. 33
  39. GIÁO TRÌNH TỰ ĐỘNG HỐ THIẾT KẾ CẦU ĐƯỜNG Hình II-19: Phạm vi sử dụng của biến được khai báo trong chương trình con Nếu biến được khai báo ở cấp mơ-đun và biến được khai báo trong chương trình con cĩ tên trùng nhau thì ở bên trong chương trình con, biến được sử dụng là biến được khai báo bên trong nĩ. Ta xét ví dụ sau: Option Explicit Dim a As Double, b As Double Public Sub Test1() a = 100 : b = 200 End Sub Public Sub Test2() Dim a As Double, c As Double Test1 c = a + b Debug.Print "a = "; a; Debug.Print "b = "; b; Debug.Print "c = "; c; End Sub Biến a và b được khai báo ở cấp mơ-đun, nghĩa là mọi chương trình con trong mơ-đun này đều cĩ thể sử dụng và tác động lên chúng. Giá trị của a và b được gán trong chương trình con Test1. Trong chương trình con Test2 một biến a khác được khai báo (trùng tên với biến a của mơ-đun), và giá trị khởi tạo của nĩ bằng 0. Kết quả chạy chương trình con Test2 như sau: Hình II-20: Mức độ ưu tiên trong sử dụng biến Sử dụng từ khĩa Public để xác định phạm vi sử dụng biến là trong tồn bộ dự án, nghĩa là từ bất cứ nơi đâu trong dự án (mơ-đun chuẩn, mơ-đun lớp, và UserForm) đều cĩ thể sử 34
  40. CHƯƠNG III: CƠ BẢN VỀ NGƠN NGỮ LẬP TRÌNH VISUAL BASIC dụng biến này. Biến được khai báo với từ khĩa Public thường được gọi là biến tồn cục. Trong mơ-đun nào đĩ, nếu một biến được khai báo với từ khĩa Dim, thì mặc định, biến đĩ là biến cục bộ, nghĩa là tương đương với việc sử dụng từ khĩa Private. CHÚ Ý Khơng sử dụng các từ khố Public,Private hay Friend cho khai báo dữ liệu nằm bên trong chương trình con. Hình II-21: Phạm vi sử dụng biến tồn cục Ở mức độ rộng hơn, cĩ thể coi biến như một khối dữ liệu của chương trình và mức độ tồn cục được chia làm hai loại như sau: ƒ Tồn cục ở mức ứng dụng: Trong trường hợp ứng dụng gồm nhiều dự án (multi- projects), nếu trong một mơ-đun khơng cĩ khai báo lựa chọn Option Private Module thì tất cả các thành phần dữ liệu hay chương trình được khai báo Public trong mơ-đun đĩ cĩ phạm vi hoạt động tồn bộ ứng dụng – nghĩa là chúng cịn cĩ thể được tham chiếu từ những dự án khác trong ứng dụng. ƒ Tồn cục ở mức dự án: Trong trường hợp ứng dụng gồm nhiều dự án (multi-projects), nếu trong một mơ-đun cĩ khai báo lựa chọn Option Private Module thì tất cả các thành phần dữ liệu hay chương trình được khai báo Public trong mơ-đun đĩ chỉ cĩ phạm vi hoạt động trong nội bộ dự án chứa mơ-đun mà khơng thể được tham chiếu từ những dự án khác trong ứng dụng. Hình II-22: Khai báo tùy chọn phạm vi biến ở mức dự án. Sử dụng từ khĩa Private để xác định phạm vi hoạt động của biến là trong nội bộ của mơ-đun đĩ, tất cả các chương trình con hay bất cứ thành phần nào của mơ-đun này đều cĩ 35
  41. GIÁO TRÌNH TỰ ĐỘNG HỐ THIẾT KẾ CẦU ĐƯỜNG thể sử dụng biến loại này nhưng chúng khơng thể truy cập được từ những mơ-đun hay UserForm khác trong dự án. Hình II-23: Phạm vi sử dụng của biến tương ứng với từ khĩa Public và Private. CHÚ Ý Khi khai báo kiểu dữ liệu người dùng tự định nghĩa hoặc các chương trình con trong một mơ-đun, nếu khơng chỉ rõ phạm vi hoạt động thì pham vi hoạt động mặc định là Public. Để tránh các nhầm lẫn do khơng nhớ phạm vi hoạt động mặc định, người dùng nên chỉ rõ phạm vi hoạt động của chương trình hay dữ liệu ngay khi khai báo. Ngồi ra, trong các mơ-đun lớp (Class Module) hoặc mơ-đun lệnh của UserForm cịn cĩ thể sử dụng từ khĩa Friend để xác định phạm vi hoạt động của một chương trình con (phương thức). Khi sử dụng từ khĩa này, chương trình con cĩ thể được truy xuất từ mọi nơi trong nội bộ dự án (Project) chứa nĩ nhưng khơng thể được truy xuất trong những dự án khác của ứng dụng (khác với khi dùng từ khĩa Public – chương trình con cĩ thể được truy xuất từ mọi nơi của ứng dụng). CHÚ Ý Các khai báo dữ liệu với các từ khố trên được thực hiện trong phần General của một mơ-đun. Các dữ liệu đĩ cịn được gọi là dữ liệu cấp mơ-đun (module level). Trong mỗi mơ-đun, phần đầu tiên (của phần viết mã lệnh) được gọi là phần General của mơ-đun đĩ. Theo quy ước, các thiết lập cho mơ-đun được đặt ở đây và VBA IDE sẽ tự động phân cách phần này. Khơng cĩ giới hạn về kích thước cho phần này. Hình II-24: Phần General trong mơ-đun 36
  42. CHƯƠNG III: CƠ BẢN VỀ NGƠN NGỮ LẬP TRÌNH VISUAL BASIC 6.1. Khai báo hằng số (Constant) Hằng số là một loại biến đặc biệt mà giá trị của nĩ được xác định ngay lúc khai báo và luơn khơng thay đổi. Ta nên dùng cách này cho những hằng số hay phải dùng lặp lại trong chương trình, ví dụ như hằng số π = 3.14159. Sau khi khai báo hằng số này: Const Pi=3.14159 ta luơn cĩ thể sử dụng giá trị 3.14159 bất cứ chỗ nào trong chương trình với cái tên dễ nhớ hơn là Pi. Cú pháp: [Public/ Private] Const = Các từ khố Public hay Private xác định phạm vi hiệu lực của hằng số, với từ khố Public, hằng số này cĩ thể sử dụng ở bất cứ đâu trong ứng dụng, cịn với từ khố Private thì hằng số này chỉ cĩ thể sử dụng bên trong mơ-đun nơi khai báo hằng số đĩ. Ý nghĩa của hai từ khĩa này cũng khơng thay đổi cho tất cả các phần khác mà cĩ sử dụng chúng. 6.2. Khai báo biến (Variable) Cú pháp: Dim as Khi dùng từ khĩa Public hay Private nhằm xác định phạm vi hiệu lực của biến thay cho từ khĩa Dim trong khai báo biến thì cú pháp như sau: Public as Hay: Private as 6.3. Khai báo kiểu tự định nghĩa Trong VB cĩ thể khai báo các kiểu dữ liệu theo nhu cầu của người sử dụng. Cú pháp khai báo như sau: Type as as as 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 được thay bằng . Để truy cập tới một trường của biến kiểu bản ghi, dùng tốn tử (.) hoặc dùng cặp từ khĩa With End With. 37
  43. GIÁO TRÌNH TỰ ĐỘNG HỐ THIẾT KẾ CẦU ĐƯỜNG CHÚ Ý Các từ khố Public hay Private nhằm xác định phạm vi hoạt động của kiểu dữ liệu được khai báo. Đồng thời khai báo kiểu chỉ được thực hiện ở cấp mơ-đun (khơng thực hiện được trong các chương trình con). Khi khơng chỉ rõ thì phạm vi hoạt động thì mặc định của một kiểu dữ liệu tự định nghĩa là Public. 6.4. Khai báo mảng tĩnh Cú pháp: [Public/Private/Dim] ( ) as Các thơng số về chiều cĩ thể biểu diễn qua các ví dụ sau: Dim a(3 To 5) As Integer ‘ Mảng 1 chiều với các chỉ số từ 3 đến 5 Dim A(3) As Long ‘ Mảng 1 chiều với chỉ số đến 3 (mảng 1 chiều cĩ 4 phần tử với chỉ số từ 0 đến 3) Dim A(2 To 4, 6) As Double ‘ Mảng 2 chiều với một miền chỉ số từ 2 tới 4 và một miền cĩ chỉ số từ 0 đến 6. GỢI Ý Các từ khố Public hay Private xác định phạm vi hoạt động của biến mảng (trong trường hợp mảng được khai báo mức mơ-đun). Các qui định về phạm vi hoạt động của mảng tương tự với biến thơng thường - đã được trình bày ở phần trước. 6.5. Khai báo mảng động Cú pháp: [Public/ Private/ Dim] () as Trong khai báo trên khơng chứa các thơng số về chiều và đĩ thuần túy chỉ là một khai báo. Các phần tử của mảng chưa được tạo ra (hay nĩi cách khác mảng vẫn chưa thực sự được cấp phát bộ nhớ) và vẫn chưa sẵn sàng để sử dụng. Trước khi sử dụng mảng động hoặc khi muốn thay đổi kích thước của mảng, sử dụng lệnh Redim. Cú pháp như sau: Redim ( ) as Chú ý rằng phải đúng như khai báo ban đầu, các thơng số về chiều cĩ thể khác trước cả về số chiều và kích thước của từng chiều. Khi đĩ, các dữ liệu cũ trong mảng khơng cịn nữa, thay vào đĩ là những phần tử mới được khởi tạo. 6.6. Khai báo, tạo và làm việc với biến đối tượng Khai báo và tạo biến đối tượng phải dùng thêm từ khĩa New Dim as New 38
  44. CHƯƠNG III: CƠ BẢN VỀ NGƠN NGỮ LẬP TRÌNH VISUAL BASIC 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 = 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ừ khố tương ứng là New và Set. Dim as Set = New CHÚ Ý Câu lệnh Set khơng phải là câu lệnh khai báo, vì vậy nĩ phải được viết trong một chương trình con nào đĩ chứ khơng thể nằm trong phần General của một mơ-đun. Làm việc với một biến đối tượng tức là quá trình thao tác với đối tượng thơng qua các thuộc tính, phương thức và các sự kiện của đối tượng đĩ. Để truy cập tới các thuộc tính và phương thức của đối tượng ta sử dụng theo cú pháp sau, chú ý đến dấu chấm ( . ) giữa tên biến và tên thuộc tính hay tên phương thức: . . 7. Các tốn tử và hàm thơng dụng 7.1. Các tốn tử Tốn tử được sử dụng cho mục đích xử lý dữ liệu. Ta sử dụng các tốn tử để thực hiện tính tốn, so sánh, gán và thực hiện nhiều thao tác khác. Dưới đây là danh sách và ý nghĩa của một số tốn tử thơng dụng: Tốn tử Mơ tả Tốn tử gán = Gán giá trị cho biến hoặc thuộc tính Tốn tử tốn học + Cộng - Trừ * Nhân / Chia \ Chia lấy phần nguyên Mod Chia lấy phần dư ^ Lũy thừa Tốn tử logic Not Trả về giá trị phủ định với giá trị biểu thức. Not(TRUE)=FALSE And Nối logic hai biểu thức. (TRUE And TRUE)=TRUE; các trường hợp khác cho kết quả bằng FALSE 39
  45. GIÁO TRÌNH TỰ ĐỘNG HỐ THIẾT KẾ CẦU ĐƯỜNG Or (FALSE or FALSE)=FALSE; các trường hợp khác cho kết quả là TRUE Xor Cho kết quả TRUE nếu hai đối số cĩ cùng giá trị; ngược lại cho kết quả là FALSE Eqv So sánh hai giá trị logic; cách thức xử lý tương tự như tốn tử Xor Tốn tử so sánh = So sánh bằng Lớn hơn >= Lớn hơn hoặc bằng đến chữ số sau dấu phẩy Val(str) Chuyển đổi chuỗi thành giá trị kiểu số 7.3. Các hàm chuyển đổi dữ liệu Chuyển đổi định dạng số liệu là một nhu cầu thường gặp trong lập trình do các ngơn ngữ lập trình luơn địi hỏi kiểu dữ liệu phải rõ ràng và cố định cho từng biến nhằm tránh phát sinh các lỗi sau này. Việc chuyển đổi này, nếu trong trường hợp thơng thường , thì VB sẽ tự động thực hiện. Nhưng khi gặp các yêu cầu đặc biệt thì buộc người dùng phải sử dụng những hàm chuyển đổi phù hợp. CHÚ Ý Việc chuyển đổi kiểu dữ liệu luơn cĩ thể tạo ra lỗi do khơng thể chuyển đổi được hoặc phát sinh kết quả sai. Cho nên khi sử dụng cần chú ý đến các khả năng gây lỗi của việc chuyển đổi kiểu dữ liệu. Các hàm này được chứa trong thư viện Conversion (cĩ thể tra cứu thư viện này bằng Object Browser). Sau đây là một số hàm thơng dụng: Hàm Mơ tả CBool(Expression) Chuyển đổi dữ liệu sang kiểu logic (Boolean) CByte(Expression) Chuyển đổi dữ liệu sang kiểu Byte 40
  46. CHƯƠNG III: CƠ BẢN VỀ NGƠN NGỮ LẬP TRÌNH VISUAL BASIC CInt(Expression) Chuyển đổi dữ liệu sang kiểu nguyên (Integer) CLng(Expression) Chuyển đổi dữ liệu sang kiểu nguyên (Long) CDbl(Expression) Chuyển đổi dữ liệu sang kiểu thực (Double) CSng(Expression) Chuyển đổi dữ liệu sang kiểu thực (Single) CStr(Expression) Chuyển đổi dữ liệu sang kiểu xâu (String) Str(Number) Chuyển đổi dữ liệu số sang kiểu xâu (String) Val(String As String) Chuyển đổi dữ liệu từ String sang Double Ví dụ: Public Sub Test () Dim StrA as String Dim A as Double StrA=”1234” A=Val(StrA) ‘ Kết quả A=1234 Debug.print A A=4567 StrA=Str(A) ‘ Kết quả StrA=”4567” Debug.Print StrA End Sub GỢI Ý Để cĩ thể chạy thử các đoạn mã lênh trên, trong VBA IDE, trước hết cần tạo ra một mơ-đun trong dự án (nếu chưa cĩ) sau đĩ tạo ra một chương trình con dạng Sub và nhập đoạn mã lệnh cần thử vào chương trình con này. Đặt con trỏ soạn thảo mã lệnh ở bất cứ dịng nào trong chương trình con đĩ và bấm phím F5 để chạy chương trình. Kết quả như sau: GỢI Ý Cửa sổ Immediate là một bộ phận trong VBA IDE, bật / tắt cửa sổ này được thực hiện trong menu View của VBA IDE. Khi sử dụng lệnh Debug.Print thì giá trị của biến sẽ được thể hiện trong cửa sổ Immediate khi chương trình hoạt động và được lưu lại ngay cả khi chương trình kết thúc. Cửa sổ này thường được dùng với mục đích gỡ rối khi lập trình. Khi nội dung trong cửa sổ này nhiều quá thì ta cĩ thể xĩa bớt bằng cách chọn vùng cần xĩa và bấm phím Delete. 7.4. Các hàm xử lý chuỗi Các hàm loại này được chứa trong thư viện Strings (cĩ thể tra cứu thư viện này bằng Object Browser). Sau đây là một số hàm thơng dụng: Hàm Mơ tả Asc(x) Trả về mã ASCII của ký tự đầu trong một chuỗi Chr(x) Chuyển đổi từ mã ASCII sang một ký tự Left(String, Length as Long) Trích dữ liệu bên trái của một chuỗi Mid(String, Start As Long, [Length]) Trích dữ liệu phần giữa của một chuỗi 41
  47. GIÁO TRÌNH TỰ ĐỘNG HỐ THIẾT KẾ CẦU ĐƯỜNG Right(String, Length As Long) Trích dữ liệu phần bên phải của một chuỗi Split(String) Tách một chuỗi dài thành một mảng gồm nhiều chuỗi nhỏ hơn Joint(StringArray) Gộp một mảng các chuỗi thành một chuỗi duy nhất Len(String) Trả về độ dài của chuỗi (số lượng ký tự trong chuỗi bao gồm cả ký tự trống) Ucase(String) Hàm thực hiện đổi tất cả các ký tự trong chuỗi thành chữ HOA. InStr([start, ]string1, string2[, compare]) Trả về vị trí bắt đầu của chuỗi String2 trong chuỗi String1. Ví dụ: Public Sub Test() Dim StrArDes() As String ' Mảng các chuỗi được khai báo dạng mảng động Dim StrScr As String 'Chuỗi ban đầu StrScr = "Point1_23.5_4.5_44.8" StrArDes = Split(StrScr, "_") ' Tách chuỗi StrScr thành một mảng các chuỗi và đưa vào StrArDes, ' kí tự ngăn cách là "_" ' Khi đĩ StrArDes(0)="Point1”, StrArDes(1)="23.5" ' StrArDes(2)="4.5", StrArDes(3)="44.8" Debug.Print StrArDes(0), StrArDes(1), StrArDes(2), StrArDes(3) End Sub Kết quả sẽ như sau: Lưu ý là dấu “_” trong ví dụ trên cĩ thể thay thế bằng bất cứ ký tự nào. CHÚ Ý Trong tất cả các ngơn ngữ lập trình, khái niệm chuỗi số và số là khác nhau. Ví dụ khi gán A=″123″ thì giá trị của A là một chuỗi ký tự gồm ″1″, ″2″ và ″3″. Cịn khi gán B=123 thì giá trị của B là một trăm hai mươi ba. Để tạo ra một chuỗi cĩ chứa dấu nháy kép (″) bên trong nĩ thì cần sử dụng thêm hai dấu nháy kép nữa. Ví dụ, trong biểu thức sau: s = ″ABC″″123″ thì giá trị của biến s là: ABC″123 8. Các cấu trúc điều khiển 8.1. Cấu trúc điều kiện Các từ khĩa: If, Then, Else, ElseIf, End If Cú pháp: If then Khối_lệnh End If 42
  48. CHƯƠNG III: CƠ BẢN VỀ NGƠN NGỮ LẬP TRÌNH VISUAL BASIC Diễn giải tiến trình của cấu trúc điều kiện như sau: nếu là đúng thì chương trình sẽ thực hiện , nếu sai thì chương trình sẽ thốt khỏi cấu trúc lệnh này. Sơ đồ khối của cấu trúc lệnh kiểu này cĩ thể được biểu diễn như sau: Dim A As Double Dim B As Double A = 20: B = 10 If A > B Then Debug.Print ("Hieu cua hai so A va B >0") Kết quả như sau: GỢI Ý Nếu như [khối_lệnh] cĩ thể viết trên một dịng như ví dụ trên thì khơng dùng từ khĩa End If. Để phân tách nhiều lệnh trên cùng một dịng, sử dụng dấu hai chấm (:) để ngăn cách giữa các lệnh. Ngồi cấu trúc cơ bản và trường hợp riêng ở trên, trong nhiều trường hợp, ta buộc phải xử lý khi trả về giá trị False (sai). Để giải quyết tình huống này ta sử dụng cấu trúc điều kiện mở rộng như sau: If 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 là đúng thì chương trình sẽ thực hiện , cịn nếu khơng đúng thì chương trình sẽ thực hiện . Sơ đồ khối của cấu trúc lệnh kiểu này cĩ thể được biểu diễn như sau: 43
  49. GIÁO TRÌNH TỰ ĐỘNG HỐ THIẾT KẾ CẦU ĐƯỜNG 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ừ khố ElseIf. Như vậy, cấu trúc điều kiện cĩ cú pháp tổng quát như sau: If Then [Khối_lệnh_1] [ElseIf Then [khối_lệnh_n] [Else [Khối_lệnh_2]] End If Trong khối cấu trúc này, khối lệnh [ElseIf Then cĩ thể lặp lại nhiều lần tương ứng với nhiều điều kiện khác nhau. Diễn giải cấu trúc này như sau: nếu là đúng thì thực hiện [Khối_lệnh_1] và thốt khỏi khối cấu trúc này, cịn nếu sai thì sẽ kiểm tra lần lượt từng điều kiện của ElseIf xem cĩ giá trị nào đúng khơng, nếu khơng cĩ giá trị nào đúng thì thực hiện [Khối_lệnh_2] (sau từ khĩa Else) và thốt khỏi cấu trúc này, cịn nếu gặp một giá trị đúng đầu tiên của nào đĩ thì khối lệnh tương ứng với ElseIf này sẽ được thực hiện và thốt khỏi cấu trúc này. If (TheColorYouLike = vbRed) Then MsgBox "You 're a lucky person" ElseIf (TheColorYouLike = vbGreen) Then MsgBox "You 're a hopeful person" ElseIf (TheColorYouLike = vbBlue) Then MsgBox "You 're a brave person" ElseIf (TheColorYouLike = vbMagenta) Then MsgBox "You 're a sad person" Else MsgBox "You 're an average person" End If Ta xét ví dụ trên: Nếu TheColorYouLike = vbRed thì sẽ chỉ cĩ thơng báo: You 're a lucky person. Nếu TheColorYouLike = vbBlue thì sẽ chỉ cĩ thơng báo: You 're a brave person. Nếu TheColorYouLike khơng thuộc bất cứ giá trị nào trong bảng màu: vbRed, vbGreen, vbBlue, vbMagenta thì sẽ chỉ cĩ thơng báo: You 're an average person. 44
  50. CHƯƠNG III: CƠ BẢN VỀ NGƠN NGỮ LẬP TRÌNH VISUAL BASIC 8.2. Cấu trúc lựa chọn Cấu trúc này sử dụng khi ta muốn thực hiện một số lệnh nào đấy tương ứng với từng giá trị của biểu thức kiểm tra. Các từ khố 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 [Case điều_kiện_1 [khối_lệnh_1]] [Case điều_kiện_n [khối_lệnh_n]] [Case Else [khối_lệnh_else]] End Select Diễn giải tiến trình của cấu trúc lựa chọn như sau: Giá trị của sẽ được so sánh với các nếu giá trị của thoả mãn thì tương ứng sẽ được thực hiện, sau đĩ chương trình sẽ thốt khỏi cấu trúc lựa chọn. Trong trường hợp giá trị của khơng thoả mãn tất cả các điều kiện thì sẽ được thực hiện nếu cĩ từ khố Case Else, cịn nếu khơng cĩ từ khố Case Else thì chương trình sẽ thốt khỏi khối lệnh lựa chọn này mà khơng thực hiện gì cả. Ví dụ sử dụng ElseIf ở trên được viết lại với cấu trúc lựa chọn như sau: Select Case TheColorYouLike Case vbRed MsgBox "You 're a lucky person" Case vbGreen MsgBox "You 're a hopeful person" Case vbBlue MsgBox "You 're a brave person" Case vbMagenta MsgBox "You 're a sad person" Else MsgBox "You 're an average person" End Select Cĩ thể thấy rằng với cách viết sử dụng cấu trúc lựa chọn, đoạn chương trình trên dễ đọc hơn nhiều so với dùng cấu trúc điều kiện và ElseIf. Sơ đồ khối của cấu trúc lựa chọn cĩ thể được biểu diễn như sau: 45
  51. GIÁO TRÌNH TỰ ĐỘNG HỐ THIẾT KẾ CẦU ĐƯỜNG 8.3. Vịng lặp xác định 8.3.1. Vịng lặp theo biến đếm Thực hiện lặp một khối lệnh theo một biến đếm với số lần lặp xác định, ví dụ như khi ta cần tính tổng của các số nằm giữa hai số nào đĩ. Các từ khĩa: For, to, Step, Next Cú pháp: For = To [Step ] [Khối_lệnh] Next [ ] Cấu trúc lặp này thực hiện theo trình tự sau: Gán bằng giá trị So sánh với giá trị : ƒ Nếu nhỏ hơn hoặc bằng: thực hiện các lệnh bên trong [Khối_lệnh] và tự động cộng vào một giá trị bằng nếu cĩ từ khĩa Step, cịn khơng thì cộng thêm 1 và quay lại bước so sánh với giá trị . ƒ Nếu lớn hơn: kết thúc khối lệnh lặp. Ví dụ sau tính tổng của các số từ 1 đến 10: Dim i As Integer Dim Tong As Integer Tong = 0 For i = 1 To 10 Step 1 Tong = Tong + i Next Debug.Print ("Tong = " & Tong) Kết quả như sau: 46
  52. CHƯƠNG III: CƠ BẢN VỀ NGƠN NGỮ LẬP TRÌNH VISUAL BASIC Ví dụ sau tính tổng của các số chẵn từ 0 đến 10: Dim i As Integer Dim Tong As Integer Tong = 0 For i = 0 To 10 Step 2 Tong = Tong + i Next Debug.Print ("Tong = " & Tong) Kết quả như sau: CHÚ Ý Khi giá trị của là âm ( và đổi chỗ cho nhau. Ví dụ tính tổng của các số chẵn từ 0 đến 10 sử dụng vịng lặp đếm ngược: Dim i As Integer Dim Tong As Integer Tong = 0 For i = 10 To 0 Step -2 Tong = Tong + i Next Debug.Print ("Tong = " & Tong) Kết quả như sau: GỢI Ý Nếu như muốn thốt khỏi vịng lặp xác định FOR khi mà số lần lặp chưa đủ thì ta sử dụng từ khĩa Exit For. Ví dụ sau sẽ tính tổng của các số chẵn từ 0 đến 10, nhưng sẽ dừng vịng lặp FOR ngay khi tổng lớn hơn 20: Dim i As Integer Dim Tong As Integer Tong = 0 47
  53. GIÁO TRÌNH TỰ ĐỘNG HỐ THIẾT KẾ CẦU ĐƯỜNG For i = 10 To 0 Step -2 Tong = Tong + i If Tong > 20 Then Exit For Next Debug.Print ("Tong = " & Tong) Kết quả như sau: (10 + 8 + 6 = 24) 8.3.2. Lặp trong một tập hợp Trong trường hợp muốn thực hiện các khối lệnh lặp theo một biến đếm chạy trong một tập hợp mà tập hợp đĩ khơng thể xác định được số lượng hoặc bước nhảy thì người dùng cĩ thể dùng vịng lặp trong tập hợp (For Each Next). Tập hợp ở đây cĩ thể là một tập đối tượng dạng Collection hoặc một mảng. Các từ khố sử dụng For, Each, In, Next Cú pháp: For Each In [Khối_lệnh] Next Giải thích: sẽ nhận các giá trị từ phần tử đầu tiên đến phần tử cuối cùng trong . Ứng với mỗi giá trị của , khối lệnh được thực hiện một lần. CHÚ Ý Kiểu của trong vịng lặp (For Each Next) sẽ phụ thuộc vào kiểu của mà nĩ duyệt qua là kiểu mảng hay kiểu tập đối tượng. Đối với là tập đối tượng thì kiểu dữ liệu của cĩ thể là Variant, hoặc đối tượng cùng kiểu với tập đối tượng đĩ. Đối với là mảng thì kiểu dữ liệu của chỉ cĩ thể là Variant. Ví dụ sau sẽ thực hiện tính tích các số trong một mảng 2 chiều với việc dùng vịng lặp trong tập hợp. Kết quả sẽ được hiển thị trong cửa sổ Immediate. Public Sub TestForEach() Dim a(0 To 2, 0 To 1) As Double Dim v As Variant Dim Tich As Double a(0, 0) = 1: a(1, 0) = 2: a(2, 0) = 3 a(0, 1) = 4: a(1, 1) = 5: a(2, 1) = 6 Tich = 1 Debug.Print "Cac phan tu trong mang" For Each v In a Debug.Print v Tich = Tich * v Next Debug.Print "Tich=" & Str(Tich) End Sub 48
  54. CHƯƠNG III: CƠ BẢN VỀ NGƠN NGỮ LẬP TRÌNH VISUAL BASIC Kết quả như sau: 8.4. Vịng lặp khơng xác định Thực hiện một khối lệnh với số lần lặp khơng định trước và chỉ kết thúc quá trình lặp này khi một biểu thức điều kiện được thỏa mãn (biểu thức điều kiện cĩ giá trị Boolean: True hoặc False). Tùy thuộc vào việc kiểm tra biểu thức điều kiện mà ta sử dụng một trong hai dạng cú pháp như sau: Kiểu 1: Lặp trong khi biểu thức điều kiện là TRUE Do While [Khối_lệnh] Loop Với cú pháp này, [Khối_lệnh] chỉ được thực hiện khi là đúng. Ví dụ sau sẽ đếm số chữ số chẵn trong khoảng hai số A, B: Dim i, A, B, SoChan As Integer A = 1: B = 10 i = A SoChan = 0 Do While i Với cú pháp này, [Khối_lệnh] được thực hiện ít nhất một lần cho dù đúng hay sai bởi được kiểm tra ở cuối của cấu trúc. 49
  55. GIÁO TRÌNH TỰ ĐỘNG HỐ THIẾT KẾ CẦU ĐƯỜNG Kiểu 2: Lặp cho đến khi điều kiện là FALSE Do Until [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 CHÚ Ý Khi [Khối_lệnh] được thực thi, nếu như trong [Khối_lệnh] khơng cĩ câu lệnh nào tác động lên để nĩ nhận giá trị ngược lại thì vịng lặp này sẽ khơng bao giờ kết thúc và làm cho ứng dụng bị “treo”. Để thốt khỏi tình huống “treo” này cĩ nhiều cách và cách đơn giản nhất là bấm tổ hợp phím Ctrl+Break để quay trở lại VBAIDE. Cĩ cách khác để thốt khỏi vịng lặp, ngồi việc thiết lập cĩ giá trị ngược lại, là sử dụng từ khĩa Exit Do đặt trong [Khối_lệnh]. 9. Chương trình con Về cơ bản, chương trình con là một khối các câu lệnh và chúng được sử dụng lặp lại trong chương trình chính thơng qua tên của chương trình con. Chương trình con đặc biệt hữu ích khi thay thế các khối lệnh lặp nhau hoặc cùng thực thi một chức năng tương tự nào đĩ. Cĩ hai loại chương trình con chính là Hàm (Function) và Thủ tục (Sub). Ngồi ra, trong các mơ-đun lớp (Class Module) cịn cĩ chương trình con dạng thuộc tính (Property), tuy nhiên trong giáo trình này sẽ khơng trình bày về loại chương trình con này mà người đọc cĩ thể tham khảo trong giáo trình mơn Lập trình hướng đối tượng trong xây dựng. Cú pháp tổng quát của một chương trình con như sau: [Private|Friend|Public][Static] Tên([các_tham_số]) [Khối_lệnh] End Trong đĩ phần thân chương trình con được bọc giữa phần khai báo và phần kết thúc (cĩ từ khĩa End). Các từ khĩa [Private|Public|Friend] xác định phạm vi hoạt động của chương trình con. Khái niệm phạm vi này cũng tương tư như phạm vi của biến đã được trình bày ở phần trước. Từ khĩa [Static] xác định cách thức cấp phát bộ nhớ cho các biến khai báo bên trong chương trình con (sẽ trình bày cụ thể ở phần sau). CHÚ Ý Từ khĩa Friend chỉ được sử dụng trong mơ-đun lớp hoặc mơ-đun lệnh của UserForm. 9.1. Hàm (Function) Là chương trình con cĩ trả về giá trị khi nĩ được gọi. Cú pháp khai báo như sau: [Private/Public/Friend][Static] Function ([Các_tham_số]) as [Khối_lệnh] 50
  56. CHƯƠNG III: CƠ BẢN VỀ NGƠN NGỮ LẬP TRÌNH VISUAL BASIC End Function Ví dụ: tạo hàm tính diện tích của hình chữ nhật, với hai tham số cần nhập vào là chiều rộng và chiều dài của hình chữ nhật. Function Dien_Tich(Rong As Double, Dai As Double) as Double Dien_Tich=Rong*Dai End Function 9.2. Thủ tục (Sub) Là chương trình con khơng trả về giá trị khi được gọi. Cú pháp khai báo như sau: [Private/Public/Friend][Static] Sub ([Các_tham_số]) [Khối_lệnh] End Sub Ví dụ: để tạo một chương trình con dạng thủ tục cĩ tính năng như phần trên cĩ thể viết mã lệnh như sau: Sub Dien_Tich(Rong as Double, Dai as Double, Dt as Double) Dt=Rong*Dai End Sub CHÚ Ý Trong ví dụ này, vì chương trình con khơng cĩ giá trị trả về nên để nhận về giá trị diện tích phải bổ sung thêm tham số Dt vào trong danh sách tham số của chương trình con. 9.3. Truyền tham số cho chương trình con. Xét 2 chương trình con được đặt trong cùng một mơ-đun chuẩn, thực hiện việc gán và in giá trị của biến như sau: Một chương trình con đơn giản được tạo ra như sau: Public Sub Test(ByRef a As Long, b As Long, ByVal c As Long) a = 100: b = 200: c = 300 End Sub Chú ý đến khai báo biến a, b và c của chương trình con này: Trước biến a là từ khĩa ByRef. Trước biến b khơng cĩ từ khĩa, nghĩa là sử dụng kiểu mặc định của VB. Trước biến c là từ khĩa ByVal. Chương trình con thứ hai được xây dựng trên cùng một mơ-đun với chương trình con trên như sau: Public Sub CallTest() Dim va As Long, vb As Long, vc As Long va = 500: vb = 500: vc = 500 ' In giá trị của biến trước khi gọi chương trình con thứ nhất Debug.Print " Cac gia tri bien truoc khi goi chuong trinh con:" Debug.Print "va=" & Str(va) Debug.Print "vb=" & Str(vb) 51
  57. GIÁO TRÌNH TỰ ĐỘNG HỐ THIẾT KẾ CẦU ĐƯỜNG Debug.Print "vc=" & Str(vc) ' Gọi chương trình con thứ nhất Test va, vb, vc ' In giá trị của biến sau khi gọi chương trình con thứ nhất Debug.Print " Cac gia tri bien sau khi goi chuong trinh con:" Debug.Print "va=" & Str(va) Debug.Print "vb=" & Str(vb) Debug.Print "vc=" & Str(vc) End Sub Trong chương trình con thứ 2 cĩ lời gọi đến chương trình con thứ nhất để thực hiện thay đổi giá trị của các biến. Kết quả khi thực thi chương trình con thứ 2 như sau: Qua kết quả trên cĩ thể thấy rằng: Giá trị của biến cĩ thể bị thay đổi hoặc khơng bị thay đổi khi chúng được truyền vào chương trình con là phụ thuộc vào cách định nghĩa tham số trong chương trình con đĩ. Biến a trong Sub Test được khai báo với từ khĩa ByRef và khi truyền biến ở vị trí này (biến va trong CallTest) thì giá trị của biến ban đầu bị thay đổi tương ứng với các tác động trong chương trình con. Biến b trong Sub Test được khai báo mặc định (khơng cĩ từ khĩa nào phía trước nĩ) và khi truyền biến ở vị trí này (biến vb trong CallTest) thì giá trị của biến ban đầu bị thay đổi tương ứng với các tác động trong chương trình con. Biến c trong Sub Test được khai báo với từ khĩa ByVal và khi truyền biến ở vị trí này (biến vc trong CallTest) thì giá trị của biến ban đầu khơng bị thay đổi cho dù trong chương trình con biến này bị tác động. Qua ví dụ trên cĩ thể thấy rằng việc truyền tham số cho chương trình con cĩ thể được phân làm hai trường hợp và được đặt tên là truyền tham số theo tham chiếu và truyền tham số theo tham trị. 9.3.1. Truyền tham số theo tham chiếu. Khi truyền một biến vào tham số theo kiểu tham chiếu, địa chỉ của biến sẽ được truyền cho chương trình con. Do đĩ, bất kì câu lệnh nào của chương trình con tác động lên tham số sẽ ảnh hưởng trực tiếp lên biến được truyền tương ứng, nghĩa là khi chương trình con kết thúc, giá trị của biến được truyền theo kiểu này sẽ bị thay đổi do chương trình con. Truyền tham số theo kiểu tham chiếu là mặc định trong VB, người dùng cũng cĩ thể chỉ rõ việc truyền theo tham chiếu bằng cách thêm từ khố ByRef vào trước khai báo tham số. 9.3.2. Truyền tham số theo tham trị. Khi truyền một biến vào tham số theo kiểu tham trị, bản sao giá trị của biến sẽ được truyền cho cho chương trình con. Do đĩ, nếu trong chương trình con cĩ các câu lệnh tác động lên tham số 52
  58. CHƯƠNG III: CƠ BẢN VỀ NGƠN NGỮ LẬP TRÌNH VISUAL BASIC thì chỉ bản sao bị ảnh hưởng và biến truyền vào sẽ khơng bị thay đổi, nghĩa là sau khi chương trình con kết thúc, giá trị của biến vẫn được giữ nguyên như ban đầu. Để xác định cách thức truyền dữ liệu cho một tham số theo kiểu tham trị, thêm từ khố ByVal vào trước khai báo tham số. Trong Sub Test ở trên, a và b là hai tham số được truyền theo kiểu tham chiếu cịn c được truyền theo kiểu tham trị. 9.3.3. Tham số tuỳ chọn. Tham số tuỳ chọn là tham số cĩ thể cĩ hoặc được bỏ qua khi gọi chương trình con. Các tham số tuỳ chọn được khai báo với từ khố Optional và trong một chương trình con, các khai báo của các tham số tuỳ chọn luơn phải nằm cuối danh sách tham số được khai báo. Ví dụ: viết chương trình con tính tốn diện tích của mặt cắt chữ nhật cĩ khoét lỗ (như hình dưới) với yêu cầu sau: Tính diện tích mặt cắt với các thơng số về chiều rộng w, chiều cao h và bán kính r của lỗ khoét. Trong trường hợp thiếu thơng số về bán kính r, chỉ tính diệ n tích mặt cắt chữ nhật và bỏ qua lỗ khoét. Dưới đây là một chương trình con cĩ sử dụng tham số tuỳ chọn: Public Function DT(w As Double, h As Double, Optional r As Variant) If Not IsMissing(r) Then If (2 * r <= w) And (2 * r <= h) Then DT = w * h - pi * r ^ 2 Else MsgBox " Co loi, lo khoet vuot ra ngoai hinh" DT = "Error" End If Else DT = w * h End If End Function Sau khi tạo mã lệnh trên, nếu muốn tính diện tích cho mặt cắt với w =100, h =200, r =20 cĩ thể gọi hàm như sau: DT(100,200,20) để tính diện tích cĩ xét đến khoét lỗ với bán kính là 20, hoặc DT(100,200) để tính diện của hình chữ nhật (khơng cĩ lỗ). CHÚ Ý Để biết được một tham số tuỳ chọn cĩ bị bỏ qua khi gọi chương trình con hay khơng, dùng hàm IsMissing(tham_số_tuỳ_chọn) và đồng thời tham số tuỳ chọn bắt buộc phải cĩ kiểu dữ liệu là Variant (vì hàm IsMissing chỉ cĩ hiệu lực đối với các biến kiểu Variant). Hàm này trả về TRUE nếu tham số bị bỏ qua, FALSE nếu tham số cĩ mặt. 9.3.4. Danh sách tham số với số lượng tham số tuỳ ý. Visual Basic 6.0 cho phép tạo một chương trình con với danh sách tham số tuỳ ý (nghĩa là số lượng các tham số cĩ thể thay đổi khi gọi chương trình con) thơng qua việc đặt từ khố 53
  59. GIÁO TRÌNH TỰ ĐỘNG HỐ THIẾT KẾ CẦU ĐƯỜNG ParamArray trước danh sách tham số. Khi đĩ danh sách tham số là tuỳ chọn và cĩ dạng một mảng kiểu Variant. Ví dụ: viết một hàm tính tổng của tất cả các số truyền vào với số lượng số được truyền là tuỳ ý. Mã lệnh tham khảo như sau: Public Function TinhTong(ParamArray ds()) Dim So As Variant Dim Tong As Variant Tong = 0 For Each So In ds Tong = Tong + So Next TinhTong = Tong End Function Khi đĩ: TinhTong(100,200,-200) cho kết quả là 100 TinhTong(2,300) cho kết quả là 302 9.3.5. Hàm cĩ giá trị trả về là kiểu mảng. Để khai báo một hàm trả về mảng, thêm cặp kí tự “( )” sau khai báo hàm [Private/Public] Function ([danh sách tham số]) as _ () [Khối_lệnh] End Function Ví dụ: viết chương trình con sắp xếp các phần tử trong mảng một chiều và trả về một mảng cĩ thứ tự tăng dần. Mã lệnh tham khảo như sau: Public Function Mang_tangdan(Mang_bandau() As Double) As Double() Dim Lb As Long, Ub As Long ' bien dau va cuoi cua mang Dim i As Long, j As Long Lb = LBound(Mang_bandau): Ub = UBound(Mang_bandau) Dim Mang_tamthoi() As Double ‘ Khai bao mot mang tam thoi Mang_tamthoi = Mang_bandau Dim Tg As Double For i = Lb To Ub - 1 For j = i + 1 To Ub If Mang_tamthoi(i) > Mang_tamthoi(j) Then Tg = Mang_tamthoi(i) Mang_tamthoi(i) = Mang_tamthoi(j) Mang_tamthoi(j) = Tg End If Next Next Mang_tangdan = Mang_tamthoi Erase Mang_tamthoi ' Huy mang tam thoi End Function Chương trình thử nghiệm hàm trên: Public Sub test() Dim a(2 To 6) As Double 54
  60. CHƯƠNG III: CƠ BẢN VỀ NGƠN NGỮ LẬP TRÌNH VISUAL BASIC a(2) = 1: a(3) = 6: a(4) = 0.5: a(5) = 2.3: a(6) = 4 Dim b() As Double b = Mang_tangdan(a) ‘ Goi ham da viet Dim so As Variant Debug.Print "Cac phan tu cua mang ban dau:" For Each so In a Debug.Print so Next Debug.Print "Cac phan tu cua mang sau khi sap xep:" For Each so In b Debug.Print so Next End Sub Kết quả như sau: 9.4. Biến trong chương trình con. Như đã trình bày ở phần trước, biến trong chương trình con luơn cĩ tính chất cục bộ. Tuy nhiên hình thức cấp phát bộ nhớ cho biến thì cĩ thể khác nhau. Tuỳ vào từng trường hợp cụ thể: Trường hợp: trong phần khai báo của chương trình con khơng sử dụng từ khĩa Static Với các biến được khai báo bình thường với từ khố Dim: mỗi lần chương trình con được gọi, biến sẽ được tạo và cấp phát bộ nhớ. Khi chương trình con kết thúc, bộ nhớ dành cho biến được giải phĩng. Do đĩ, giá trị của biến sau mỗi phiên làm việc của chương trình con sẽ khơng được lưu trữ. Với các biến được khai báo với từ khố Static: biến sẽ được khởi tạo một lần khi mơ-đun chứa chương trình con được nạp vào trong bộ nhớ và sẽ tồn tại trong bộ nhớ cùng với mơ-đun đĩ. Vì vậy, giá trị của biến sau mỗi phiên làm việc của chương trình con sẽ được lưu trữ. Các biến kiểu này được gọi là biến tĩnh (Static) Ví dụ: trong chương trình con StVariable dưới đây cĩ hai biến địa phương, stA là biến tĩnh và B là biến thơng thường. Public Sub StVariable() Static stA As Long Dim B As Long B = B + 1 stA = stA + 1 55
  61. GIÁO TRÌNH TỰ ĐỘNG HỐ THIẾT KẾ CẦU ĐƯỜNG Debug.Print "Lan chay " & Str(stA), "stA=" & Str(stA), "B=" & Str(B) End Sub Kết quả sau 2 lần chạy chương trình con trên như sau: Giải thích Ngay khi được khai báo, tất cả các biến đều được tự động khởi tạo giá trị ban đầu, nếu kiểu dữ liệu của biến là dạng số thì giá trị khởi tạo bằng 0, cịn nếu kiểu dữ liệu của biến là chuỗi thì giá trị khởi tạo mặc định là chuỗi rỗng. Trong chương trình trên, ngay trước khi kết thúc ở lần chạy đầu tiên, giá trị của các biến như sau: Biến B = 1. Biến stA = 1. Khi kết thúc lần chạy thứ nhất, biến B (biến thơng thường) sẽ được giải phĩng, cịn biến stA (biến tĩnh) vẫn được lưu giá trị (=1) của nĩ lại trong bộ nhớ. Do đĩ đến lần chạy thứ hai, biến B được tạo mới sẽ nhận giá trị là B=B+1=0+1=1, cịn biến stA do vẫn tồn tại từ lần trước nên giá trị của nĩ là stA=stA+1=1+1=2. Trường hợp: trong khai báo của chương trình con cĩ sử dụng từ khĩa Static Khi đĩ tất cả các biến khai báo trong chương trình con sẽ là các biến tĩnh. Ví dụ: trong chương trình con StPro dưới đây đã sử dụng khai báo Static ở đầu chương trình. Public Static Sub StPro() Dim a As Long Dim b As Long a = a + 1 b = b + 1 a = a + b Debug.Print "Lan chay " & Str(b) Debug.Print " ", "a=" & Str(a), "b=" & Str(b) End Sub Kết quả sau 2 lần chạy chương trình con như sau: 56