THỦ THUẬT TRONG OFFICE (9)

Các mẹo vặt khi lập trình VBA (2)

Nguyễn Phương Thảo - 525 - Điện Biên - Thị xã Yên Bái

Trung tâm Dạy nghề và Phổ cập Tin học Miền núi ABC

Khi xây dựng các đề án với Visual Basic For Application bạn phải chia các công việc nhập, tính toán, xuất sao cho càng rõ ràng, rành mạch càng tốt. Các công thức dùng cho nhập và xuất tôi đã trình bày ở bài trước, còn phần quan trọng là phải viết phần tính toán, trung tâm xử lý một chương trình Visual Basic For Application.

Thông thường với Visual Basic các thủ tục được tiến hành tuần tự theo các dòng mà bạn lập trình. Nhưng nhiều khi lại tuỳ vào một điều kiện mà bạn có thể xử lý A, hay xử lý B, hoặc lặp đi lặp lại một xử lý C nào đó. Ta phải nghiên cứu các cấu trúc công thức để hiểu. Một số cấu trúc thường gặp trong Visual Basic tôi chỉ nói qua, nhưng cấu trúc nào không có ở Visual Basic tôi xin phép được nói sâu hơn một chút.

Visual Basic For Application xử lý có hơi khác so với Visual Basic ở một số cấu trúc. Trước tiên ta hãy liệt kê câu trúc hay sử dụng lập trình ra đã. Nếu bạn đã quen với Visual Basic bạn có thể bỏ qua, nếu bạn mới làm quen với Visual Basic bạn nên xem kỹ phần này. Trong bài viết, để người đọc dễ hiểu tôi đặt tên biến hơi dài. Khi lập trình bạn nên đặt ngắn gọn dễ hiểu, dễ nhớ để rút ngắn thời gian.Các biến bạn nên đặt tên gợi nhớ bằng Tiếng Việt không dấu để tiện kiểm tra. Đừng thể hiện bằng cách đặt tên biến bằng từ Anh nếu bạn không thạo tiếng Anh lắm. Những nhà lập trình gỏi thường đặt tên biến bằng từ Việt, họ chỉ đặt bằng từ Anh khi bí từ hoặc khi copy đoạn mã nguồn từ các chương trình mẫu của Microsoft.

1. Cấu trúc IF THEN ELSE (Nếu... thì.... ngược lại)

Điều kiện là một biến logic đúng sai. Nếu phức tạp bạn nên tạo một biến logic để đặt vào cấu trúc. Đừng đưa cả biểu thức logic làm điều kiện, vì đó là kiểu cách lập trình rối, nếu quen sẽ không làm được việc lớn.

IF <Điều kiện> THEN

Công việc A - Là công việc sẽ thực hiện khi điều kiện đúng.

ELSE

Công việc B - Là công việc sẽ thực hiện khi điều kiện sai.

END IF

Tuy nhiên bạn có thể sử dụng hàm IIF ( Điều kiện, Giá trị khi điều kiện đúng, Giá trị khi điều kiện sai) để gán giá trị cho một biến.

Ví dụ: KetQuaThi = IIF(DuDiemVaKhongBiLiet, "Đỗ", "Trượt")

Đôi khi bạn có thể lồng vào trong cấu trúc IF dạng ElseIF (Lưu ý viết liền)

Ví dụ:

Gioi = (Tongdiem>=8)

Kha = (TongDiem>=6.5) AND (TongDiem<8)

TB = (TongDiem>=5) AND (TongDiem<6.6)

Kem = (TongDiem<5)

IF Gioi Then

Thuong = "Xe đạp"

ELSEIF KHA THEN

Thuong="Cặp sách"

ELSEIF TB THEN

Thuong = "Trông nhà"

ELSE

Thuong = "Ăn đòn"

END IF

2. Cấu trúc SELECT CASE (Chọn trường hợp)

SELECT CASE <Điều kiện>

CASE Giá trị 11, giá trị 12..., giá trị 1n

Công việc A1 - Là công việc sẽ thực hiện khi điều kiện bằng các giá trị trên

CASE Giá trị 21, giá trị 12..., giá trị 2n

Công việc A2 - Là công việc sẽ thực hiện khi điều kiện bằng các giá trị trên

