Visual Basic

Màu nền
Font chữ
Font size
Chiều cao dòng

I. BIẾN - KIỂU DỮ LIỆU

1. Khai báo biến

Có hai chế độ khai báo và sử dụng biến trong VB. Đó là khai báo tường minh và khai báo không tường minh.

a. Khai báo không tường minh

Trong chế độ khai báo không tường minh, chúng ta không cần phải khai báo biến trước khi sử dụng. Tự bản thân hệ thống VB sẽ cấp phát biến khi gặp một tên biến mới.

Ví dụ trong hàm MySqr dưới đây, biến TempVal được sử dụng mà chưa khai báo trước.

Function MySqr(num)

TempVal = Abs(num)

MySqr = Sqr(TempVal)

End Function

Khi đó, hệ thống sẽ tự động tạo biến TempVal khi gặp dòng lệnh này. Tuy nhiên, chúng ta, những lập trình viên chuyên nghiệp, không nên sử dụng chế độ này vì đôi khi nó sẽ gây ra nhiều lỗi không phát hiện nổi do đánh nhầm tên biến. Thật vậy, cũng với hàm như trên nhưng nếu chúng ta nhập vào như sau:

Function MySqr(num)

TempVal = Abs(num)

MySqr = Sqr(TemVal)

End Function

kết quả của hàm thứ hai luôn là 0. Đó chính là vì biến TempVal đã bị nhập sai ở dòng lệnh thứ 2 là TemVal. Khi ấy, VB sẽ tự động tạo ra một biến mới có tên là TemVal và có giá trị mặc nhiên là 0. Điều này sẽ cho kết quả của hàm luôn là 0.

Trong những chương trình phức tạp, có rất nhiều dòng lệnh thì việc phát hiện ra những lỗi như thế là rất khó.

b. Khai báo tường minh

Để tránh những lỗi chương trình xảy ra do nhập sai tên biến, chúng ta có thể sử dụng chế độ khai báo tường minh. Với chế độ này, mỗi biến sử dụng cần phải được khai báo trước. Những biến nào chưa khai báo, VB sẽ báo lỗi khi thực thi chương trình. Trong cửa sổ lệnh, đặt dòng lệnh sau đây Option Explicitở đầu phần Declarations của màn hình giao tiếp (Form), lớp (Class) hay thư viện (Module).

Tuỳ theo phạm vi biến cần sử dụng, chúng ta có thể dùng các cấu trúc lệnh sau để khai báo biến.

Để khai báo biến cục bộ của một thủ tục, hàm, màn hình (Form) hay thư viện chúng ta có thể dùng cú pháp:

Dim Tên_biến [As Kiểu dữ liệu]

Dim x as

Để khai báo các biến toàn cục cho toàn bộ ứng dụng. Các biến toàn cục thường được khai báo trong một thư viện.

Puclic Tên_biến [As Kiểu_dữ_liệu]

Tên biến là một chuỗi ký tự thoả các điều kiện sau:

·Bắt đầu bằng ký tự

·Các ký tự có trong tên biến chỉ có thể là các ký tự chữ cái, ký tự số hay ký tự (_).

·Tên biến dài không quá 255 ký tự.

·Không trùng với các tên biến khác trong cùng phạm vi khai báo như thủ tục, hàm (Sub, Function), màn hình (Form), thư viện (Module).

Trong quá trình hoạt động mỗi biến sẽ có một kiểu dữ liệu nào đó. Kiểu dữ liệu sẽ quy định các giá trị sẽ được lưu trữ trong biến.

2. Các kiểu dữ liệu thường dùng

Tuỳ theo từng loại ứng dụng, người lập trình sẽ dùng các kiểu dữ liệu khác nhau có sẵn của VB. Ngoài những kiểu dữ liệu đặc thù cho từng loại ứng dụng, giống như những ngôn ngữ lập trình khác, VB hỗ trợ một tập hợp các kiểu dữ liệu thường dùng bao gồm các kiểu dữ liệu cơ sở như kiểu số nguyên, số thực, luận lý, chuỗi,… và các kiểu dữ liệu tổng quát.

Dưới đây là Bảng liệt kê các kiểu dữ liệu thường dùng của VB:

Tên kiểu

Đặc điểm

Byte

Kiểu dữ liệu nhị phân

Integer

Số nguyên 2 byte

Long

Số nguyên 4 byte

Single

Số thực 4 byte

Double

Số thực 8 byte

String

Chuỗi các ký tự

Currency

Kiểu số

Boolean

Luận lý (Yes/No)

Date

Dữ liệu ngày tháng năm

Control

Đối tượng điều khiển

Object

Đối tượng chung

Bảng II.1. Các kiểu dữ liệu thường dùng

Ngoài các kiểu dữ liệu cơ sở khá quen thuộc có trong bảng trên như kiểu số, chuỗi,… chúng ta còn thấy ba kiểu dữ liệu tổng quát cũng thường được sử dụng đó là Control, Object Một biến có kiểu dữ liệu Control sẽ được dùng tương ứng với một đối tượng điều khiển bất kỳ có trên màn hình giao tiếp Form. Đối tượng này có thể là hộp văn bản, nhãn, nút lệnh,… Khởi tạo giá trị cho các biến Control (tương tự với Object) phải dùng lệnh Set chứ không thể dùng lệnh gán (=) như các kiểu dữ liệu cơ sở.

