Nhằm cung cấp cho sinh viên các kiến thức
liên quan đến lập trình Visual Basic trong bộ
MS Office.
• Cung cấp các kiến thức về ngôn ngữ VBA.
• Viết các Macro từ đơn giản đến phức tạp.
175 trang |
Chia sẻ: Mr Hưng | Lượt xem: 1125 | Lượt tải: 0
Bạn đang xem trước 20 trang nội dung tài liệu Chuyên đề VBA, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
thuộc tính thường dùng
Chuyên đề VBA – HIENLTH 122
5. Hành động Excute
6. Tập hợp Errors
Mục tiêu sử dụng
• Mục tiêu sử dụng
– Tạo kết nối tường minh với CSDL, tiết kiệm tài nguyên cho hệ quản
trị CSDL
– Quản lí lỗi phát sinh khi làm việc với CSDL
• Khai báo
Public CN As ADODB.Connection
• Sử dụng
Set CN = New ADODB.Connection
Chuyên đề VBA – HIENLTH 123
‘Các thao tác trên biến CN
CN.Close ‘Đóng kết nối với CSDL
• Chú ý
– Chương trình nên tận dụng tối đa khả năng dùng chung kết nối với
CSDL
– Ngắt kết nối càng sớm càng tốt khi không còn làm việc với CSDL
– Không khai báo CN cục bộ
Tạo kết nối với CSDL
• Data provider
– Là một phần mềm phục vụ cho các ứng dụng sử dụng ADO để
thực hiện các thao tác về dữ liệu
• Bước 1: Xác định các thông tin và đặc điểm của kết nối
– Sử dụng DSN (Data Source Name), xem demo trên máy
– ConnectionString
• Provider: chỉ ra data provider của OLE-DB tương ứng với CSDL
Chuyên đề VBA – HIENLTH 124
• Data Source: chỉ ra CSDL cần kết nối
• User ID, Password: username và password để truy cập CSDL
• Có thể lấy được Connection String từ ADO Data Control
– CursorLocation
• Chỉ ra tập hợp các chức năng mà hệ quản trị CSDL sẽ hỗ trợ trong
phiên làm việc
• Bước 2: Tiến hành kết nối
– Gọi hành động Open
Tạo kết nối với CSDL
• Ngay tại VBA của Access:
Dim conn As ADODB.Connection
Set conn = CurrentProject.Connection
• Ở ngoài Access:
Public conn As ADODB.Connection
Set conn = New ADODB.Connection
Chuyên đề VBA – HIENLTH 125
conn.ConnectionString = "Provider =
Microsoft.Jet.OLEDB.4.0 ;Data
Source=C:\Documents and
Settings\HPT\Desktop\QLHS.mdb"
conn.CursorLocation = adUseClient
conn.Open
Tạo kết nối với CSDL
• Kiểm tra kết nối
If conn.State adStateOpen Then
MsgBox “Ket noi khong thanh cong”
Else
MsgBox “Ket noi thanh cong”
Chuyên đề VBA – HIENLTH 126
End If
• Đóng kết nối
conn.Close ‘hoặc Set conn = Nothing
Các loại Cursor
• Cursor
– Là một thành phần của CSDL, kiểm soát việc di chuyển giữa các mẩu tin
trong RecordSet, cập nhật dữ liệu hay khả năng nhìn thấy sự thay đổi dữ
liệu từ người khác
– CursorLocation: các chức năng hỗ trợ cho Cursor của CSDL
• Loại CursorLocation mặc định được dùng là adUserServer
– Tăng sự lưu thông trên mạng nhưng lượng dữ liệu truyền trên mạng nhỏ
– Thời gian đáp ứng yêu cầu của người dùng nhanh
– Thiếu nhiều chức năng của các đối tượng ADO
Chuyên đề VBA – HIENLTH 127
• Microsoft Cursor Service cho OLE DB cung cấp rất nhiều chức năng
mạnh cho data provider (hay ứng dụng sử dụng ADO)
– Tăng tốc độ thực hiện một số chức năng
– Đơn giản hoá việc lập trình
– Giảm sự lưu thông trên mạng nhưng dữ liệu truyền trên mạng lớn
• Để sử dụng Microsoft Cursor Service
– Connection.CursorLocation = adUserClient
– RecordSet.CursorLacation = adUseClient
Các thuộc tính thường dùng
• ConnectionString
– Chuỗi thông tin dùng để tạo kết nối với một CSDL
• ConnectionTimeout
– Số giây tối đa chờ kết nối, nếu vượt quá, coi như không kết nối
được (mặc định = 15)
• CursorLocation
– Xác định tập hợp các chức năng của Connection sẽ dùng
Chuyên đề VBA – HIENLTH 128
• State
– Trạng thái của mối kết nối (adStateClosed, Open, Connecting,
Excuting, Fetching)
• Provider
– Chỉ định data provider của OLE DB sẽ dùng để kết nối với CSDL
– Thường dùng chung trong ConnectionString
Làm việc với Record
Dim rs As ADODB.Recordset
Set rs = new ADODB.Recordset
• Mở:
Recordset.Open Source, Connection, CursorType,
LockType, Options
Trong đó:
Chuyên đề VBA – HIENLTH 129
– Source: tên bảng hay câu lệnh SQL
– Connection: biến connect đã mở trước đó
– CursorType:
• adOpenForwardOnly: mở chỉ đọc
• adOpenKeyset, adOpenDynamic : mở để thêm/sửa/xóa cập nhật
kịp thời
Làm việc với Recordset
• Các thuộc tính:
– Recordset.Source: Trả về tên Table hay câu lệnh
SQL.
– Recordset.ActiveConnection: Trả về connection
– Recordset.CursorType
Chuyên đề VBA – HIENLTH 130
– Recordset.LockType
• Ví dụ: Mở connection sử dụng Table:
rs.Open “HocSinh", conn
Các giá trị của CursorType
• CursorType: Loại cursor (xem cursor ở phần Connection) mà data
provider sẽ sử dụng khi mở RecordSet
• adOpenForwardOnly (mặc định)
– Nhanh, chỉ dùng để duyệt qua các mẩu tin lấy được
• adOpenDynamic
– Có thể di chuyển tới - lui, cập nhật mẩu tin
– Thấy được các mẩu tin do người khác thêm, xoá, sửa vào CSDL
• adOpenKeySet
Chuyên đề VBA – HIENLTH 131
– Có thể di chuyển tới - lui, cập nhật mẩu tin
– Mẩu tin
• Thêm bởi người khác: Không thấy
• Xoá bởi người khác: không truy cập được
• Sửa bởi người khác: thấy
• adOpenStatic
– Có thể di chuyển tới - lui, cập nhật mẩu tin
– Không thấy người khác thao tác với dữ liệu
Các giá trị của LockType
• Locktype: hình thức khoá mẩu tin mà data provider sẽ sử
dụng khi mở RecordSet
• adLockBatchOptimistic
– Cập nhật nhiều mẩu tin một lúc, chỉ khoá các mẩu tin vào lúc thực
hiện hành động cập nhật (UpdateBatch)
• adLockOptimistic
Chuyên đề VBA – HIENLTH 132
– Cập nhật từng mẩu tin, chỉ khoá mẩu tin vào lúc thực hiện hành
động cập nhật (Update)
• adLockPessimistic
– Cập nhật từng mẩu tin, khoá mẩu tin ngay khi có sự thay đổi dữ
liệu
• adLockReadOnly
– Mẩu tin chỉ có thể đọc, không thể thay đổi dữ liệu
Các thuộc tính thường dùng
• AbsolutePosition: Vị trí mẩu tin hiện hành trong RecordSet
• RecordCount: Tổng số mẩu tin trong RecordSet
– Thường dùng để xác định số mẩu tin, RecordSet rỗng
• BOF: Vượt ra trước mẩu tin đầu tiên
– Thường dùng trong quá trình di chuyển mẩu tin hiện hành, tìm kiếm,
lọc,
• EOF: Vượt ra sau mẩu tin cuối cùng
– Thường dùng trong quá trình di chuyển mẩu tin hiện hành, tìm kiếm,
Chuyên đề VBA – HIENLTH 133
lọc,
• State: Trạng thái kết nối với CSDL của RecordSet
– Hai giá trị thường dùng: adStateClosed và adStateOpen
• Bookmark: Đánh dấu mẩu tin hoặc di chuyển mẩu tin hiện hành tới vị
trí đánh dấu
• EditMode: Tình trạng của mẩu tin hiện hành
– Giá trị thường dùng: adEditNone
Ví dụ 1
Sub RecordsetOpenTable_1()
Dim rs As ADODB.Recordset ‘Khai báo biến Recordset
Set rs = new ADODB.Recordset
rs.Open “HocSinh", conn
Chuyên đề VBA – HIENLTH 134
‘Thực hiện.
rs.Close ‘Đóng kết nối
Set rs = Nothing
End Sub
Ví dụ 2
Sub RecordsetOpenTable_2()
Dim rs As ADODB.Recordset ‘Khai báo biến Recordset
Set rs = new ADODB.Recordset
With rs
.Source = “HocSinh“
Chuyên đề VBA – HIENLTH 135
.ActiveConnection = conn
.Open
End With
rs.Close ‘Đóng kết nối
Set rs = Nothing
End Sub
Làm việc với Recordset
• SELECT [DISTINCT] field_names FROM table_name
WHERE criteria ORDER BY field_names [DESC];
• Ví dụ dùng SQL:
Sub RecordsetOpenSELECT()
Dim rs As ADODB.Recordset
Dim strSELECT As String
Chuyên đề VBA – HIENLTH 136
Set rs = new ADODB.Recordset
strSELECT = "SELECT * FROM HocSinh WHERE
NoiSinh=‘KhanhHoa‘ ORDER BY TenHS;“
rs.Open strSELECT, conn, adOpenKeyset
rs.Close
Set rs = Nothing
End Sub
Làm việc với RecordSet
• Lấy giá trị 01 trường:
Recordset.Fields(FieldName)
Recordset(FieldName)
Recordset.Fields(FieldIndex)
Recordset(FieldIndex)
Chuyên đề VBA – HIENLTH 137
• Ví dụ:
‘Sau khi mở kết nối, truy vấn SQL
rs.Fields(“TenHS”) ’Lấy tên HS
rs(0) ‘Lấy giá trị cột số 0 (cột đầu tiên)
Làm việc với RecordSet
• Các điều khiển:
– Recordset.MoveFirst
– Recordset.MoveLast
– Recordset.MoveNext
– Recordset.MovePrevious
Chuyên đề VBA – HIENLTH 138
• Kiểm tra:
– Recordset.BOF: Mẫu tin đầu tiên?
– Recordset.EOF: Mẫu tin cuối cùng?
• Di chuyển:
– Recordset.Move NumRecords, Start
Tìm 01 record thỏa mãn điều kiện nào đó?
Recordset.Find Criteria, SkipRows,
SearchDirection, Start
Trong đó:
– Criteria: Điều kiện tìm
– SkipRows: Tìm từ SkipRows mẫu tin tính từ vị trí
Chuyên đề VBA – HIENLTH 139
mẫu tin hiện tại. Mặc định là 0.
– SearchDirection:
• adSearchForward: Hướng tăng (record tiếp)
• adSearchBackward: Hướng giảm (record trước)
– Start: Vị trí bắt đầu
Ví dụ về tìm
Sub SearchRecordsWithFind()
Dim rs As ADBDO.Recordset
Dim strCriteria As String
Set rs = new ADODB.Recordset
With rs
.Source = “HocSinh“
.ActiveConnection = conn
.CursorType = adOpenKeyset
.Open
End With
Chuyên đề VBA – HIENLTH 140
strCriteria = “NoiSinh=‘Khánh Hòa'“
rs.Find strCriteria
Do While Not rs. EOF
MsgBox rs(“HoHS") & " " & rs(“TenHS")
rs.Find strCriteria, 1
Loop
rs.Close
Set rs = Nothing
End Sub
Thêm mới 01 mẫu tin (record)
rs.AddNew
rs(“tên_trường") = “giá_trị“
rs.Update
Ví dụ:
Chuyên đề VBA – HIENLTH 141
‘Khai báo kết nối
rs.AddNew
rs(“MaHS”) = “Trần Văn”
rs(“TenHS”) = “Chiến”
rs.Update
LockType và hành động cập nhật
• Khi mẩu tin được thêm mới hay sửa đổi, dữ liệu được data provider tạm
thời lưu trong bộ nhớ trước khi cập nhật vào CSDL
– Để cập nhật dữ liệu vào CSDL, sử dụng hành động
• Update
• UpdateBatch
– Để bỏ qua các thay đổi về dữ liệu, sử dụng hành động
• CancelUpdate nếu cập nhật dùng Update
• Gọi CancelUpdate khi EditMode=adEditNone sẽ có lỗi
Chuyên đề VBA – HIENLTH 142
• CancelBatch nếu cập nhật dùng UpdateBatch
• Các LockType
– adLockReadOnly: Không cập nhật được
– adLockPessimistic, adLockOptimistic: sử dụng Update
• Dữ liệu tự động cập nhật khi di chuyển tới mẩu tin khác
• Nếu không Update hoặc CancelUpdate, đóng RecordSet sẽ có lỗi
– adLockBatchOptimistic: sử dụng UpdateBatch
• Dữ liệu đã thay đổi sẽ bị mất khi đóng RecordSet mà chưa cập nhật
Sửa 01 mẫu tin (record)
rs.Find điều_kiện_tìm
Do While Not rs.EOF
rs(“tên_trường") = “giá_trị“
rs.Update
rs.Find điều_kiện_tìm, 1
Loop
Ví dụ:
Chuyên đề VBA – HIENLTH 143
dkTim = “NoiSinh = ‘Khánh Hà’ “
rs.Find dkTim
Do While Not rs.EOF
rs(“NoiSinh”) = “Khánh Hòa”
rs.Update
rs.Find dkTim, 1
Loop
Xóa 01 mẫu tin (record)
rs.Find điều_kiện_tìm
If Not rs.EOF Then
rs.Delete
rs.Update
End If
Ví dụ:
Chuyên đề VBA – HIENLTH 144
dkTim = “MaHS = ‘HS001’ “
rs.Find dkTim
If Not rs.EOF Then
rs.Delete
rs.Update
End If
Đại Học Sư Phạm Tp. Hồ Chí Minh
Chuyên đề VBA
VBA for Outlook
Bắt đầu sử dụng Outlook 2003
Chuyên đề VBA – HIENLTH 146
Tùy chọn
Chuyên đề VBA – HIENLTH 147
Gõ tên hiển thị trên Email
Chuyên đề VBA – HIENLTH 148
Đặt địa chỉ Email
• Giả sử dùng Gmail
Chuyên đề VBA – HIENLTH 149
Cài đặt thông số
• POP3
• pop.gmail.com
• smtp.gmail.com
Chuyên đề VBA – HIENLTH 150
Cài đặt thông số
Chuyên đề VBA – HIENLTH 151
Lựa chọn cách kết nối Internet
Chuyên đề VBA – HIENLTH 152
Thông báo kết quả
Chuyên đề VBA – HIENLTH 153
Giao diện Outlook 2003
Chuyên đề VBA – HIENLTH 154
Cho phép dùng POP trong Gmail
Chuyên đề VBA – HIENLTH 155
Bật POP
Chuyên đề VBA – HIENLTH 156
Điều chỉnh cổng gửi/nhận thư
• Tools / Email Account
Chuyên đề VBA – HIENLTH 157
Điều chỉnh cổng gửi/nhận thư
Chuyên đề VBA – HIENLTH 158
Điều chỉnh cổng gửi/nhận thư
Chuyên đề VBA – HIENLTH 159
Điều chỉnh cổng gửi/nhận thư
Chuyên đề VBA – HIENLTH 160
Điều chỉnh cổng gửi/nhận thư
Chuyên đề VBA – HIENLTH 161
Điều chỉnh cổng gửi/nhận thư
• POP3: 995
• SMTP: 465
Chuyên đề VBA – HIENLTH 162
Nội dung chương này
• Xác định, copy, di chuyển, xóa email
• Xác định người gửi, chủ đề, nội dung,
• Gửi email
• Thêm, xóa, download attach
Chuyên đề VBA – HIENLTH 163
• Sử dụng Outlook ở các ứng dụng khác
trong MS Office
Khai báo
Dim ns As NameSpace
Dim ib As MAPIFolder
Set ns = ThisOutlookSession.Session
Set ib = ns.GetDefaultFolder(olFolderInbox)
Chuyên đề VBA – HIENLTH 164
Khai báo Namespace và MAPIFolder.
Ví dụ: Truy xuất tới thư mục Input trong
Personal Folders.
ns.Folders(1).Folders(3)
ns.Folders("Personal Folders").Folders(“Input")
Liệt kê tất cả các Folder
Sub demo()
Dim ns As NameSpace
Dim folder As MAPIFolder
Dim subfolder As MAPIFolder
' Dat namespace lam viec
Set ns = ThisOutlookSession.Session
folder ns.FoldersFor Each In
MsgBox "TM cha: " & folder.Name
If folder.Folders.Count > 1 Then
For Each subfolder In folder.Folders
MsgBox subfolder.Name
Next 'subfolder
End If
Next 'folder
Set ns = Nothing
End Sub
Làm việc với Email - MailItem
• Khai báo: Dim msg As MailItem
• Các thuộc tính: (msg.Tên_thuộc_tính)
– BCC, CC: Địa chỉ BCC, CC
– Body, BodyFormat: Nội dung thư
– HTMLBody: Nội dung thư dạng HTML
Chuyên đề VBA – HIENLTH 166
– Recipients: Người nhận
– SenderName: Người gửi
– Subject: Chủ đề thư
– To: Tên người nhận
– UnRead: Đã đọc chưa?
– SenderEmailAddress: Email người gửi
Mail Items
• Các phương thức:
– Close
– Copy, Move, Delete
– Save
– Print Out
Chuyên đề VBA – HIENLTH 167
– Send
– Forward, Reply, ReplyAll
Gửi email đơn giản
Sub Send_First_Email()
Dim mi As MailItem
Set mi = Application.CreateItem(olMailItem)
mi.To = "hpt7777@gmail.com"
Chuyên đề VBA – HIENLTH 168
mi.Subject = "Test email"
mi.Body = "test"
mi.Send
End Sub
Ví dụ: Tạo email trả lời tự động
Sub autoreply_Thanks()
Dim ns As NameSpace
Dim oInbox As MAPIFolder
Dim msg As MailItem
'Tao doi tuong Inbox
Set ns = ThisOutlookSession.Session
Set oInbox = ns.GetDefaultFolder(olFolderInbox)
'Duyet các chua doc trong inbox
For Each msg In oInbox.Items
Chuyên đề VBA – HIENLTH 169
With msg
If .UnRead Then
With .Reply
.Subject = "THANKS FOR EMAIL"
.Body = "Thanks for email!!! Good luck!"
.Send
End With
End If
End With
Next msg
End Sub
Chọn email người nhận
• mi.To: Thêm 01 người nhận
• mi.Recipients.Add:Thêm được nhiều
người nhận
Chuyên đề VBA – HIENLTH 170
Attachment
• mi.Attachments.Add
• mi.Attachments.FileName
• mi.Attachments.Delete
• mi.Attachments.SaveAs (Path)
Chuyên đề VBA – HIENLTH 171
Sử dụng Email ở các ứng dụng khác
• (Alt + F11) Tools / References
–Microsoft Outlook 11.0 Object Library
Chuyên đề VBA – HIENLTH 172
Khai báo sử dụng
Dim ol As Outlook.Application
Set ol = CreateObject("Outlook.Application")
Dim ns As NameSpace
Dim folder As MAPIFolder
‘Thiết lập kết nối
Chuyên đề VBA – HIENLTH 173
Set ns = ol.GetNamespace("MAPI")
ns.Logon
‘Thực hiện các công việc tương tự Outlook
Ví dụ gửi mail ở Excel
Public Function SendEMail(Recipient As String, Subj As String, Body As String)
Dim App As Object
Dim Mail As Object
Set App = CreateObject("Outlook.Application")
Set Mail = App.CreateItem(0)
With Mail
.Subject = Subj ‘Tiêu đề thư
Chuyên đề VBA – HIENLTH 174
.Recipients.Add (Recipient) ‘Email người nhận
.Body = Body ‘Nội dung thư
End With
Mail.Send
Set Mail = Nothing
Set App = Nothing
End Function
Câu hỏi và thảo luận
Chúc các bạn hoàn thành tốt bài tập và
ứng dụng vào công việc thực tế!
Chuyên đề VBA – HIENLTH 175
Các file đính kèm theo tài liệu này:
- 0_vba_1slide_5797.pdf