S DNG CÔNG C LP TRÌNH MACRO VBA
XÂY DNG CÁC TIN ÍCH X VĂN BN
USING THE MACRO VBA TO CREATE WORD PROCESSING UTILITIES
PHAN HUY KHÁNH
Trường Đại học Bách khoa, Đại học Đà Nẵng
TÓM TT
Sử dụng công cụ vĩ lệnh (macro) VBA (Visual Basic for Application) trong hệ thống phần mềm
MSOffice, chúng tôi đã xây dựng một b sưu tập c trình tiện ích giúp giải quyết nhanh
chóng và hiệu quả nhiều vấn đề đặt ra trong quá trình thực hiện các đề tài nghiên cứu khoa
học vxtiếng Vit: sắp xếp văn bản, chuyển đổi dạng thức văn bản, chèn nghĩa tương
đương trong các từ điển đa ngữ, gõ nhanh gõ tắt văn bản tiếng Việt, v.v… Hệ thống được xây
dựng theo ớng mở, một mt góp phần nâng cao chất lượng đào tạo, một mt tạo ra môi
trường nghiên cứu khoa học về xử lý ngôn ngtại khoa Công nghệ Thông tin & Điện tử Viễn
thông, tờng Đại học Bách khoa, Đại học Đà Nẵng.
ABSTRACT
This paper presents the use of the macro VBA (Visual Basic for Application programming)
within the preeminent features of MSOffice software, in order to create a collection of utility
programs to solving quickly and effectively most of the problems occured in the realization of
our research projects: conversion of any codes systems, conversion of any texts formats,
automatic insertion of the equivalent meanings in the multiligual dictionaries, increasing the
speed of editing for the Vietnamese documents, etc. Orienting toward the open sources
method, our solution allows not only to enhance the training for IT human resources but also
to provide the R&D environment for the language processing at our Faculty of IT.
T khoá: Vĩ lnh macro VBA, trình tin ích, chuyển đi mã, chuyển đổi dng thc văn bản,
x lý văn bản, từ điển đa ngữ, mã ngun m.
1. ĐẶT VẤN ĐỀ
Ngôn ng BASIC (viết tt ca Beginner’s All-purpose Symbolic Instruction Code) là
ngôn ng lp trình bc cao do J. Kemeny Th. Kurtz đề xut t những năm 1960 tại trường
Đại hc Dartmouth, Hoa K [1] [10]. Nhờ tính năng dễ hc, d lp trình, BASIC nhanh chóng
được ci biên, phát trin i đặt thành nhiu phiên bn trên các ng máy tính khác nhau
như TinyBASIC, MicrosoftBASIC, CBASIC, BASICA, GW-BASIC, TrueBASIC… Tm
1988, A. Cooper đưa ra ý tưởng phát trin BASIC thành ngôn ng lp tnh trc quan (visual
programming language) và người ta gi A. Cooper là cha đẻ ca Visual Basic (viết tt VB)
[7]. Hin nay, VB mt trong nhng ngôn ng được s dng ch yếu trong môi trường
Windows. VB rt phong phú v câu lnh tkhóa. Thư viện VB chứa ng trăm m cho
phép người s dng (NSD) phát trin d dàng ng dng trong các giao diện đồ ho GUI
(Graphical User Interface). Khi lp trình VB, NSD thiết kế các giao din và viết lnh x
các đối tượng nhìn thấy được trên các giao din này. VB hai dng s dng khác
VBScript VBA (Visual Basic for Application). VBScript được dùng cho Windows c
ng dụng trên Internet. VBA đưc s dng trong MSOffice (Word, Excel, Access, Project,
v.v…) [8] [9] để to ra các vĩ lệnh tđộng hóa. th nói phương pháp lp trình vĩ lệnh đã
nâng cao hiu qu s dng ca các trình MSOffice.
Nh nhng tính năng ưu việt ca lp trình vĩ lệnh VBA trong môi trường Windows, t
năm 1996, chúng i đã s dng VBA để xây dng các trình tin ích s dụng trong các đề tài
nghiên cu khoa hc thuc lĩnh vực x ngôn ng và x lý tiếng Vit [2] [3] [4] [5] [6].
Tiếp theo đây, chúng i sẽ trình bày mt s trình tin ích ch yếu phc v nâng cao tính
năng soạn thảo văn bản như chuyn , nhanh, gõ tt, sp xếp, định dạng văn bn…, phc
vsưu tp d liu chèn nghĩa tiếng Việt tương đương cho các từ điển đa ngữ đơn ng,
chuyển đổi dng thc d liu t RTF (Rich Text Format) sang XML (eXtensible Markup
Language) hay sang cơ sở d liu quan hệ, v.v… Để d theo dõi, trước hết chúng tôi s tnh
bày cách to ra các vĩ lnh VBA t mt ng dng MSOffice.
2. XÂY DNG CÁC TRÌNH TIN ÍCH
2.1 To tđộng vĩ lnh VBA trong mt ng dng MSOffice
Trong khi son thảo văn bản vi Winword, hoc thao tác bng tính vi Excel, hoc to ra
các trang trình din vi PowerPoint…, NSD th to ra các vĩ lnh mt cách tđộng hoc
như cách lập trình thông thường. Đó là các đoạn chương trình con (sub-program) có dng:
Sub macro-name(arg-list)
Dòng chú thích (comment line)
Các câu lnh VBA (macro commands/instructions)
End Sub ’macro-name
Sau t khoá Sub (chđậm) là tên ca vĩ lệnh do NSD tđặt tu ý. Mi vĩ lệnh th
hoc vng mặt các tham đối arg-list. Phn thân ca vĩ lnh gm các ng lnh VBA. Kết
thúc mt vĩ lệnh là cp t khoá End Sub. NSD có thđặt tu ý các dòng chú tch trong vĩ
lnh. Mi ng chú tch được bắt đầu bi mt dấu nháy đơn (quote). dsau đây là mt
vĩ lệnh tính din tích hình ch nht:
Sub ComputeArea(Length, Width)
Dim Area As DoubleKhai báo biến cc b
If Length = 0 Or Width = 0 Then
Exit SubNếu một trong hai tham đối = 0 thì thoát khi Sub
End If
Area = Length * Width Tính din tích hình ch nht
MsgBox Area In ra kết qu
End Sub ’ ComputeArea
Để gi chy vĩ lệnh trên đây, ta cn viết mt vĩ lnh khác s dng li gi Call:
Sub MyFirstExample()
Call ComputeArea(20, 10) ’ Tính din tíchnh ch nht 10x20
End Sub ’ MyFirstExample
Cách to mi tđộng mt vĩ lnh như sau: gọi lnh Tool-Macro-Record New Macro để làm
xut hin hp thoi Record Macro. Đặt li tên vĩ lệnh trong ô Macro Name. Chn chế độ lưu cất vĩ
lnh (hp thoi Store Macro in) ri OK. T lúc này, NSD th tiến hành công vic h thng
s tđộng ghi chép li bng các lnh VBA tương ng. Sau khi thc hin xong, NSD nhp
chut ti nút Stop Recording (hoc gi lnh Tool-Macro-Stop Recording) để kết thúc ghi vĩ lnh.
Để th tn dng chức năng tự động to ra các lệnh VBA để viết nhanh các vĩ lệnh x
mt công vic nào đó, ta tiếnnh qua hai bước như sau:
Bước 1: To tđộng mt vĩ lệnh thc hin mt chức ng nào đó liên quan đến ng
vic. Nh ch “bắt chước này”, còn được gi vui to “vn lp trình
(programming funds), NSD đỡ mt thi gian tìm hiu k thut lp trình VBA.
Bước 2: Lp tnh trc tiếp trong ca s son tho ca VBA. Gi lnh Tool-Macro- Macros
(hoc t hp phím Alt+F8) để làm xut hin hp thoi Macros. Chn tên vĩ lệnh ri
gi Edit, hoc gi Create để bắt đầu làm vic vi ca s NewMacros (code).
VBA h thng tr giúp lp trình rt phong phú. NSD th mt du chm sau tên
mt đối tượng nào đó để chn mt mc con tha kế hoc gi lnh Help (phím F1). Ví dụ để đặt
độ giãn gia các ng văn bản 16, ta thc hin lần lượt như sau: gõ Selection., chn
ParagraphFormat, gõ du chm ri chn LineSpacing, gõ tiếp giá tr 16, ta nhận được:
Selection.ParagraphFormat.LineSpacing = 16
Ví dụ sau đây to ra mt hộp đối thoại để vào tên tệp trước khi m tp:
Sub EnterFileName()
Dim FileNam As Variant
ChangeFileOpenDirectory "C:\MyDocs"
FileNam = InputBox("Cho biết tên tp ?",, 20)
If Len(FileNam) = 0 Then
MsgBox "Tên tệp chưa hp lý."
Else
MsgBox "Bắt đầu m tp " & FileNam
Documents.Open FileName:=FileNam, ReadOnly:=True
End If
End Sub
Cách to vĩ lnh trong Excel hay PowerPoint cũng được thc hiện tương t.
2.2 Các trình tin ích xử lý văn bản
a. Vĩ lệnh chuyển đối văn bản ch hoa chữ thường
Mt s phiên bn Windows hiện nay chưa cho phép chuyn đổi hoàn toàn một đoạn văn
bn tiếng Vit dùng phông ch Unicode t ch thường (lowercase) thành ch hoa (uppercase)
hay ngưc li. Chng hn nếu chuyển đon Trường Đại hc Bách ngh bi lnh Format-Change
Case, t ta s ch nhận được kết qu TRƯờNG ĐạI HC BÁCH NGH: các ch du
không chuyển được thành ch hoa. NSD có th s dng công c chuyển đổi trong các b
như UniKey, tuy nhiên, ta xây dng vĩ lệnh chuyển đối hoàn toàn một đoạn văn bản tiếng
Vit Unicode t ch thường thành ch hoa như sau:
Sub Lower2Upper()
Dim i, j As Integer
Khai báo mng 45 chữ thường và mng 45 ch hoa
LC = Array(ChrW(7843),ChrW(7841),ChrW(7867),ChrW(7869),ChrW(7865), _
ChrW(7881),ChrW(7883),ChrW(7887),ChrW(7885),ChrW(7911),ChrW(7909), _
ChrW(7923),ChrW(7927),ChrW(7929),ChrW(7925),ChrW(7847),ChrW(7849), _
ChrW(7851),ChrW(7845),ChrW(7853),ChrW(7857),ChrW(7859),ChrW(7861), _
ChrW(7855),ChrW(7863),ChrW(7873),ChrW(7875),ChrW(7877),ChrW(7871), _
ChrW(7879),ChrW(7891),ChrW(7893),ChrW(7895),ChrW(7889),ChrW(7897), _
ChrW(7901),ChrW(7903),ChrW(7905),ChrW(7899),ChrW(7907),ChrW(7915), _
ChrW(7917),ChrW(7919),ChrW(7913),ChrW(7921))
UC = Array(ChrW(7842),ChrW(7840),ChrW(7866),ChrW(7868),ChrW(7864), _
ChrW(7880),ChrW(7882),ChrW(7886),ChrW(7884),ChrW(7910),ChrW(7908), _
ChrW(7922),ChrW(7926),ChrW(7928),ChrW(7924),ChrW(7846),ChrW(7848), _
ChrW(7850),ChrW(7844),ChrW(7852),ChrW(7856),ChrW(7858),ChrW(7860), _
ChrW(7854),ChrW(7862),ChrW(7872),ChrW(7874),ChrW(7876),ChrW(7870), _
ChrW(7878),ChrW(7890),ChrW(7892),ChrW(7894),ChrW(7888),ChrW(7896), _
ChrW(7900),ChrW(7902),ChrW(7904),ChrW(7898),ChrW(7906),ChrW(7914), _
ChrW(7916),ChrW(7918),ChrW(7912),ChrW(7920))
Selection.Range.Case = wdLowerCase Chuyn tự động chữ thường thành ch hoa
N = Selection.Characters.Count Nhn biết đoạn văn bn
L = Selection.Text
Chuyển đổi nhng ch chưa được đổi tìm thy trong mng chthường
For i = 1 To N
For j = 0 To 44
If Mid(L, i, 1) = LC(j) Then
L = Left(L, i - 1) & UC(j) & Right(L, N - i)
Next j
Next i
If (Asc(Right(L, 1))) = 13 ThenX lý ký t hết đoạn
Selection.TypeText Text:=Left(L, N - 1)
Else
Selection.TypeText Text:=L
End If
End Sub ' Lower2Upper
Trình t thc hiện như sau: đầu tiên, to tự động vĩ lnh tìm kiếm thay thế toàn b các ch
cái du và có dấu thanh để nhn được các mã Unicode trong dng hàm ChrW ca VBA. Sau
đó gọi lnh Tool-Macro- Macros, chn Create để son tho chương trình vĩ lệnh.
Ngược lại, để to vĩ lnh chuyển đổi văn bản tiếng Vit Unicode t ch hoa ra ch
thường, s dng li hai mng ch thường và ch hoa và tiến hành theo cách tương tự vi c
ý hoán đổi vai tx lý các chi.
b. Vĩ lệnh sp xếp văn bản
Hu hết các trình tiếng Vit thông dng hiện nay như UniKey, Vietkeyđều chưa
công c tr giúp sp xếp văn bản mã Unicode. Nếu NSD sp xếp văn bản s dng lnh sp
xếp ca MSOffice, chng hn gi lnh Table-Sort để sp xếp các văn bn tiếng Vit t kết qu
nhận được (xem bng 1) không tuân theo th t chi như quy ước trong các tđin tiếng
Vit (Hoàng Phê, Nguyễn Như Ý…).
Đinh Đính Đình Đĩnh Đỉnh Định Dũng
Bng 1. Kết qu sp xếp văn bản tiếng Vit mã Unicode.
Nhìn vào bng ta thy th t chi tham đối như sau: Đ đứng trước D, th t du thanh
không du, sc, huyn, ngã, hi, nng. Theo các từ đin tiếng Vit thông dng hiện nay, đối
vi các chi mang du, th t chi quy ước a ă â d đ e ê o ô ơ u ư và th t du thanh
không du, huyn, hi, ngã, sc, nng.
Để xây dng tnh sp xếp, ta xây dng mt ánh x sp xếp I cho mi ch cái như sau:
I(
) =
nếu
là mt ch cái không mang du,
=