Đoạn chương trình sau minh hoạ việc khai báo, gián giá trị và thao tác trên một biến control.

Dim ctlTextBox As Control

‘Khởi tạo ctlTextBox là hộp txtNoidung

Set ctlTextBox = Me.txtNoidung

‘Di chuyển điểm nháy đến txtNoidung

ctlTextBox.SetFocus

‘Chọn khối phần văn bản của txtNoidung

ctlTextBox.SelStart = 0

ctlTextBox.SelLength = Len(ctlTextBox.Text)

Đoạn chương trình trên sẽ khai báo và khởi tạo biến ctlTextBox là hộp văn bản txtNoidung có trên màn hình hiện hành. Sau đó di chuyển điểm nháy đến hộp văn bản này và chọn khối hết toàn bộ nội dung văn bản có trong đó.

3. Các toán tử cơ sở

a. Toán tử gán

Đây là toán tử cơ sở của hầu hết các ngôn ngữ lập trình. Toán tử dùng để gán giá trị cho các biến có kiểu dữ liệu cơ sở trong VB là dấu (=). Cú pháp chung lệnh gán có dạng sau:

<tên biến> = <biểu thức>

Biểu thức ở phần bên phải của cú pháp trên có thể là một giá trị hằng, một biến hay một biểu thức tính toán.

Khi đó, VB sẽ thực hiện việc tính giá trị của biểu thức trước rồi sau đó mới gán giá trị có được cho biến. Ví dụ dòng lệnh gán sau đây sẽ tăng giá trị biến k thêm 1:

k = k + 1 (tăng giá trị biến k thêm 1:))

Thông thường, giá trị của biểu thứcbiến trong cú pháp lệnh gán phải cùng kiểu dữ liệu, tuy nhiên chúng ta vẫn có thể gán biểu thức số vào một biến kiểu chuỗi. Trong trường hợp này, VB sẽ tự động đổi giá trị biểu thức thành chuỗi sau đó mới gán vào biến.

Với các biến có kiểu dữ liệu tổng quát, để gán giá trị cho biến chúng ta phải dùng lệnh Set theo cú pháp dưới đây:

Set <tên biên> = <biểu thức>

b. Toán tử tính toán

Những toán tử trình bày trong phần này là những toán tử cơ sở liên quan đến các giá trị số, bao gồm số nguyên và số thực.

·Các toán tử số nguyên:

+ : cộng

- : trừ

* : nhân

\ : chia nguyên bỏ phần thập phân

/ : chia và làm tròn

^ : luỹ thừa

mod : lấy phần dư

·Các toán tử số thực

+ : cộng

- : trừ

* : nhân

/ : chia và làm tròn

^ : luỹ thừa

c. Toán tử nối chuỗi &

Đây là toán tử cơ sở dùng để nối các chuỗi dữ liệu lại với nhau. Ví dụ trong dòng lệnh dưới đây

s = “Visual” &” “& “Basic”

biến chuỗi s sẽ có giá trị là “Visual Basic”.

Tương tự như lệnh gán chuỗi, khi chúng ta nối chuỗi với các biểu thức, VB sẽ tự động thực hiện việc chuyển kiểu dữ liệu chuỗi thành số trước rồi sau đó mới nối. Với dòng lệnh tiếp theo:

s = s & 1

Giá trị của biến s sau lệnh gán sẽ là “Visual Basic 1”

d. Toán tử so sánh

Như mọi ngôn ngữ lập trình khác, VB cũng sử dụng các toán tử so sánh như:

= : so sánh bằng

> : so sánh lớn hơn

>= : so sánh lớn hơn hay bằng

< : so sánh nhỏ hơn

<= : so sánh nhỏ hơn hay bằng

<> : so sánh khác

Giá trị kết quả của một biểu thức so sánh sẽ thuộc kiểu luận lý (True hay False). Khi cần kết nối các biểu thức so sánh lại với nhau chúng ta có thể dùng các toán tử luận lý And, Or.

II. HẰNG

Để khai báo một hằng, chúng ta dùng cấu trúc sau:

Const Tên_hằng [As <kiểu dữ liệu>] = <Biểu thức>

Ví dụ:

Const A = 3

Const B As Single = A/2

Đoạn lệnh trên định nghĩa hai hằng số, hằng số A có giá trị là 3, hằng số B kiểu số thực và có giá trị là 1.5.

III. CÁC CẤU TRÚC ĐIỀU KHIỂN

Cấu trúc điều khiển trong VB là tập hợp các lệnh rẽ nhánh, lệnh lặp… cho phép điều khiển tuần tự thực hiện của các lệnh trong chương trình.

Để thuận tiện theo dõi các cấu trúc lệnh điều kiện, chúng ta hãy cùng tìm hiểu các yêu cầu của bài toán Giải phương trình bậc I trong hình II.2 sau đây.

Màn hình ứng dụng Giải phương trình bậc 1 dưới đây có hai ô textbox (có tên txtHsA và txtHsB) để người dùng nhập các hệ số của phương trình bậc nhất.

Ô textbox thứ ba có tên txtNghiem sẽ được dùng để hiển thị nghiệm của phương trình.

·Khi người dùng nhấn nút Giải, chương trình sẽ kiểm tra tính hợp lệ của dữ liệu, nếu dữ liệu hợp lệ thì giải, ngược lại thì thông báo lỗi.

