Chương trình con

Một phần của tài liệu thiết kế công cụ hỗ trợ trên Excel docx (Trang 49 - 53)

/ Chia \ Chia lấy phần nguyên

9. Chương trình con

Về cơ bản, chương trình con là một khối các câu lệnh và chúng được sử dụng lặp lại trong chương trình chính thông qua tên của chương trình con. Chương trình con đặc biệt hữu ích khi thay thế các khối lệnh lặp nhau hoặc cùng thực thi một chức năng tương tự nào đó.

Có hai loại chương trình con chính là Hàm (Function) và Thủ tục (Sub). Ngoài ra, trong các mô-đun lớp (Class Module) còn có chương trình con dạng thuộc tính (Property), tuy nhiên trong của giáo trình sẽ không trình bày về loại chương trình con này.

Cú pháp tổng quát của một chương trình con như sau:

[Private|Friend|Public][Static]<Sub|Function|Property>

Tên([các_tham_số])

[Khối_lệnh]

End <Sub|Function|Property>

Trong đó phần thân chương trình con được bọc giữa phần khai báo và phần kết thúc (có từ khóa End).

Các từ khóa [Private|Public|Friend] xác định phạm vi hoạt động của chương trình con. Khái niệm phạm vi này cũng tương tư như phạm vi của biến đã được trình bày ở phần trước. Từ khóa [Static] xác định cách thức cấp phát bộ nhớ cho các biến khai báo bên trong chương trình con (sẽ trình bày cụ thểở phần sau).

9.1. Hàm (Function)

Là chương trình con có trả về giá trị khi nó được gọi. Cú pháp khai báo như sau:

[Private/Public/Friend][Static] Function <Tên_hàm> ([Các_tham_số]) as <kiểu_dữ_liệu>

[Khối_lệnh] End Function

Ví dụ: tạo hàm tính diện tích của hình chữ nhật, với hai tham số cần nhập vào là chiều rộng và chiều dài của hình chữ nhật.

Function Dien_Tich(Rong As Double, Dai As Double) as Double Dien_Tich=Rong*Dai

End Function

9.2. Th tc (Sub)

Là chương trình con không trả về giá trị khi được gọi. Cú pháp khai báo như sau:

[Private/Public/Friend][Static] Sub <Tên_hàm> ([Các_tham_số]) [Khối_lệnh]

End Sub

Ví dụ: để tạo một chương trình con dạng thủ tục có tính năng như phần trên có thể viết mã lệnh như sau:

Sub Dien_Tich(Rong as Double, Dai as Double, Dt as Double) Dt=Rong*Dai

End Sub

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. Truyn tham s cho chương trình con

Ta xét ví dụ 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 Single, 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:

Dim va As Long, vb As Long, vc As Long va = 500: vb = 500: vc = 500

Debug.Print " Cac gia tri bien truoc khi goi chuong trinh con:" Debug.Print "va=" & Str(va)

Debug.Print "vb=" & Str(vb) Debug.Print "vc=" & Str(vc)

Test va, vb, vc ' goi chuong trinh con

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 này, chương trình con ban đầu có tên là Test được sử dụng nhằm mục đích minh họa sự thay đổi của các tham số khi chúng được truyền vào chương trình con. Kết quả 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ếutruyền tham số theo tham trị.

9.3.1.Truyn tham s theo tham chiếu

Khi truyền một biến vào tham số theo kiểu tham chiếu, địa chỉ của biến sẽ được truyền cho chương trình con. Do đó, bất kì câu lệnh nào của chương trình con tác động lên tham số sẽảnh hưởng trực tiếp lên biến được truyền tương ứng, nghĩa là khi chương trình con kết thúc, giá trị của biến được truyền theo kiểu này sẽ bị thay đổi do chương trình con. Truyền tham số theo kiểu tham chiếu là mặc định trong VB, người dùng cũng có thể chỉ rõ việc truyền theo tham chiếu bằng cách thêm từ khoá ByRef vào trước khai báo tham số.

9.3.2.Truyn tham s theo tham tr

Khi truyền một biến vào tham số theo kiểu tham trị, bản sao giá trị của biến sẽđược truyền cho cho chương trình con. Do đó, nếu trong chương trình con có các câu lệnh tác động lên tham số thì chỉ bản sao bịảnh hưởng và biến truyền vào sẽ không bị thay đổi, nghĩa là sau khi chương trình con kết thúc, giá trị của biến vẫn được giữ nguyên như ban đầu. Để xác định cách thức truyền dữ liệu cho một tham số theo kiểu tham trị, thêm từ khoá ByVal vào trước khai báo tham số.

Trong Sub Test ở trên, a và b là hai tham sốđược truyền theo kiểu tham chiếu còn c được truyền theo kiểu tham trị.

9.3.3.Tham s tu chn.

Tham số tuỳ chọn là tham số có thể có hoặc được bỏ qua khi gọi chương trình con.

Các tham số tuỳ chọn được khai báo với từ khoá Optional và trong một chương trình con, các khai báo của các tham số tuỳ chọn luôn phải nằm cuối danh sách tham sốđược khai báo.

Ví dụ: viết chương trình con tính toán diện tích của mặt cắt chữ nhật có khoét lỗ (như hình dưới) với yêu cầu sau:

Ø

ØTính diện tích mặt cắt với các thông số về chiều rộng w, chiều cao h và bán kính r của lỗ khoét.

Ø

ØTrong trường hợp thiếu thông số về bán kính r, chỉ tính diện tích mặt cắt chữ nhật và bỏ qua lỗ khoét.

Sau đây là mã lệnh tham khảo:

Public Function DT(w As Double, h As Double, Optional r As Double) 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 (chưa có lỗ).

Để biết được một tham số tuỳ chọn bị bỏ qua khi gọi chương trình con hay không, dùng hàm IsMissing (tham_số). Hàm này trả về True nếu tham số bị bỏ qua, False nếu tham số có mặt.

VB6 cho phép tạo một chương trình con với danh sách tham số tuỳ ý (nghĩa là số lượng các tham số có thể thay đổi khi gọi chương trình con) thông qua việc đặt từ khoá ParamArray trước danh sách tham số. Khi đó danh sách tham số là tuỳ chọn và có dạng một mảng kiểu Variant. Ví dụ: viết một hàm tính tổng của tất cả các số truyền vào với số lượng sốđược truyền là tuỳ ý. Mã lệnh tham khảo như sau:

Public Function TinhTong(ParamArray ds()) Dim So As Variant

Dim Tong As Variant Tong = 0 For Each So In ds Tong = Tong + So Next TinhTong = Tong End Function Khi đó: TinhTong(100,200,-200) cho kết quả là 100 TinhTong(2,300) cho kết quả là 302 9.3.5.Hàm có giá tr tr v là kiu mng.

Để khai báo một hàm trả về mảng, thêm cặp kí tự “( )” sau khai báo hàm

[Private/Public] Function <Tên_hàm> ([danh sách tham số]) as _ <kiểu_dữ_liệu> ()

[Khối_lệnh] End Function

Ví dụ: viết chương trình con sắp xếp các phần tử trong mảng một chiều và trả về một mảng có thứ tự tăng dần.

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

Một phần của tài liệu thiết kế công cụ hỗ trợ trên Excel docx (Trang 49 - 53)

Tải bản đầy đủ (PDF)

(78 trang)