.....

CASE Giá trị m1, giá trị m2..., giá trị mn

Công việc Am - Là công việc sẽ thực hiện khi điều kiện bằng các giá trị trên

CASE ELSE

Công việc B - Là công việc sẽ thực hiện khi điều kiện khác tất cả giá trị trên

END SELECT

Trong đó điều kiện là một biến. Các giá trị liệt kê theo từng trường hợp mà làm các công việc khác nhau.

Nhưng ta có thể không liệt kê ra trong các trường hợp bằng dòng CASE như trên mà có thể dùng một số từ khoá sau:

CASE IsNull trường hợp điều kiện không có giá trị.

Case Is >100 trường hợp điều kiện là số >100

Case 100 to 200 trường hợp điều kiện là số từ 100 - 200

Bạn có thể sử dụng hàm CHOOSE nếu điều kiện của bạn là các số nguyên dương để gán giá trị cho biến ví dụ:

GiaiThuong = CHOOSE (KetQua, "Đi Mỹ", "Đi Úc", "Đi Đài Loan")

Tuỳ theo biến kết quả trên phải là các số nguyên dương 1, 2, 3... mà biến Giải thưởng nhận được giá trị tương ứng.

Bạn cũng có thể sử dụng hàm Switch để bật chuyển cho nhanh theo công thức sau khi thiết kế hàm.

Function ThuDo (Nuoc as String) as String

Bien= Switch(Bthức 1, Giá trị 1,Biểu thức 2, Giá trị 2......Biểu thức n, Giá trị n)

Ví dụ:

Function ThuDo (Nuoc as String) as String

KetQua = SWITCH (Nuoc="Mỹ", "Oa sinh tơn", Nuoc="Trung Quốc", "Bắc Kinh"...., Nuoc ="Campuchia", "Pnôm pênh")

ThuDo = KetQua

End Function

3. Cấu trúc lặp FOR EACH Biencon IN BienTongHop NEXT

FOR EACH Biencon IN BienTongHop

Công việc cho biến con đại diện cho tất cả các phần tử trong biến tổng hợp

NEXT

Biến con là 1 phần tử của biến tổng hợp là một tập hợp. Như ô với vùng, như ký tự với chuỗi, như nút lệnh với thanh công cụ....

Khi lặp đi lặp lại đối với từ phần tử cho đến hết các phần tử ta đưa công việc vào trong vòng lặp để Visual Basic For Application thực hiện lặp lần lượt tới từng phần tử thông qua một tên biến đại diện. Ví dụ:

Function TONGLAPPHUONG(VungDL)

Dim KetQua, OHienTai, OHienTaiLaSo

FOR EACH OHienTai IN VungDL

OHienTaiLaSo = IsNumeric(OHienTai)

IF OHienTaiLaSo Then

KetQua = KetQua + OHienTai^3

End If

Next

TONGLAPPHUONG = KetQua

End Function

Thông thường đối với các ô của Excel thường sử dụng các hàm sau để kiểm tra dạng dữ liệu trong biến.

IsDate (Biến) - Kiểm tra xem biến có phải dạng ngày không.

IsNumeric (Biến) - Kiểm tra xem biến có phải dạng số không.

IsString (Biến) - Kiểm tra xem biến có phải dạng chuỗi không.

IsArray (Biến) - Kiểm tra xem biến có phải dạng mảng không.

IsMissing (Biến) - Kiểm tra xem biến có được truyền từ ngoài vào không.

IsNull (Biến) - Kiểm tra xem biến đã nhập dữ liệu chưa.

Trong vòng lặp có thể sử dụng Exit For để chấm dứt vòng lặp khi ta kiểm tra điều kiện.

3. Cấu trúc lặp FOR ........ NEXT

For Biến_đếm = Giá trị đầu TO Gía trị cuối (STEP)

Công việc cho các trường hợp có liên quan đến biến đếm.

Next

Vòng lặp này ta đã quá quen thuộc trong Visual Basic, nó lặp đi lặp lại các công việc một số lần xác định trừ khi ta cho nhảy ra khỏi vòng lặp bằng Exit For. Bạn có thể gặp đầy rẫy ví dụ của nó.