·Chức năng của nút TIếp sẽ xoá tất cả nội dung của các hộp văn bản trên màn hình; Sau đó đặt con trỏ vào hộp văn bản đầu tiên là Hệ số A.

·Trước khi Thoát, chương trình sẽ hỏi người dùng có thật sự muốn thoát hay không. Nếu muốn thì mới thoát.

Các câu yêu cầu trên đây đòi hỏi người lập trình phải biết các cấu trúc lệnh điều kiện để giải quyết. Chi tiết các cấu trúc lệnh này sẽ được trình bày dưới đây.

1. Các lệnh rẽ nhánh

Các lệnh rẽ nhánh cho phép kiểm tra một điều kiện. Tuỳ theo giá trị kết quả kiểm tra là đúng (True) hay sai (False) chương trình sẽ thực hiện các tập hợp lệnh khác nhau tương ứng.

a. Lệnh if

Cú pháp lệnh if do VB hỗ trợ gồm hai dạng chính sau đây:

If điều kiện Then

Tập hợp các lệnh

End If

Hay là:

If điều kiện Then

Tập hợp các lệnh 1

Else

Tập hợp các lệnh 2

End if

Vì VB không có khái niệm đầu và cuối và cuối một khối lệnh nên chúng ta thấy kết thúc mỗi lệnh if phải có từ khoá End If. Cú pháp thứ nhất của lệnh If sẽ kiểm tra xem giá trị của điều kiện là đúng hay sai. Nếu đúng thì chương trình sẽ thực hiện tập hợp các lệnh được khai báo. Cú pháp này không quan tâm trường hợp điều kiện có giá trị sai.

Khác với cú pháp thứ nhất, dạng lệnh If trong cú pháp thứ hai sẽ thực hiện tập hợp lệnh giữa ElseEnd If khi điều kiện có giá trị là sai.

Với điều kiện phức tạp, chúng ta có thể sử dụng lệnh If lồng nhau như trong chương trình của nút Giải trong bài toán GPTB1 dưới đây:

Private Sub Cmd_Giai_Click()

Dim fHesoA As Single, fHesoB As Single, fNghiem As Single

If (Txt_HesoA.Text = "" Or Txt_HesoB.Text = "") Then

MsgBox "Ban phai nhap day du cac he so"

Else

fHesoA = Val(Txt_HesoA.Text)

fHesoB = Val(Txt_HesoB.Text)

If fHesoA = 0 Then

MsgBox "He so A phai khac 0"

Txt_HesoA.SetFocus

Else

fNghiem = -fHesoB / fHesoA

Txt_Nghiem.Text = Format(fNghiem, "0.0")

End If

End If

End Sub

Ngoài những khái niệm cơ bản liên quan đến lệnh If đã trình bày trên đây, cần lưu ý những điểm đặc biệt sau:

·Điều kiện được dùng trong lệnh If thường phải là các biểu thức so sánh. Tuy nhiên có một số trường hợp điều kiện lại là một biểu thức số. Khi ấy, nếu giá trị của biểu thức là 0 sẽ tương ứng với trường hợp giá trị điều kiện sai (False) và ngược lại các giá trị khác 0 sẽ tương ứng với điều kiện đúng (True).

·Với cú pháp thứ nhất của lệnh If, nếu tập hợp lệnh chỉ có một lệnh chúng ta có thể dùng theo cú pháp

If <Điều kiện> Then <Lệnh>

·Trong một số trường hợp, để tránh dùng nhiều câu lệnh If … Else … End If lồng nhau, chúng ta có thể dùng một dạng khác của lệnh If có trong VB. Đó là:

If điều kiện 1 Then

Tập hợp các lệnh 1

ElseIf điều kiện 2 Then

Tập hợp các lệnh 2

ElseIf điều kiện n Then

Tập hợp các lệnh n

Else

Tập hợp các lệnh

End If

·Trong một số trường hợp để kiểm tra kiểu của các control, object chúng ta có thể dùng cú pháp sau:

If TypeOf ctrl Is <Kiểu> Then

b. Lệnh Select

Cấu trúc lệnh Select trong VB rất mạnh. Trong một số trường hợp, khi sử dụng lệnh Select thay thế lệnh If sẽ làm chương trình rõ ràng, dễ đọc hơn.

Cú pháp lệnh Select được trình bày sau đây:

Select Case <Biểu thức kiểm tra>

Case <Danh sách biểu thức 1>

[Khối các lệnh 1]

Case <Danh sách biểu thức 2>

[Khối các lệnh 2]

[Case Else

[Các lệnh của else]]

End Select

Lệnh Select sẽ tìm xem giá trị của biểu thức kiểm tra có thuộc tập các giá trị của danh sách biểu thức trong cấu trúc Case hay không? Nếu có, VB sẽ thực hiện tập hợp lệnh được khai báo tương ứng với cấu trúc Case này.

Danh sách biểu thức trong cấu trúc Case có thể chứa một hay nhiều biểu thức con cách nhau bằng dấu phẩy (,). Mỗi biểu thức con này có thể là:

·Một biểu thức (gồm giá trị hằng, biến, công thức):

Case 5, a, a + b

·Tập giá trị:

Case 5 to 10, a to b

·Biểu thức so sánh (Is <toán tử so sánh> biểu_thức)

