Download as pdf or txt
Download as pdf or txt
You are on page 1of 6

Xây dựng macro Visual Basic để nhập dữ liệu tự động

Trong thực tế, dù ở môi tr ờng lập trình Chuyên nghiệp hay ứng dụng văn phòng, chúng ta
đều th ờng xuyên thao tác trên các dạng cơ sở dữ liệu. Việc ghi dữ liệu ra các định dạng dữ liệu đư
có là một công việc khá th ờng xuyên và t ơng đối nhàm chán. Trong bài viết này tôi xin giới thiệu
một ph ơng pháp t ơng đối đặc biệt cho phép chúng ta nhanh chóng nhập dữ liệu vào các định
dạng của các ứng dụng có hỗ trợ ngôn ngữ macro VBA của Microsoft nh Excel, Access, Word...

Có rất nhiều kỹ thuật để ghi dữ liệu vào các định dạng dữ liệu chuẩn, với định dạng MDB
của Access có thể sử dụng DAO đi kèm với bất kì bộ phát triển nào của Microsoft; với các định
dạng chuẩn cơ sở dữ liệu nh DBF (DBase, FoxPro), MDB (Access), DB (Paradox)... chúng ta có
thể sử dụng giao tiếp ODBC hoặc hiện đại hơn là OLE-DB; ngoài ra có thể sử dụng các kĩ thuật
khác kém phổ biến hơn nh OLE Automation hoặc tự xây dựng th viện xuất dữ liệu. Mỗi ph ơng
pháp đều có những điểm mạnh yếu riêng, không có ph ơng pháp nào tốt cho mỗi nhu cầu của các
lập trình viên. Việc sử dụng các th viện tự viết chỉ thích hợp với các loại cơ sở dữ liệu đư quá cổ
điển, không còn đ ợc hỗ trợ trong môi tr ờng hiện tại; đối nghịch với nó, nếu bạn sử dụng th viện
CSDL đư có, ứng dụng của bạn sẽ "nở" to đến độ không ngờ, bạn sẽ phải đối phó những vấn đề
nhức đầu có thể có trong quá trình cài đặt và vận hành ứng dụng, từ việc sai hỏng version trong quá
trình cài đặt, đến các lỗi bất ngờ xảy ra do tranh chấp file dữ liệu, vân vân và vân vân. Đứng trên tất
cả các vấn đề đó là việc bạn phải bỏ ra khá nhiều thời gian quý báu của mình để cài đặt các thủ tục
đọc ghi/xử lý lỗi khi xuất dữ liệu.

Tôi muốn giới thiệu với các bạn một cách đơn giản, t ơng đối hiệu quả và đặc biệt là tốn rất
ít thời gian để cài đặt việc nhập dữ liệu tự động vào các file cơ sở dữ liệu. Đó là việc sử dụng các
Macro VBA đ ợc bạn viết sẵn ngay trong các file cơ sở dữ liệu. Với cách này bạn không cần quan
tâm đến các cơ chế giao tiếp của ngôn ngữ lập trình với các cơ sở dữ liệu. Hơn nữa, đây lại là một
cách đảm bảo tính độc lập dữ liệu cao đồng thời nó không phụ thuộc vào các Version của cơ sở dữ
liệu. Bây giờ, chúng ta hưy xem xét cách thức tiến hành của ph ơng pháp này.

Vấn đề: Chúng ta t ởng t ợng một lập trình viên A đư có một ch ơng trình xử lý dữ liệu
viết trong Visual C++, dữ liệu do ch ơng trình tạo ra cần đ ợc xuất ra nhiều dạng để nhiều ch ơng
trình khác xử lý, chẳng hạn cần xuất ra 3 dạng Access, Word và Excel, vấn đề ở đây là A cần phải
hoàn thành công việc trong thời gian ngắn, chẳng hạn 1 ngày. Thay vì viết các hàm xuất dữ liệu
trong Visual C++, công việc mà không chắc có thể 1 ngày làm xong đ ợc. A bèn làm nh sau:
1. Xuất dữ liệu của ch ơng trình ra file text theo một định dạng tự quy ớc.