nếu
là mt ch cái mang du,
= nếu
là mt ch cái có du thanh quy ước đặt sau
hoc
.
Các giá tr mã sp xếp
được cho trong bng 2. Khi đó, mi từ đơn, hay âm tiết tiếng
Vit (chng hn t "may mn" hai âm tiết), mã sp xếp là kết qu ca phép ghép liên
tiếp (biu din bi phép +) các giá tr
,
ca tng chi tương ứng.
Ch cái mang du
Mã sp xếp
Du thanh
Mã sp xếp
ă az Huyn 1
â azz Hi 2
đ dz Ngã 3
ê ez Sc 4
ô oz Nng 5
ơ ozz
ư uz
Bng 2. Bng mã quy ước sp xếp ch cái và du thanh tiếng Vit.
Ví d: hương có mã sp xếp I(hương) = I(h)+I(ư)+I(ơ)+I(n)+I(g) = huzozzng,
hưởng có mã sp xếp I(hưởng) = I(h)+I(ư)+I()+I(n)+I(g) = huzozz2ng, v.v…
Trong trình vĩ lệnh, quá trình sp xếp văn bản đưc din ra thành 3 bước: bước 1 chuyn
đổi xuôi văn bn s dng ánh x I quy ước trên đây, bước 2 tiến hành sp xếp theo chế độ
hin ca MSOffice, cuối cùng bước 3 chuyển đổi ngược văn bn v li mã Unicode.
Đối với các văn bản trong bng (table), hin ti Word chưa cho phép sp xếp văn bn theo
hàng (row) mà ch cho phép sp xếp theo cột (column). Do đó trước khi sp xếp, vĩ lệnh sp
xếp văn bản tiếng Vit Unicode cn nhn biết d liệu n bn cn sp xếp phi nm trong
bng không ? Nếu t chép tt c các phn t, hay các ô (cell), ca hàng hay ct sang mt
mảng trung gian để tiến hành sp xếp theo thuật toán trên đây, sau đó chép kết qu vào li
hàng hay cột tương ứng ca bng.
Để tđộng hoá th tc sp xếp, ta th viết mt vĩ lệnh dng v tđoán nhận phn t
được lựa (selected) thường được th hin bng cách đảo ngược màu nn (inverse) là gì?
Chng hn phn tđược la th là t, t đơn hay t ghép, cm t, ng (line), đoạn
(paragraph), nhiều đon, ảnh, đồ ho, phn t bng, hàng, ct, v.v…
c. Vĩ lệnh qun lý từ điểntắt văn bản
Lâu nay, khi son thảo n bản, NSD thường s dng các phông ch (font) tiếng Vit theo
thói quen hoc theo cu nh cài đặt sn ca h thng. Các phông ch hay gặp đó là ABC,
TCVN, VNI, VietWare, BK HCM… Khi cần trao đổi văn bản, NSD th s dng công c
tr giúp chuyn mã văn bản (text conversion) trong các trình tiếng Việt nUniKey,
Vietkey… để chuyển đổi văn bản sang phông ch yêu cu.
Tuy nhiên, nếu NSD mun chuyn hoàn toàn h thng ca nh sang mt phông ch mi,
Unicode chng hn, t ngoài vấn đề chuyển đổi văn bản, NSD cn gii quyết vấn đề làm sao
có th s dng li từ đin gõ tắt văn bn theo chế độ AutoText, AutoCorect trong Word?
Các vĩ lệnh sau đây chuyển đổi phông ch ca từ đin phc v chế độ AutoText:
Sao chép từ điển AutoText lên ca sổ văn bản hin hành
Sub CopyAutoText()
Set myTemplate = ActiveDocument.AttachedTemplate
N = NormalTemplate.AutoTextEntries.Count
For I = 1 To N
With Selection
.TypeText Text:=myTemplate.AutoTextEntries(I).Name
.TypeText Text:=vbTab
.TypeText Text:=myTemplate.AutoTextEntries(I).Value
.TypeParagraph
End With
Next I
MsgBox "N=" & Str(N) Cho biết giá tr N
End Sub ' CopyAutoText
Chuyn mã ni dung t điển AutoText sang phông ch mi
To mi t điển AutoText
Sub CreateAutotext()
I = 0: N = 1400 Ly giá tr N trên đây
While I < N
I = I + 1: Selection.HomeKey Unit:=wdLine
TxtName = Selection.Paragraphs.First
TxtName = Left(TxtName, Len(TxtName) - 1)
With Selection
.MoveDown:.HomeKey Unit:=wdLine
.MoveDown Unit:=wdParagraph, Count:=1, Extend:=wdExtend
.MoveLeft Unit:=wdCharacter, Count:=1, Extend:=wdExtend
ActiveDocument.AttachedTemplate.AutoTextEntries.Add _
Range:=Selection.Range, Name:=TxtName
.MoveDown
End With
Wend
End Sub
Một cách tương t, NSD to mi tđin AutoCorect trong phông ch mi. Với phương
pháp to vĩ lệnh như trên, NSD tạo các tin ích xvăn bản khác như định dng trên các
đoạn văn bản (thay đổi v trí trước hay sau một đoạn, co giãn ch, chuyển đổi bng, v.v…).
2.3 Qun lý cơ sở d liu (CSDL) t vng
Trong quá trình thc hiện đề tài xây dng tđin đa ngữ Pháp-Anh-Vit (d án FEV [2],
[3], [6]), chúng i cần sưu tập d liu trong các tđin khác nhau (Pháp-Vit-Pháp, Anh-
Vit-Anh) để xây dng các CSDL t vng trung gian. D liu sau khi x phc v chèn
nghĩa tiếng Việt tương đương cho các từ đin đa ngữ.
Tđiển đa ngữ gồm các khối dữ liệu là các tệp văn bản Winword được định nghĩa nhất
quán theo mt mẫu văn bản xác định. Đó là mt tập hợp các dạng thức (style) thể hiện cách
định dạng mt đoạn văn bản được định nghĩa nhờ các lệnh đơn (Format) như: phông chữ
(Format-Font)…, kiu trình bày đoạn (Format-Paragraph), v.vMi dng thức biểu din mt
thành phần của từ điển đa ngữ. Chính sự khác nhau về cách trìnhy đoạn cho phép phân biệt