Case Is > 10, Is <= a + b

·Ví dụ đoạn chương trình sau đây sẽ tính số ngày có trong tháng của một năm:

Select Case thang

Case 1, 3, 5, 7, 8, 10, 12

Songay = 31

Case 2

Select Case True

Case (nam mod 400 = 0) or ((nam mod 4 = 0) and (nam mod 100 <>0))

Songay = 29

Case Else

Songay = 28

End Select

Case 4, 6, 9, 11

Songay = 30

Case Else

MsgBox “Giá trị tháng không hợp lệ”

End Select

2. Các lệnh lặp

Cấu trúc lệnh lặp cho phép thực hiện lặp đi lặp lại nhiều lần một tập hợp lệnh nào đó của chương trình. Các cấu trúc lệnh lặp thường được sử dụng trong VB gồm:

·Do … Loop

·For … Next

·For Each … Next

a. Lệnh lặp For … Next

Cấu trúc lệnh For … Next cho phép ứng dụng lặp lại nhiều lần một tập hợp lệnh nào đó trong chương trình. Cú pháp của lệnh có dạng như sau:

For biến_đếm = gt_đầu To gt_cuối [Step bước]

Tập hợp lệnh của vòng lặp For

Next [biến_đếm]

Trong cú pháp của lệnh đòi hỏi biến_đếm phải là biến kiểu số đã được khai báo trước. Các thành phần gt_đầu, gt_cuối bước tương ứng phải có giá trị số.

Cac buoc thuc hien cua for

B1: Khởi tạo giá trị biến_đếm bằng gt_đầu.

B2: Kiểm tra biến_đếm có lớn hơn gt_cuối không? (trường hợp giá trị step âm sẽ kiểm tra ngược lại). Nếu lớn hơn thì VB sẽ thoát khỏi lệnh For.

B3: Nếu không, thực hiện các lệnh được khai báo trong For … Next.

B4. Thay đổi giá trị biến_đếm = biến_đếm + bước

B5: Lặp lại các bước 2, 3, 4

b. Lệnh lặp Do … Loop

Trong lệnh For … Next chúng ta thấy số bước lặp của lệnh khi được thực hiện là xác định. Số bước lặp này được tính dựa vào ba giá trị gt_đầu, gt_cuốibước. Tuy nhiên trong các ứng dụng thực tế, có những trường hợp mà ngay cả bản thân chúng ta - những người lập trình – cũng không biết được số bước cần lặp là bao nhiêu. Để giải quyết những trường hợp này bằng lệnh For … Next sẽ hết sức phức tạp, thay vào đó chung ta có thể dùng một cấu trúc lệnh lặp khác phù hợp hơn đó là Do … Loop. Lệnh Do … Loop sẽ cho phép thực hiện lặp một tập hợp lệnh với số lần không xác định trước mà chỉ phụ thuộc vào một điều kiện nào đó.

Phần nội dung dưới đây sẽ trình bày hai cú pháp chính của lệnh Doo … Loop, đó là: Do … WhileDo … Loop While.

Do While <điều kiện>

<Tập hợp lệnh>

Loop

Do

<Tập hợp lệnh>

Loop While <Điều kiện>

Cả hai cú pháp trên đây đều sẽ thực hiện lặp đi lặp lại tập hợp giữa Do và Loop cho đến khi điều kiện có giá trị Sai thì dừng lại. Điểm khác nhau giữa hai cấu trúc lệnh này là lệnh Do While … Loop sẽ kiểm tra giá trị điều kiện trước sau đó mới thực hiện lệnh, còn Do … Loop While sẽ thực hiện tập lệnh trước rồi mới kiểm tra điều kiện sau. Vì vậy, cú pháp thứ nhất của lệnh có thể sẽ không thực hiện lặp lần nào cả nhưng cú pháp thứ hai tối thiểu sẽ thực hiện tập hợp lệnh một lần.

c. Lệnh lặp For Each … Next

Có thể nói lệnh lặp For Each … Next tương tự như lệnh For … Next , nhưng lệnh này thường được sử dụng để duyệt các phần tử trong một tập hợp hay một mảng đối tượng.Khác với lệnh For … Next hoạt động chủ yếu dựa vào biến đếm, số bước lặp trong lệnh For Each … Next sẽ dựa vào số phần tử trong một tập hợp. Vì vậy, cấu trúc lệnh For Each … Next rất tiện dụng cho việc duyệt các tập hợp mà số phần tử không biết trước.

Dưới đây là cú pháp của lệnh For Each … Next

For Each <phần tử> In <tập hợp>

Tập hợp lệnh

Next <phần tử>

IV CHƯƠNG TRÌNH CON

1. Thủ tục

Thủ tục là một dạng chương trình con cho phép chúng ta khai báo tập hợp các lệnh tương ứng với một đơn vị xử lý nào đó mà đơn vị xử lý này không có giá trị trả về. Đây chính là điểm khác biệt giữa thủ tụchàm (một dạng khác của chương trình con sẽ được trình bày ở phần sau).

Có thể nói thủ tục sẽ thích hợp nhất để xây dựng những chương trình con đang chạy như PhucHoi đã được đề cập trên đây. Thật vậy, chúng ta thấy mục tiêu của chương trình con PhucHoi chủ yếu là thực hiện các lệnh để hiển thị hay ẩn các điều kiện trên màn hình chứ hoàn toàn không trả về một giá trị nào cả.