2. Viết các hàm bằng macro VBA trong Access, Word và Excel để khi các file này mở ra thì các
macro tự động chạy và nạp dữ liệu từ file text đư có vào chính bản thân nó. Cơ chế này t ơng tự các
virus macro trong Word.

3. Mỗi lần ng ời sử dụng xuất dữ liệu, ch ơng trình sẽ xuất ra một file dữ liệu trống chứa sẵn các
macro mà A đư xây dựng, kèm theo một file text trùng tên. Khi ng ời dùng mở file dữ liệu, dữ liệu
từ file text sẽ đ ợc nhập vào trong quá trình mở file.

Nh các bạn có thể thấy, thay vì phải viết/kiểm tra các hàm xuất dữ liệu cho từng loại CSDL, A chỉ
phải xuất ra dạng text và viết vài macro VBA đơn giản.

Chúng ta hưy xem xét việc tạo một macro chạy tự động trong Microsoft Excel.

Tr ớc tiên, nếu bạn đang làm việc với Office 97 hay Office 2000, bạn tìm đến và click vào biểu
t ợng của Visual Basic Editor trên Toolbar (biểu t ợng này nằm trên Toolbar "Visual Basic" hoặc
chọn mục "Tools.Macro.Visual Basic Editor" trên menu chính, lúc này bạn sẽ có một cửa sổ làm
việc.

ở đây, bạn có thể viết các macro cho workbook hay các sheet. Trong phần này tôi sẽ giới thiệu cách
cài đặt macro cho một workbook. Macro nhập dữ liệu tự động từ một file Text vào trong file Excel
khi file này đ ợc mở. Để đơn giản, ta nên đặt tên file text trùng với tên file excel và định dạng file
text này, chẳng hạn file text của tôi đ ợc định dạng nh sau:

Dòng đầu tiên là số cột cần xuất vào file.

Dòng thứ 2 đến dòng thứ n+ 1 là tên của n cột.

Dòng thứ n + 2 là số dòng sẽ đ ợc xuất vào file.

Dòng thứ n+3 trở đi là nội dung của các Ô (nội dung mỗi Ô ghi trên 1 dòng), lần l ợt theo các dòng
từ trên xuống d ới và các cột từ trái sang phải.

Ví dụ cụ thể, tôi có một file example.txt đ ợc định dạng nh sau:


4
Họ và tên
ngày sinh
Quê quán
Nghề nghiệp
2
Nguyễn Văn A
01-01-1970
Hà Nội
Kế toán
Nguyễn Thị B
30-10-1976
Hà Tây
Giáo viên

Bây giờ bạn bắt đầu viết Macro để thực hiện công việc nhập dữ liệu tự động. Để đảm bảo là dữ liệu
đ ợc nhập vào ngay khi file đ ợc mở, chúng ta phải xử lý ở sự kiện Open workbook.

Tr ớc tiên, ta đ a các khai báo sau vào sau phần Option Explicit: Option Explicit

Public NumCol As Integer


Public Numrow As Integer
Dim Columns (1 To 300 ) As String

Chúng ta đ a vào sự kiện Workbook- Open() đoạn mư sau đây:

Private Sub workbook-open ( )


On Error Goto FALL

Dim fileNum As Integer, I As Integer, J As Integer


Dim str As String, fileName As String
Dim wb As Workbook
Dim index As Integer

Set wb = Thisworkbook
fileName - Left (wb.FullName,
Len(wb . FullName) - 3)' & "txt"
fileNum = FreeFile
Open fileName For Input AB #fileNum
Input #fileNum, NumCo1
index = 1

For I = 1 To NumCo1
Line Input#fileMum, str
Woksheets ("Sheet1"), Range (Columns (I) &CStr (index)). Value = str
Next I
Input#fileNum, NumRow
For J = 1 To NumRow
index = index + 1
For I = 1 To NumCol
Line Input #fileNum, str
If (str <>"") Then
Worksheets ("Sheet1"). Range (Columns (I) & CStr (index). Value=str
End If
Next I
Next J
Close #fileNum
Kill fileName
wb.Save
End
FALL:
End
End Sub

Trong đoạn mư trên, columns là một mảng ký hiệu các cột của Excel (A...Z, AA...). Ta có thể tạo ra
mảng một cách đơn giản bằng thủ tục sau đây:

Sub SetNameColumn()
Dim I As Integer
Columns (1) = "A"
For I = 2 To 26
Columns (I) = NextColumn (Columns (I-1))
Next I
Columns (27) = "AA"
For I = 28 To 300
Columns (I) = NextColumn (Columns (I-1))
Next I
End Sub

Trong đó NextColumn (Columns (i)) là hàm trả về tên cột tiếp theo cột i. Hàm này đ ợc viết nh
sau:

Function NextColumn (s As String) As String


If Len (s)=1 Then
NextColumn=Chr (Asc(s)+1)
Else
If Asc (Mid(s, Len(s)))=90 Then
NextColumn=Chr(Asc(s)+1)&"A"
Else
NextColumn=Chr(Asc(s) & Chr (Asc(Mid(s, Len(s))) +1)
End If
End If
End Function
Hoạt động của macro rất đơn giản, đầu tiên nó đọc dữ liệu từ file, đọc đ ợc số cột và đặt tên
cho các cột của sheet, sau đó nó đọc xem dữ liệu xuất có bao nhiều hàng và lần l ợt đọc/ghi thông
tin vào các ô của sheet.

Việc viết macro cho Word và Access cũng không khác là bao, nắm đ ợc ý t ởng trên cộng
với một chút kiến thức về VB là các bạn có thể dễ dàng thành công. Sau đây chúng ta hưy thử đánh
giá ph ơng pháp này một chút.

Nh ợc điểm

- Đôi khi có thể mất dữ liệu do ng ời dùng đư có thao tác với file đ ợc xuất ra (chẳng hạn: move nó
sang th mục khác). Nh ng vấn đề này có thể đ ợc giải quyết trọn vẹn bằng một vài kỹ thuật VB
tinh tế hơn.
- Chỉ chạy đ ợc với các ứng dụng hỗ trợ VBA, vấn đề này t ơng tự nh việc các trang web có java
script chỉ chạy đ ợc trên các trình duyệt hỗ trợ js vậy.

- Các macro có thể bị nhận lầm là virus (nhất là với các ch ơng trình diệt virus của Việt Nam), vì
kỹ thuật của ch ơng trình sử dụng t ơng tự các kỹ thuật của virus.

u điểm:

- Ch ơng trình nhỏ gọn, chẳng dính dáng gì đến cơ sở dữ liệu (Cũng có nghĩa là không phải lo lắng
gì về xử lý lỗi cài đặt, lỗi đọc dữ liệu...).

- Các macro đ ợc viết bằng VBA, dễ dàng bảo trì và phát triển hơn các đoạn mư viết bằng ngôn
ngữ khác.

- Có thể xuất dữ liệu vào các ứng dụng rất đặc thù, không thể làm bằng các ph ơng pháp xuất dữ
liệu thông th ờng, ví dụ: xuất dữ liệu vào các file định dạng của Word, của PowerPoint, của
Microsoft Project, của Visio... Đây là lợi thế độc nhất vô nhị của ph ơng pháp này.

- Thời gian chi phí cho việc phát triển phần xuất dữ liệu là rất ngắn so với các ph ơng pháp khác.

Trên đây là một cách sử dụng macro tự động nhập dữ liệu vào các file cơ sở dữ liệu. Việc
viết macro rất đơn giản mà nhiều khi lại rất hiệu quả. Hy vọng các nhập dữ liệu này sẽ giúp bạn
cảm thấy thú vị hơn khi làm việc với các cơ sở dữ liệu.

You might also like