training for local cadres.×lập trình vba for word×vba for excel and autocad×access 2010 vba for dummies pdf×vba for excel× Tối đa 6 từ khóa access 2007 vba programming for dummiesvba for autocad guidevba for autocadexcel 2010 vba for dummies pdftôp for cad
Chương I. Lịch sử phát triển môi trường CAD Chương II. Giới thiệu VBA Một ứng dụng VBA for CAD sẽ bao gồm một số thành phần sau: -UserForm là đối tượng giao diện người dùng, bên trong có chứa các đoạn code thực thi câu lệnh. - Các modules và các Class - Các ocx và các thư viện mẫu DLL I. Biến Biến là các đại lượng có thể thay đổi được giá trị, dùng để lưu trữ các giá trị trong quá trình chạy chương trình. VB quản lý các biến thông qua tên biến, trong các biến thường lưu trữ một kiểu dữ liệu đặc trưng riêng. 1. Khai báo biến Cú pháp khai báo biến: Dim <tên biến> as [ As DataType ] Kiểu dữ liệu ở đây có thể hiểu là Integer, String, Object… Cú pháp: Option Explicit Nếu trong chương trình chúng ta khai báo câu lệnh trên thì bắt buộc mọi biến trước khi sử dụng đều cần phải được khai báo rõ ràng, và ngược lại nếu không có thì chương trình sẽ tự tạo ra các biến mà chúng ta đã không khai báo. Tuy nhiên như thế chúng ta sẽ khó mà kiểm soát được các biến của mình. Bạn có thể thay đổi tùy chọn khai báo biến trước khi sử dụng bằng cách vào Tool->Option và thay đổi chọn trong Require Variable Declaration. Nếu tích chọn thì chương trình lập trình của bạn sẽ yêu cầu phải khai báo trước khi dùng và ngược lại. 2. Đặt tên biến Đặt tên biến tuân theo quy tắc sau: 1 - Ký tự đầu tiên phải là chữ - Không được sử dụng các dấu trắng, (.), !,@,#,$ để đặt tên - Tên không được dài hơn 255 ký tự - Không đặt tên trùng với các tên đặc biệt dùng để điều khiển trong VB, ví dụ như Left vì trong UserForm có câu lệnh UserForm.Left - Không thể có 2 biến trùng tên nhau trong một chương trình Thông thường đặt tên trong VBA thì tên biến thường nói lên kiểu dữ liệu bên trong nó, vì vậy thông thường để tiện dùng, kiểm tra thì người ta thường tuân theo quy tắc đặt tên sau: Ngoài ra người lập trình thường đặt tên theo cú pháp “lạc đà” để dễ đọc: VD: OptSaveFormat thì chứ S và F viết hoa. 3. Biến và phạm vi sử dụng Nếu biến được khai báo trong hàm, thủ tục thì nó chỉ được hiểu trong hàm, thủ tục đó. Đó chính là phạm vi ảnh hưởng của biến. Trong trường hợp bạn muốn có các biến được sử dụng trong toàn bộ chương trình thì bạn phải khai báo chúng ở bên ngoài tất cả các hàm và thủ tục, và thông thường nó ở ngay đầu chương trình. Biến trong thủ tục: Chỉ được hiểu trong thủ tục đó và bạn không thể khai báo Public cho biến này Biến trong Module: Được hiểu trong tất cả các thủ tục thuộc Module đó. Proceduce Variable Cú pháp: Dim <Tenbien> as [KieuDuLieu] VD: Dim Line as AcadLine Module Variable Để khai báo biến dùng trong cả Module bạn phải khai báo biến ở ngay đầu tiên của Module. Cú pháp: Private <TenBien> as [KieuDuLieu] VD: Private LayerOn as Bolean Global Variable 2 Khi bạn muốn có một biến được hiểu trong tất cả chương trình bạn dùng cú pháp Cú pháp: Public <TenBien> as [KieuDuLieu] VD: Public LayerOn as Bolean Lưu ý rằng bạn không thể dùng từ khóa Public để khai báo biến trong hàm hoặc thủ tục. Hằng Hằng thực chất là biến có giá trị không đổi. Được khai báo trong Module, hàm, thủ tục Trong trường hợp bạn muốn có các biến không đổi trong toàn chương trình thì bạn dùng cú pháp sau: <Public> Const SaveTime = 15 Hằng khai báo trong hàm, thủ tục sẽ được hiểu trong hàm, thủ tục đó. <Private> Const SaveTime = 15 II. Kiểu dữ liệu 1. Kiểu dữ liệu Variant Là kiểu dữ liệu mà bạn hoàn toàn chưa xác định, sau này trong chương trình tùy theo trường hợp sử dụng mà biến có kiểu dữ liệu này sẽ được gán tương ứng: Cú pháp: Dim <TenBien> 2. Các kiểu dữ liệu cơ bản trong VB a) Dữ liệu cơ bản đơn Kiểu dữ liệu Miền giá trị Chú giải Integer -32768 đến +32767 Chứa một dải các số nguyên có miền giá trị nt Long -2147483648 đến 2147483647 Là một dải các số nguyên ( lớn hơn kiểu Integer) Single Khoảng 1,4e-45 đến 3,4e+48 Là kiểu số thực chiếm 4 byte của dữ liệu Double Khoảng 4,94e-324 đến 1,8e+308 Số thực có độ chính xác gấp đôi, chiếm 8 byte của dữ liệu Currency 922,337,203,685,447.00 Đến 922,337,203,685,447 String Khoảng 2 tỉ ký tự Các ký tự kiểu Text Boolean 1 hoặc 0 True/False hoặc On/Off hoặc Yes/No Byte 0 đến 255 Data 1/1/100 đến 12/31/9999 và 0:00:00 đến 23:59:59 Variant Tất cả các kiểu giá trị Đặc biệt trong VBA có sự chuyển đổi từ ký tự sang số: Private Sub CommandButton1_Click() Dim cout As Integer Dim Chuoi As String Count = 100 Chuoi = "555" MsgBox ("Integer:" & Count & " String=" & Chuoi) Count = Chuoi MsgBox ("Integer:" & Count + 1) End Sub 3 b) Dữ liệu mảng Dữ liệu mảng là một thành phần dữ liệu quan trọng lập trình. Dữ liệu mảng là một tập các giá trị cùng kiểu dữ liệu và được lưu giữ dưới cùng 1 tên biến, các giá trị mảng được truy nhập thông qua các chỉ số của mảng. Cú pháp: Dim <TenBien>(0 to 2) as [KieuDuLieu] VD: Dim DiemDau(0 to 2) as Double ‘ Khai báo mảng tên DiemDau gồm 3 phần tử ‘ Kiểu dữ liệu là Double DiemDau(0)=5 ‘Gán các phần tử cho mảng DiemDau(1)=6 DiemDau(2)=7 c) Mảng động Mảng động là mảng khi khai báo ta chỉ xác định kiểu mà không xác định độ dài của mảng. Cú pháp: Dim <TenMang>() as [KieuDuLieu] VD: Dim Index() as Integer Khi cần xác lập độ dài của mảng ta dùng câu lệnh: Redim Index(10) Bất cứ mảng nào khi bạn dùng câu lệnh Redim thì toàn bộ nội dung bên trong của mảng đó sẽ bị xóa. Muốn không bị xóa nội dung bên trong ta phải dùng câu lệnh sau: Redim Preserve Index(10) Ví dụ: Dim Diem() As Double Private Sub CommandButton1_Click() ‘Đoạn code cho Button giá trị đầu ReDim Diem(3) Diem(0) = 1 Diem(1) = 2 Diem(2) = 3 MsgBox ("Diem (0):" & Diem(0) & "Diem (1):" & Diem(1) & "Diem (2):" & Diem(2)) End Sub Private Sub CommandButton2_Click() ‘Đoạn code cho Button Redim ReDim Diem(10) MsgBox ("Diem (0):" & Diem(0) & "Diem_ (1):" & Diem(1) & "Diem (2):" & Diem(2)) End Sub Private Sub CommandButton3_Click() ‘Đoạn code cho Button Redim Preserve ReDim Preserve Diem(10) MsgBox ("Diem (0):" & Diem(0) & "Diem_ (1):" & Diem(1) & "Diem (2):" & Diem(2)) End Sub 3. Các kiểu dữ liệu VBA for CAD III. Modules 4 VBA application bao gồm các UseForm, Class, Module. UserForm UserForm có chứa đầy đủ các thuộc tính và cách sử dụng giống hệt một giao diện của VB truyền thống. Trên UserForm bạn có thể thêm các button, textbox… và tạo ra các sự kiện ứng xử cho chúng. Trong một UserForm có các hàm, thủ tục, biến và các sự kiện nhằm phục vụ cho bạn tạo ra một ứng dụng đầy đủ. Trong quá trình lập trình để sử dụng các UserForm cho các lần sau bạn cần Export UserForm. Bạn vào File->Export File. Lưu tên file, file này sẽ được lưu dưới đuôi frm. Để add một UserForm bạn có thể vào File->Import File (Lưu ý rằng file này cần được tạo bởi VB). Standard Standard Module thực chất là một mô đun bạn đã thực hiện, và muốn tận dụng nó ở các chương trình khác nhau, VBA cho phép bạn xuất các File đó dưới dạng .bas và Import vào các chương trình khác và dùng lại chúng (Tương tự như UserForm) Class Nền móng của lập trình hướng đối tượng trong VB chính là các Class Module. Bạn có thể tạo ra một đối tượng mới có các thuộc tính, phương thức và các sự kiện. Bạn có thể tạo ra các Class trong chương trình, Export các class và sử dụng 5 lại chúng trong các chương trình khác nhau. Cách Import một class tương tự như UserForm. IV. Procedures 1. Sub Sub là một đoạn code hoàn chỉnh, có thể thực hiện một công việc hoặc một phần công việc của của chương trình. Một Sub có thế được gọi từ một proceduce khác của chương trình. Khi gọi một Sub có thể có các thông số truyền vào đi kèm hoặc không có. Khi chương trình gọi một Sub thì không có giá trị trả về. Cú pháp khai báo Sub: [Private|Public|Static] Sub <TenProcedures>([Các Thông Số Đi Kèm]) <Các câu lệnh> End Sub Private Sub CommandButton1_Click() Dim Layer As AcadLayer For Each Layer In ThisDrawing.Layers MsgBox Layer.Name Next Layer End Sub 2. Function Function cơ bản khác Sub đó là khi gọi Function sẽ trả về một giá trị. Cú pháp khai báo Function: [Private|Public|Static] Function <TenProcedures>([Các Thông Số Đi Kèm]) as [KieuDuLieu] <Các câu lệnh> End Fuction Cách để gọi một Function: GiaTri = TenFunction([DanhSachCacBien]) Một điểm lưu ý là khi các biến truyền vào function thì có thể giá trị đó có thể bị thay đổi, hoặc có thế không bị thay đổi. 6 Code lập trình cho button Sub Private Sub btFunction1_Click() Dim Tong1 As Double Dim a1 As Double Dim b1 As Double Dim c1 As Double a1 = txtA.Text b1 = txtB.Text c1 = txtC.Text Tong1 = Module1.TinhTongFunction1(a1, b1, c1) txtA.Text = a1 txtB.Text = b1 txtC.Text = c1 MsgBox ("Tong=" & Tong1) End Sub Code lập trình cho button Fuction1 Private Sub btFuction2_Click() Dim Tong1 As Double Dim a1 As Double Dim b1 As Double Dim c1 As Double a1 = txtA.Text b1 = txtB.Text c1 = txtC.Text Tong1 = Module1.TinhTongFunction2(a1, b1, c1) txtA.Text = a1 txtB.Text = b1 txtC.Text = c1 MsgBox ("Tong=" & Tong1) End Sub Code lập trình cho button Fuction2 Public Sub btSub_Click() Dim Tong1 As Double Dim a1 As Double Dim b1 As Double Dim c1 As Double a1 = txtA.Text b1 = txtB.Text c1 = txtC.Text MsgBox ("a=" & a1) Call Module1.TinhTongSub(a1, b1, c1, Tong1) txtA.Text = a1 7 txtB.Text = b1 txtC.Text = c1 MsgBox ("Tong=" & Tong1) End Sub Code lập trình hàm Function1 và Function2 Public Sub TinhTongSub(ByRef a As Double, ByRef b As Double, ByRef c As Double, ByRef tong As Double) tong = a + b + c a = a - 1 b = b - 1 c = c - 1 End Sub Public Function TinhTongFunction1(ByVal a As Double, ByVal b As Double, ByVal c As Double) As Double Dim tong As Double tong = a + b + c a = a - 1 b = b - 1 c = c - 1 TinhTongFunction1 = tong End Function Public Function TinhTongFunction2(ByRef a As Double, ByRef b As Double, ByRef c As Double) As Double Dim tong As Double tong = a + b + c a = a - 1 b = b - 1 c = c - 1 TinhTongFunction2 = tong End Function Khi hàm truyền vào kiểu ByVal thì các dữ liệu truyền vào sau khi ra khỏi hàm thì không bị thay đổi giá trị. Nếu truyền vào kiểu ByRef thì giá trị sẽ bị thay đổi trực tiếp trên giá trị đó. 3. Event Event proceduce được thực thi khi sự kiện nào đó xảy ra tương ứng. Bạn có thể khai báo Event trong class, hoặc ngay trong UserForm hoặc ngay trong ActiveX. Event có những tên đặc trưng để phân biệt với các proceduce khác trong object, giống như các bạn khai báo kiểu int thì khác kiểu double. VD: Private Sub btFuction2_Click() 8 Trong câu lệnh này thì tên Event Proceduce gồm 2 phần btFunction2 và Click, sự kiện Click này để phân biệt với các sự kiện khác như là Bbclick Private Sub btFuction2_DblClick(ByVal Cancel As MSForms.ReturnBoolean) Cùng một đối tượng có rất nhiều sự kiện bên trong nó. V. Các cấu trúc điều khiển rẽ nhánh 1. If………….then Khi bạn muốn kiểm tra một điều kiện để thực hiện một câu lệnh bạn dùng If then If <DieuKienKiemTra> Then [Câu lệnh] If <Điều Kiện Kiểm Tra> Then [Khối câu lệnh] End if Điều kiện kiểm tra có thể nhận giá trị True hoặc False, khi Điều kiện đúng thì thực hiện câu lệnh, khi sai thì không làm gì cả. 2. If………….then………………….Else Cú pháp: If <Điều kiện kiểm tra> Then [Khối câu lệnh1] Else [Khối câu lệnh2] End if Khi điều kiện kiểm tra là đúng thì chương trình thực hiện Khối câu lệnh 1 (không thực hiện khối câu lệnh 2) và ngược lại. Lưu ý rằng bạn cũng có thể dùng các lệnh If lồng nhau nhưng chúng thường mất thời gian để kiểm soát, do vậy nếu trong trường hợp có nhiều điều kiện kiểm tra để rẽ nhánh chúng ta dùng Select Case 3. Select Case Select Case <Biến kiểm tra> Case <Biến kiểm tra>: [Khối câu lênh] Case Else <Khối câu lệnh> End Select VD: Select Case KiemTra Case "0": result = MsgBox("Xin chào các ban lop TH1") Case "1": MsgBox ("Xin chào các ban lop TH2") Case "2": MsgBox ("Xin chào các ban lop TH3") Case "3": MsgBox ("Xin chào các ban lop TH4") Case Else MsgBox ("Khong la cac gia tri tren") End Select VI. Các vòng lặp Các vòng lặp dùng để xử lý các câu lệnh có tính chất lặp đi lặp lại nhiều lần. Tùy theo cấu trúc mà bạn dùng vòng lặp có thể kết thúc tại đầu, cuối hoặc một thời điểm nào đó của chương trình. 9 1. Do While……… Lope Cú pháp: Do While <Điều kiện kiểm tra> [Khối câu lệnh] Loop Khi điều kiện kiểm tra đúng thì làm tiếp, điều kiện kiểm tra sai thì dừng lại. Bạn cần lưu ý rằng trong khối câu lệnh cần có sự điều khiển để thay đổi điều kiện kiểm tra vì nếu không thì vòng lặp sẽ lặp mãi không thoát ra được. 2. Do………….Lope While Cú pháp: Do [Khối câu lệnh] Loop While <Điều kiện kiểm tra> Vòng lặp này khác vòng lặp trên đó là khi chạy vòng lặp ít ra chương trình cũng thực hiện được một lần khối câu lệnh rồi, còn vòng lặp Do While …. Loop thì có thể không thực hiện khối câu lệnh nào trong trường hợp điều kiện kiểm tra sai. 3. Do Until Loop và Do Loop Until Cú pháp: Do until <Điều kiện kiểm tra> [Khối câu lệnh] Loop B1: Chương trình kiểm tra điều kiện +Nếu đúng chương trình thực hiện khối câu lệnh B2:Kiểm tra điều kiện Do [Khối câu lệnh] Loop Until <Điều kiện kiểm tra> B1: Chương trình thực hiện khối câu lệnh B2: Chương trình kiểm tra điều kiện. Nếu đúng thì chương trình dừng lại. Khi điều kiện kiểm tra đúng thì vòng lặp dừng lại. Cú pháp của các câu lệnh này ngược lại với Do While Loop và Do Loop While. Các cú pháp câu lệnh trên được gọi là các vòng lặp không xác định vì ta không biết chính xác số vòng sẽ lặp. Khi biết chính xác số vòng đã lặp ta dùng các cú pháp sau. 4. For …………… Next Cú pháp: For <Biến đếm> = <Giá trị bắt đầu> to <Giá trị kết thúc> [Bước nhảy] [Khối câu lệnh] Next [Biến đếm] Đầu tiên biến đếm được gán bằng giá trị bắt đầu Sau đó thực hiện khối câu lệnh Tăng giá trị biến đếm theo bước nhảy Chuyển sang thực hiện khối câu lệnh. 10 [...]... lập trình Chúng ta sẽ lần lượt tìm hiểu về từng đối tượng này trong chương tiếp theo II Cài đặt thuộc tính của UseForm Khi ta click chuột vào vùng của UseForm1 thì trong Frame Properties – UseForm sẽ hiển thị các thuộc tính của UseForm1 Các thuộc tính: (Name) = UseForm1 : Đây là tên biến của Form1, khi chương trình chạy sẽ dùng tên này như là một biến để gọi tới nó Bạn có thể thay đổi được tên UseForm1... VII Cấu trúc hướng đối tượng 12 Chương III Các đối tượng công cụ trong VBA I Cách tạo một UseForm Từ môi trường CAD gõ lệnh VBAMAN sẽ hiện ra bảng VBA Manager Click chuột chọn New để mở môi trường project mới Sau đó click vào Visual Basic Editor Sau đó ta click vào Insert -> UserForm để chèn vào một UserForm mới 13 Bên cạnh UserForm1 chúng thường sẽ nhìn thấy hộp Toolbox Nếu không nhìn thấy thì bạn... thị ở phía trên của UseForm1 Bạn có thể sửa dữ liệu của caption này VD: Nhap Du Lieu Height: Thuộc tính quy định chiều cao của Form Width: Thuộc tính quy định chiều rộng của Form Bạn có thể tùy chỉnh các thuộc tính này ngay trên bảng Properties hoặc lập trình để thay đổi các thuộc tính đó Top và Left của Form 14 III Cách thêm các đối tượng vào UseForm Tạo một đối tượng trên UseForm Bạn có thể dùng cách... này ta khai báo biến AcadLayers Đối tượng kiểu AcadLayers này bao gồm tất cả các Layer trong bản vẽ Private Sub CommandButton1_Click() Dim ObjectLayer As AcadLayers Set ObjectLayer = ThisDrawing.Layers MsgBox (ObjectLayer.Count) End Sub Dim ObjLayers as AcadLayers Set ObjLayers = ThisDrawing.Layers Để truy nhập vào một đối tượng Layer cụ thể ta dùng biến AcadLayer Dim ObjLayer As AcadLayer Set ObjLayer... các biến nguyên của vòng lặp for Đó gọi là sự lặp các layer Private Sub CommandButton2_Click() Dim ObjLayer As AcadLayer For Each ObjLayer In ThisDrawing.Layers MsgBox (ObjLayer.Name) Next End Sub Kiểm tra sự tồn tại của một Layer Khi lập trình bạn có thể gặp trường hợp cần kiểm tra xem một Layer đã tồn tại hay chưa (có thể là để dùng, sửa hoặc xóa), bạn cần lưu ý rằng AutoCad quản lý Layer theo tên... thúc thì chương trình dừng lại VD: Private Sub CommandButton1_Click() Dim i As Integer Dim tron(12) As AcadCircle Dim Tam(0 To 2) As Double Dim PI As Double PI = 3.141592654 Dim x As Double Dim y As Double Dim R As Double R = 10 For i = 1 To 12 Tam(0) = Math.Cos(i * PI / 12) * R Tam(1) = Math.Sin(i * PI / 12) * R Tam(2) = 0 Set tron(i) = ThisDrawing.ModelSpace.AddCircle(Tam, 2) Next For i = 0 To 12... ComboBox sẽ bắt sự kiện IndexChange Để lập trình cho sự kiện đó các bạn gõ đoạn code sau: Private Sub ComboBox1_Change() Dim KiemTra As Integer KiemTra = Me.ComboBox1.ListIndex Dim View As AcadUCS Select Case KiemTra Case "0" 'Ve Tam Giac UserForm1.Left = 500 Dim Diem1(2) As Double Dim Diem2(2) As Double Dim Diem3(2) As Double Dim Diem4(2) As Double Dim DuongThang As AcadLine Diem1(0) = 0: Diem1(1) = 0: Diem1(2)... TenLayer = "" Then Exit Sub For Each ObjLayer In ThisDrawing.Layers ObjLayer.LayerOn = False Next ObjLayer Set ObjLayer = ThisDrawing.Layers(TenLayer) If ObjLayer Is Nothing Then MsgBox "Khong ton tai layer yeu cau" Exit Sub End If ObjLayer.LayerOn = True 'UserForm1.Hide Update End Sub Hiển thị tất cả các Layer Private Sub CommandButton2_Click() Dim ObjLayer As AcadLayer 23 For Each ObjLayer In ThisDrawing.Layers... lại cùng một tên đối tượng Dim myLayer As AcadLine myLayer = ThisDrawing.ActiveLayer myLayer.color = acBlue myLayer.Linetype = "Continuous" myLayer.Lineweight = acLnWt000 myLayer.Freeze = False myLayer.LayerOn = True myLayer.Lock = False Khi bạn dùng with bạn có thể tiết kiệm được thời gian code với cú pháp của nó: Private Sub UserForm_Click() Dim myLayer As AcadLine myLayer = ThisDrawing.ActiveLayer... ThisDrawing.ModelSpace.AddCircle(Tam, 2) Next End Sub 11 5 For ……Each…………Next For Each In [Khối câu lệnh] Next 6 Exit Sub và Exit Function Public Sub SubName() … Exit Sub … End Sub Public Function SubName() … Exit Function … End Function Trong khi thực thi chương trình nếu gặp phải câu lệnh Exit Sub thì lập tức nó sẽ thoát . (2):" & Diem(2)) End Sub 3. Các kiểu dữ liệu VBA for CAD III. Modules 4 VBA application bao gồm các UseForm, Class, Module. UserForm UserForm có chứa đầy đủ các thuộc tính và cách sử dụng. Chương I. Lịch sử phát triển môi trường CAD Chương II. Giới thiệu VBA Một ứng dụng VBA for CAD sẽ bao gồm một số thành phần sau: -UserForm là đối tượng giao diện người dùng, bên trong. của UseForm Khi ta click chuột vào vùng của UseForm1 thì trong Frame Properties – UseForm sẽ hiển thị các thuộc tính của UseForm1. Các thuộc tính: (Name) = UseForm1 : Đây là tên biến của Form1,