a. Khai báo thủ tục

Cú pháp để khai báo một thủ tục là:

[Private | Public] Sub <tên thủ tục> (các tham số)

Tập hợp lệnh

[Exit Sub]

Tập hợp lệnh

End Sub

Ý nghĩa của các từ khoá trong cú pháp này được trình bày như sau:

·Private: Thủ tục chỉ có thể được gọi thực hiện trong cùng màn hình giao tiếp (form), thư viện (module) hiện hành.

·Public: Thủ tục có thể được gọi thực hiện từ một màn hình, thư viện khác. Các khai báo thủ tục không chỉ ra phạm vi là Private hay Public sẽ có phạm vi mặc nhiên là Public.

·Sub … End Sub: là cặp từ khoá khai báo bắt đầu và kết thúc một thủ tục.

·Tên thủ tục: Cũng giống như tên biến, tên thủ tục là một chuỗi ký tự liên tục không trùng với các đối tượng khác trong cùng phạm vi.

Với các thủ tục xử lý biến cố của một đối tượng nào đó, tên của các thủ tục sẽ do chính VB tạo ra theo quy định

tênđốitượng_biếncố().

Vi du: button1_click().

·Các tham số: Danh sách tên các biến “hình thức” (còn thường được gọi là tham số hình thức) được sử dụng để giao tiếp dữ liệu với đơn vị chương trình gọi.

Khác với các ngôn ngữ lập trình khác, những thủ tục không có tham số trong VB cũng phải được khai báo có cặp ngoặc ().

·Exit Sub: Mặc nhiên thủ tục sẽ chấm dứt khi thực hiện đến lệnh End Sub. Tuy nhiên chúng ta cũng có thể dùng lệnh Exit Sub để thoát khỏi thủ tục khi cần thiết.

Vi du:

Thủ tục Thongbao() nhu sau:

Private Sub Thongbao()

. . .

. . .

MsgBox “Xin chao ban !”

End Sub

b. Gọi thực hiện thủ tục

Khi đã khai báo một thủ tục, chúng ta có thể gọi thực hiện thủ tục này trong phạm vi cho phép theo hai cách sau:

<Tên thủ tục> thamsố1, thamsố2,...

Call <Tên thủ tục> (thamsố1, thamsố2,...)

Ví dụ với thủ tục Thongbao() ta có thể gọi thực hiện như sau:

Thongbao

Hay: Call Thongbao()

Tuỳ theo các tham số hình thức lúc khai báo, khi gọi thực hiện thủ tục chúng ta phải truyền theo các thamsối (tham số thực) như trong mô tả cú pháp trên. Các tham số thực này có thể là một giá trị, một biến hay một biểu thứcVí dụ trong khai báo

Sub Dientich (bankinh As Single)

Thì mỗi khi gọi thực hiện, thủ tục sẽ được truyền vào một tham số thực kiểu Single được đại diện bởi một tên chung là bankinh. Khi ấy người lập trình có thể gọi thực hiện với các tham số thực khác như sau:

Vidu : truyen tham so theo gia tri

Call Dientich (3) ‘Tham so thuc la so 3

Call Dientich (r) ‘Tham so thuc la bien r

Trong trường hợp cần gọi thủ tục được khai báo Public, từ một màn hình giao tiếp khác, chúng ta cần chỉ ra tên của màn hình theo cú pháp:

<Tên màn hình>.<Tên thủ tục>...

3. Hàm

Cũng giống như thủ tục, hàm là một dạng chương trình con có thể nlhận vào các giá trị qua danh sách tham số hình thức, thực hiện các lệnh được khai báo, thay đổi các giá trị trong những tham số thực,... Tuy nhiên hàm có giá trị trả về còn thủ tục thì không. Một ví dụ thường thấy về hàm là những lệnh như Spr hay Chr. Đây chính là những hàm đã được xây dựng sẵn trong VB.

Khác với cú pháp khai báo một thủ tục, khai báo hàm sẽ bắt đầu và kết thúc bằng cặp từ khoá Function ... End Function. Ngoài ra, khi khai báo hàm chúng ta còn phải chỉ ra kiểu dữ liệu trả về của hàm.

Để khai báo hàm, chúng ta dùng cú pháp sau:

[Private | Public] Function <tên hàm> (các tham

số) As <Kiểu trả về>

Tập hợp lệnh

[Exit Function]

Tập hợp lệnh

End Function

Vd dưới đây sẽ minh hoạ cách khai báo và sử dụng hàm trong VB.

Function TinhChuVi(Canh1 As Single, Canh2 As Single, Canh3 As Single) As Single

Dim v As Single

v = (Canh1 + Canh2 + Canh3)

TinhChuVi = v

End Function

Để gọi thực hiện hàm, ta thấy thông thường một hàm khi được sử dụng sẽ thuộc vào những dạng sau:

·Tính giá trị và gán cho biến.

Biến = <Tên hàm> (thamsố1, thamsố2,...)

·Tham gia vào một biểu thức tính toán.

Biến = Biểu thức có chứa hàm

Trường hợp cần gọi thực hiện hàm nhưng không cần lấy giá trị trả về chúng ta có thể sử dụng cú pháp có dạng:

Call <tên hàm> (thamsố1, thamsố2,...)