4. Vòng lặp không xác định:

Dùng để lặp lại chừng nào (While) điều kiện vẫn đúng, hay lặp lại cho đến khi (Until) điều kiện đúng. Vòng lặp cũng quá quen thuộc trong Visual Basic.

Do [{While | Until} điều_kiện]

Các công việc A

[Exit Do]

Các công việc B

Loop

Hoặc có thể dùng:

Do

Các công việc A

[Exit Do]

Các công việc B

Loop [{While | Until} điều kiện]

Vòng lặp sau tương tự, nhưng trong Visual Basic For Application:

While điều kiện

Các công việc A

Wend

Các công việc sẽ thực hiện khi điều kiện đang đúng. Điều này bắt buộc phải cẩn thận vì không có dạng Exit khỏi vòng lặp.

Sau khi cấu trúc đã hoàn thành, việc còn lại là bạn hãy xác định từng công việc một. Nếu bạn chưa quen với cách thảo chương lập trình thì hãy xác định công việc và thực hiện thu Macro cho công việc đó.

Macro là một chu trình, khi ta thực hiện Visual Basic sẽ tự viết hộ mình phần thảo chương này. Ta chỉ việc kiểm tra, biên tập và copy dán vào các cấu trúc ở trên.

Bạn hãy chọn Tools/Macro/RecordNewMacro... đánh tên Macro. Rồi thu bằng cách Click vào nút Record. Thu xong nhớ click vào Stop. Khi chuyển sang Visual Basic For Application ta sẽ có một Module và có một Macro dạng:

Sub CONG_VIEC_A()

Nội dung công việc

End Sub

Việc tiếp theo quá dễ, bạn chỉ copy phần nội dung công việc và dán vào cấu trúc lập trình của mình.

Tuy nhiên, tôi đọc một bài viết trên PCWorld số tháng..../2001 của ... có hướng dẫn cách thu Macro để tự động hoá công việc. Tôi thấy cách làm đó chỉ phù hợp với những người chưa từng lập trình Visual Basic For Application. Khi thu như vậy, ta sẽ thấy dữ liệu được Visual Basic For Application viết ra rất nhiều. Điều quan trọng là ta phải hiểu, để bỏ những dòng không cần thiết. Nếu công việc lặp đi lặp lại (Ví dụ như tìm thay thế lần lượt dãy ký tự a1, a2, a3..., bằng dãy ký tự b1, b2, b3.... tương ứng nào đó) thì tốt nhất ta hãy khai báo thành mảng Array rồi viết công việc vào vòng lặp tương ứng với từng việc thay đó, chứ không nên làm theo kiểu ghi Macro như bài báo trên, dung lượng của phần code Visual Basic sẽ lớn lên rất nhiều và khó kiểm soát.

Sub ThayThe(TuTim As String, TuThay As String, CoFon As Boolean, FontTim As String, FontThay As String, DamNghieng As Byte)

'Lệnh thay thế TuTim bằng TuThay. Có thể dùng để thay cả FontTim thành FontThay (Thay Font chữ) để bạn có thể áp dụng tương tự như chuyển mã từ VNI hoặc ABC sang UNICODE chẳng hạn...

If IsMissing(CoFon) Then

'Nếu không truyền biến CoFon thì đặt luôn biến bằng False

CoFon = False

End If

If CoFon = True Then

'Nếu tìm thay có thay đổi FonChu thì dọn dẹp

Selection.Find.ClearFormatting

Selection.Find.Font.Name = FontTim

Selection.Find.Replacement.ClearFormatting

With Selection.Find.Replacement.Font

.Name = FontThay

If IsMissing(DamNghieng) Then

'Nếu không truyền biến đậm nghiêng thì đặt bằng 1

DamNghieng = 1

End If

Select Case DamNghieng

'Trường hợp khác tuỳ giá trị của biến DamNghieng thì đặt trạng thái đậm nghiêng tương ứng

Case 1

.Bold = False

.Italic = False

Case 2

.Bold = True

.Italic = False

Case 3

.Bold = False

.Italic = True

Case 4

.Bold = True

.Italic = True

End Select

End With

End If

If IsMissing(FontTim) Or IsMissing(FontThay) Then