4. Truyền tham số

Một đơn vị chương trình con dù là hàm hay thủ tục cũng thường cần được truyền vào những giá trị cần thiết để thực hiện. Việc truyền các giá trị cần thiết khi gọi thực hiện một chương trình con như vậy gọi là truyền tham số. Giống như các ngôn ngữ lập trình khác, truyền tham số trong VB cũng có hai loại là:

·Truyền tham trị

·Truyền tham biến

a. Truyền tham trị

Trong cách truyền tham trị, chỉ có bản sao của tham số thực được truyền cho tham số hình thức. Khi ấy mọi thay đổi giá trị của tham số hình thức thực chất chỉ ảnh hưởng đến bản sao được truyền chứ không thay đổi giá trị của tham số thực. Để truyền tham số theo dạng trị chúng ta phải dùng từ khoá ByVal trước khai báo các tham số hình thức tương ứng. Ví dụ hàm So_nto() dưới đây sẽ nhận vào một số nguyên thông qua tham số hình thức m, kiểm tra xem m có phải là số nguyên tố hay không và trả về giá trị True hay False tương ứng. Tham số hình thức m được khai báo ByVal nên việc truyền tham số khi sử dụng hàm So_nto() sẽ theo dạng truyền tham trị.

Function Songuyento(ByVal m As Long) As Boolean

Dim i As Integer, n As Integer

If m < 0 Then m = -m 'Kiem tra neu m am

'Kiem tra xem m>0 co phai la so nguyen to

If m = 1 Then

Songuyento = False

Else

n = m \ 2

For i = 2 To n

If (m Mod i = 0) Then Exit For

Next

If i <= n Then

Songuyento = False

Else

Songuyento = True

End If

End Function

b. Truyền tham biến

Để truyền tham số theo dạng tham biến chúng ta phải dùng từ khoá ByRef trước những khao báo tham số hình thức cần thiết. Mặc nhiên các tham số trong VB được truyền theo dạng tham biến, chính vì vậy các tham số hình thức không được khai báo với từ khoá ByRef hay ByVal sẽ được truyền theo dạng tham biến.

Khi truyền tham biến, mọi thao tác trên tham số hình thức đều tác động trực tiếp lên tham số thực. Có nghĩa là khi gọi thực hiện một ctrìh con có truyền tham biến thì các thay đổi gtrị trên tham số hình thức sẽ làm thay đổi gtrị của tham số thực. Ví dụ với hàm Songuyento() trên đây, nếu được khai báo là:

Function Songuyento(ByRef m As Long) As Boolean

Dim i As Integer, n As Integer

If m < 0 Then m = -m 'Kiem tra neu m am

'Kiem tra xem m>0 co phai la so nguyen to

If m = 1 Then

Songuyento = False

Else

n = m \ 2

For i = 2 To n

If (m Mod i = 0) Then Exit For

Next

If i <= n Then

Songuyento = False

Else

Songuyento = True

End If

End Function

Khi đó, chúng ta có thể kiểm tra một giá trị k có phải số nguyên tố hay không như sau:

Dim k As Long, kt As Boolean, thongbao As String

k = -6

kt = Songuyento(k)

If kt = True Then

thongbao = str(k) & “ la so nguyen to”

Else

thongbao = str(k) & “ khong la so nguyen to”

End If

MsgBox thongbao

Kết quả thực hiện của các dòng lệnh trên đây sẽ là “6 khong la so nguyen to” thay vì “-6 khong la so nguyen to”. Kết quả này không hiển thị đúng giá trị k lúc đầu. Đó là vì giá trị tham số thực k đã bị thay đổi trong quá trình thực hiện hàm Songuyento().

c. Tham số tuỳ chọn

Trong thủ tục hay hàm, chúng ta có thể khai báo một tham số là tuỳ chọn hay bắt buộc. Khi một tham số là tuỳ chọn, chúng ta có thể truyền hay không truyền giá trị cho nó khi gọi thực hiện thủ tục hay hàm.

Đoạn chương trình ví dụ tính giá trị phân số sau sẽ minh hoạ việc dùng tham số tuỳ chọn trong VB:

Function Phanso(p As Integer, Optional q As Integer) As Single

If q = 0 Then

Phanso = p

Else

Phanso = p / q

End If

End Function

‘Tinh tong hai phan so

Dim a As Single, b As Single, tong As Single

a = Phanso(3)

b = Phanso(2, 3)

tong = a + b

MsgBox tong

Khi không được truyền giá trị, tham số tuỳ chọn sẽ có giá trị mặc nhiên của kiểu dữ liệu khai báo. Khi ấy, những tham số tuỳ chọn có kiểu Variant sẽ có giá trị là rỗng. Trong trường hợp này, chúng ta có thể dùng hàm IsMissing() để xác định xem một tham số tuỳ chọn kiểu Variant có được truyền giá trị hay không.

Ngoài ra, để tránh giá trị rỗng đối với những tham số tuỳ chọn, chúng ta có thể mô tả giá trị mặc nhiên của tham số tuỳ chọn như trong hàm tính giá trị phân số được định nghĩa lại dưới đây.

Function Phanso(p As Integer, Optional q As Integer = 1) As Single

Phanso = p / q

End Function

d. Mảng tham số

Số lượng tham số được khai báo và được truyền khi thực hiện thường là bằng nhau và cố định. Sử dụng từ khoá ParamArray cho phép chúng ta khai báo một chương trình có số lượng tham số được truyền tuỳ ý. Cú pháp khai báo mảng tham số như sau:

ParamArray <tên mảng tham số> () [As Variant]

Các lưu ý khi khai báo mảng tham số:

·Mảng tham số phải được khai báo cuối cùng, sau các tham số hình thức khác.

·Phải là mảng có kiểu Variant

·Dùng vòng lặp For Each … Nextđể duyệt mảng tham số.

Đoạn chương trình ví dụ sau sẽ minh hoạ cách dùng mảng tham số

Function Tong(ParamArray mang ()) As Long

Dim i, s As Long

For Each i In mang

s = s + i

Next

Tong = s

End Sub

‘Gọi thực hiện

Dim S As Long

S = Tong(1, 3, 5, 7, 8)

S = Tong( 2, 4, 6)

V. CÁC HÀM, THỦ TỤC THƯỜNG DÙNG

1. Lệnh MsgBox

Lệnh MsgBox là một trong những lệnh thường được chương trình sử dụng để thông báo hay hỏi đáp với người sử dụng. Tuỳ theo mục tiêu gì, chúng ta sẽ có cú pháp sử dụng của lệnh khác nhau. Nếu lệnh được sử dụng để hiển thị một chuỗi thông báo, hiển thị giá trị một biểu thức,… và hoàn toàn không có giá trị trả về thì lệnh sẽ được sử dụng như là một thủ tục hệ thống theo cú pháp thông thường sau đây:

MsgBox <Thông báo> [, <Loại thông báo> [, Tiêu đề]]

Trong cú pháp sử dụng này, thành phần Thông báo chính là chuỗi nội dung sẽ hiển thị của lệnh. Giá trị của thành phần Loại thông báo sẽ quy định hình ảnh và những nút sẽ hiển thị trong thông báo.

Các hằng số liên quan đến hình ảnh được hiển thị gồm:

vbQuestion [IMG]file:///C:/DOCUME%7E1/ADMINI%7E1/LOCALS%7E1/Temp/msohtmlclip1/01/clip_image002.jpg[/IMG]

vbCritical [IMG]file:///C:/DOCUME%7E1/ADMINI%7E1/LOCALS%7E1/Temp/msohtmlclip1/01/clip_image004.jpg[/IMG]

vbInformation [IMG]file:///C:/DOCUME%7E1/ADMINI%7E1/LOCALS%7E1/Temp/msohtmlclip1/01/clip_image006.jpg[/IMG]

vbExclamation [IMG]file:///C:/DOCUME%7E1/ADMINI%7E1/LOCALS%7E1/Temp/msohtmlclip1/01/clip_image008.jpg[/IMG]

Hằng số quy định các nút sẽ hiển thị gồm: vbOKOnly, vbOKCancel, vbYesNoCancel, vbYesNo, vbAbortRetryIgnore.

Tiêu đề là chuỗi ký tự sẽ xuất hiện trên thanh tiêu đề của cửa sổ thông báo.

Ví dụ để hiển thị giá trị của biến k chúng ta có thể dùng câu lệnh như sau:

MsgBox “k= “ & Format(k, “0.0”) & vbCrLf & “Khong hop le! Bien k phai khac 0”, vbOKOnly + vbCritical, “Thong bao loi”

[IMG]file:///C:/DOCUME%7E1/ADMINI%7E1/LOCALS%7E1/Temp/msohtmlclip1/01/clip_image010.jpg[/IMG]

Hình II.6. Màn hình hiển thị của lệnh MsgBox

Trong trường hợp cần hỏi đáp với người sử dụng, chúng ta có thể dùng lệnh này theo dạng hàm theo cú pháp:

Dim TraLoi As Integer

TraLoi = MsgBox(Thông báo, Loại, Tiêu đề)

Kết quả trả về trong biến TraLoi sẽ chỉ là số của nút mà người dùng đã nhấn. Có thể dùng chỉ số các nút này là các hằng số vbOK, vbYes, vbCancel.

2. Lệnh InputBox

Hàm InputBox này sẽ hiển thị một hộp thoại để người dùng nhập giá trị cho một biến nào đó của chương trình. Đây là một trong những lệnh nhập xuất cơ sở của VB. Cú pháp của hàm như sau:

InputBox (Thông báo, Tiêu đề) As String

Ví dụ để yêu cầu người sử dụng nhập giá trị cho một biến n trong chương trình chúng ta có thể ra lệnh

n = InputBox(“Nhap gia tri so n”,”Nhap lieu””)

3. Lệnh xử lý chuỗi

a. Hàm Len

Hàm này dùng để tính chiều dài của một chuỗi nào đó. Cú pháp sử dụng của hàm có dạng sau:

dodai = Len(chuoi)

trong đó dodai phải là một biến kiểu số nguyên đã được khai báo. Câu lệnh dưới đây sẽ duyệt qua từng ký tự của chuỗi s:

Dim I As Integer

For I = 1 to Len(s)

‘Xu ly tren tung ky tu cua chuoi s

Print Mid(s, I, 1)

Next

b. Hàm InStr

Hàm InStr dùng để xem một chuỗi s có chứa chuỗi con s1 hay không. Nếu tìm thấy, hàm sẽ có giá trị là vị trí được tìm. Ngược lại hàm sẽ có giá trị là 0. Cú pháp sử dụng của hàm có dạng sau:

Dim tim As Integer

tim = InStr([vt = 1,] chuỗi s, chuỗi con s1, [tuỳ chọn = vbBinaryCompare]) As Integer

Trong đó:

·vt là một thành phần có thể có hay không. Giá trị của thành phần này là vị trí bắt đầu thực hiện việc tìm kiếm trong chuỗi s. Nếu chúng ta không chỉ ra thành phần này khi sử dụng InStr, VB sẽ thực hiện tìm từ đầu chuỗi (vt là 1).

·Tuỳ chọn tìm cũng là một thành phần có thể dùng hoặc không. Khi được sử dụng thành phần này có thể sẽ là một trong những giá trị sau:

vbTextCompare: Không phân biệt chữ hoa hay thường .

vbBinaryCompare: So sánh có phân biệt hoa thường.

vbUseCompareOption: Dùng chế độ hiện hành được đặt của hệ thống.

Ví dụ:

Dim s As String, s1 As String

s = “Chuong trinh Visual Basic 1”

s1 = “Visual Basic”

If InStr(s, s1, vbTextCompare) > 0 Then

MsgBox “Tim thay s1 trong s”

End If

c. Lệnh Replace

Lệnh Replace dùng để tìm và thay thế chuỗi ký tự sTim có trong chuỗi s bằng chuỗi thay thế sThayThe. Cú pháp của lệnh có dạng sau:

Replace(s, sTim, sThayThe [, vị trí đầu = 1] [, số lần thay thế = 0] [, tuỳ chọn = vbBinaryCompare]) As String

Mặc nhiên số lần thay thế có giá trị là 0, khi ấy hàm sẽ thay thế tất cả chuỗi sTim bằng sThayThe có trong s. Kết quả trả về là chuỗi đã được thay thế.

d. Các hàm trích chuỗi

Hàm Left(chuỗi s, n) As String

Hàm Right(chuỗi s, n) As String

Hàm Mid(chuỗi s, bắt đầu, [n]) As String

Trong cú pháp các hàm trên, than số n chính là số ký tự cần trích. Với hàm Mid, nếu tham số này được bỏ qua thì chuỗi kết quả trả về sẽ được trích từ vị trí bắt đầu đến cuối chuỗi s.

e. Các lệnh cắt khoảng trắng

Cắt các khoảng thừa bên trái của chuỗi s:

LTrim(chuỗi s)

Cắt các khoảng thừa bên phải của chuỗi s:

RTrim(chuỗi s)

Cắt các khoảng thừa bên trái và bên phải của chuỗi s:

Trim(chuỗi s)

f. Các hàm định dạng

Đổi chuỗi s thành chuỗi chữ hoa

Hàm UCase(chuỗi s)

Đổi chuỗi s thành chuỗi chữ thường:

Hàm LCase(chuỗi s)

Đổi biểu thức thành dạng chuỗi có định dạng

Hàm Format(<biểu thức s>, chuỗi định dạng)

Ví dụ: hàm Format(10, “0.0”) sẽ trả về chuỗi “10.0”

4. Lệnh xử lý dữ liệu ngày tháng

a. Lệnh gán giá trị

Với biến d được khai báo là có kiểu dữ liệu ngày tháng, chúng ta có thể khởi tạo giá trị cho d bằng những lệnh sau:

Dim As Date

'Khoi tao d bang ngay gio hien tai:

d = Now

'Khoi tao d bang ngay hien tai:

d = Date

'Khoi tao d bang gia tri ngay thang:

d = #12/24/2000#

'Khoi tao d bang 3 gia tri ngay, thang, nam:

d = DateSerial(nam, thang, ngay)

b. Lệnh xử lý ngày tháng

Lấy riêng giá trị ngày của d

Hàm Day(d) As Variant(Integer)

Lấy riêng giá trị tháng của d

Hàm Month(d) As Variant(Integer)

Lấy riêng giá trị năm của d

Hàm Year(d) As Variant(Integer)

Tính thứ trong tuần của ngày d

Hàm WeekDay(d)

(1 = vbSunday, 2 = vbMonday,...)

Cộng giá trị ngày d với k(tháng, ngày, tuần,...)

Hàm DateAdd(“Đơn vị”, k, d) As Date

(Đơn vị được dùng có thể là:

“d”: tương ứng với ngày

“w”: tương ứng với tuần

“m”: tương ứng với tháng

“yyyy”: tương ứng với năm

Ví dụ dưới đây sẽ sử dụng các hàm về ngày tháng trong VB để xác định sinh nhật lần thứ n của bạn là thứ mấy trong tuần.

Dim d As Date, d1 As Date, n As Integer

Dim s As String, thu As String

s = InputBox("Nhap ngay sinh cua ban", "Nhap thong tin")

n = InputBox("Nhap n", "Nhap thong tin")

d = CDate(s)

d1 = DateAdd("yyyy", n, d)

Select Case Weekday(d1)

Case 1

thu = "Chu Nhat"

Case 2

thu = "Thu Hai"

...

Case 7

thu = "Thu Bay"

End Select

MsgBox "Sinh nhat thu " & Str(n) & " cua ban la ngay " & thu

Bạn đang đọc truyện trên: Truyen2U.Pro

#hydnl