'Nếu không truyền biến FontTim và FontThay thì đặt ngầm định

FontTim = ".VnTime"

FontThay = "Times New Roman"

End If

'Tiến hành đặt vào các giá trị cho hộp thoại

With Selection.Find

.Text = TuTim

.Replacement.Text = TuThay

.Forward = True

.Wrap = wdFindContinue

If CoFon = True Then

.Format = True

Else

.Format = False

End If

.MatchCase = False

.MatchWholeWord = False

.MatchWildcards = False

.MatchSoundsLike = False

.MatchAllWordForms = False

End With

Selection.Find.Execute Replace:=wdReplaceAll

'Thông báo ở thanh trạng thái

StatusBar = "Đang thay chữ " + TuTim + " bằng chữ " + TuThay

End Sub

Sub ChuyenMa()

Dim x As Integer

x = Windows.Count 'Đếm số cửa sổ tài liệu

If x = 0 Then 'Nếu không có cửa sổ tài liệu, thì thôi luôn

Exit Sub

End If

Dim timt, thay

Dim TimChu, ThayChu As String

Khai báo mảng về các ký tự tìm (Ví dụ dưới đây là mảng ký tự của VietDos- TuVi) và mảng ký tự thay là mảng ABC-TCVN3).

timt = Array(" ", "à", "á", "Õ", "ä", "ã", "ð", "è", "é", "©", "ë", "¨", "ê", "«", "ª", "®", "¬", "­", "ì", "í", "¸", "ï", "î", "ò", "ó", "÷", "ö", "õ", "ô", "°", "¯", "µ", "±", "²", "½", "¶", "¾", "þ", "·", "Þ", "ù", "ú", "ø", "ü", "û", "ß", "×", "Ñ", "ñ", "Ø", "æ", "Ï", "ý", "Ü", "Ö", "Û", "å", "¢", "¡", "£", "Æ", "Ç", "â", "¥", "¤", "§", "¦", "ç", "-")

thay = Array(" ", "µ", "¸", "¹", "¶", "·", "®", "Ì", "Ð", "Ñ", "Î", "Ï", "ª", "Ò", "Õ", "Ö", "Ó", "Ô", "×", "Ý", "Þ", "Ø", "Ü", "ß", "ã", "ä", "á", "â", "«", "å", "è", "é", "æ", "ç", "¬", "ê", "í", "î", "ë", "ì", "ï", "ó", "ô", "ñ", "ò", "­", "õ", "ø", "ù", "ö", "÷", "ú", "ý", "þ", "û", "ü", "¨", "»", "¾", "Æ", "¼", "½", "©", "Ç", "Ê", "Ë", "È", "É", " ")

'Tuy nhiên, bạn có thể sử dụng bảng Code bằng số cho mảng nếu bạn không gõ được các ký tự của mảng trên. Dùng các hàm CHAR hay CHARW để chuyển code số thành ký tự.

If ActiveWindow.View.SplitSpecial = wdPaneNone Then

ActiveWindow.ActivePane.View.Type = wdNormalView

Else

ActiveWindow.View.Type = wdNormalView

End If

Selection.WholeStory

'Chọn toàn bộ tài liệu, chuyển sang một Font bất kỳ để cho dễ.

Selection.Font.Name = ".VnArial"

Selection.Font.Size = 16

For i = 1 To 68

'Thực hiện thay lần lượt từng ký tự thuộc tiếng Việt của bảng mã nguồn thành mã gốc tương ứng

TimChu = timt(i)

ThayChu = thay(i)

Call ThayThe(TimChu, ThayChu, True, ".VnArial", ".VnTime", 1)

Next

'Chuyển lên đầu văn bản

Selection.HomeKey Unit:=wdStory

Selection.TypeParagraph

Selection.TypeParagraph

'Đánh lên dòng thông báo

Selection.TypeText Text:="Người dịch: Nguyễn Phương Thảo - Trung tâm Tin học ABC - Số 525 - Đường Điện Biên - Thị xã - Yên Bái - Mailto: fthaoabc@yahoo.com"

End Sub


PcLeHoan 1996 - 2002
Mirror : http://www.pclehoan.com
Mirror : http://www.lehoanpc.net

Mirror : http://www.ktlehoan.com