Đại Học Sư Phạm Tp. Hồ Chí MinhĐại Học Sư Phạm Tp. Hồ Chí Minh
Chuyên đề VBA Chuyên đề VBA
Visual Basic for Application
Thông tin giảng viên
•• LƯƠNG TRẦN HY HIẾNLƯƠNG TRẦN HY HIẾN• Bộ môn Tin Học• Khoa Toán – Tin học• Phone: 0989 366 9900989 366 990
Chuyên đề VBA – HIENLTH 22
• Phone: 0989 366 9900989 366 990• Email: [email protected]• Website:http://fit.hcmup.edu.vn/~hienlth/VBAhttp://fit.hcmup.edu.vn/~hienlth/VBA
Thông tin môn học
• Chuyên đề VBA• Số đvht: 4 (60t = 30LT + 30TH)• Môi trường làm việc:
– Bộ MS Office 2003 (2007)
Chuyên đề VBA – HIENLTH 33
– Bộ MS Office 2003 (2007) • VBA for WORD• VBA for EXCEL• VBA for PowerPoint• VBA for Access• VBA for Outlook
Mục tiêu
• 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.
Chuyên đề VBA – HIENLTH 44
• Viết các Macro từ đơn giản đến phức tạp.
Đề cương môn học: VBAVBA
• Chương 1: Giới thiệu tổng quan VBA• Chương 2: VBA for Word• Chương 3: VBA for Excel• Chương 4: VBA for Access • Chương 5: VBA for Outlook
Chuyên đề VBA – HIENLTH 55
• Chương 5: VBA for Outlook• Chương 6: Bài tập
Đánh giá kết quả học tập
• Làm bài tập: Thang điểm 10• Bài tập không nộp đúng hạn, bài làm giống
nhau 0 điểm.• Nhóm sinh viên(3-5 SV) chọn số đề tài sao
cho tổng điểm là 10, một bài không quá 4
Chuyên đề VBA – HIENLTH 66
cho tổng điểm là 10, một bài không quá 4nhóm chọn.
• Nộp qua email: [email protected] trướcngày 55//99//20102010.
• Tiêu đề thư: VBA_DongNai_STTNhom
Tài li ệu tham khảo
• Slide bài giảng của giảng viên• Ebook cung cấp:
–– Absolute.Beginners.Guide.to.VBAAbsolute.Beginners.Guide.to.VBA.chm–– Excel VBA Macro ProgrammingExcel VBA Macro Programming.chm
Chuyên đề VBA – HIENLTH 77
–– Writing Excel Macros With VBA 2nd EdWriting Excel Macros With VBA 2nd Ed.pdf–– Access VBA ProgrammingAccess VBA Programming.chm
• Tham khảo tài liệu trên Internet• Các ví dụ mẫu
Tài li ệu tham khảo - URL
• http://www.caulacbovb.com/• http://www.vbaexpress.com/• http://www.excel-vba.com/• http://word.mvps.org• http://homepage.swissonline.ch/cindymeister
Chuyên đề VBA – HIENLTH 88
• http://homepage.swissonline.ch/cindymeister• http://www.excelguru.ca/sitemenu• http://www.fontstuff.com/• http://www.andreavb.com/forum/viewboard_10.ht
ml
Câu hỏi và thảo luận
Chuyên đề VBA – HIENLTH 99
Đại Học Sư Phạm Tp. Hồ Chí MinhĐại Học Sư Phạm Tp. Hồ Chí Minh
Chuyên đề VBA Chuyên đề VBA
Giới thi ệu tổng quan
Chương 1: Giới thi ệu tổng quan
• Là bộ phần mềm lập trình dành riêngcho MS Office và tích hợp sẵn trong MSOffice.
• Với VBA, các thao tác thực hiện mộtcách tự động theo ý muốn người sử
Chuyên đề VBA – HIENLTH 1111
cách tự động theo ý muốn người sửdụng.
• Các cú pháp tương đương Visual Basic6.0 + Thêm 1 số cái khác
• Không phân biệt hoa/thường
Để VBA (Macro) hoạt động
• WORD, EXCEL, PowerPoint, Outlook, Access 2003: Tool/Macro/Security
Chuyên đề VBA – HIENLTH 1212
Để VBA (Macro) hoạt động
• Security Level: Chọn Medium hay Low.
•Medium : Hỏi
•Low : Luôn chạy
Chuyên đề VBA – HIENLTH 1313
Để VBA (Macro) hoạt động
• WORD, EXCEL, PowerPoint, Outlook, Access 2007: Show Developer tab in Ribbon
Chuyên đề VBA – HIENLTH 1414
Sử dụng VBA
• Mở cửa sổ soạn thảo: Alt + F11
Chuyên đề VBA – HIENLTH 1515
Sử dụng Macro –Thu Macro tự động
• Tools / Macro / Record New Macro
Chuyên đề VBA – HIENLTH 1616
Sử dụng Macro –Thu Macro tự động
• Đặt tên Macro
Phạm vi áp d ụng:• Tất cả file Word
Gán phím t ắt cho Macro
Chuyên đề VBA – HIENLTH 1717
• Tất cả file Word• File hi ện tại
Sử dụng VBA
• Alt + F8: Tạo/Chạy/Sửa/Xóa Macro
Chuyên đề VBA – HIENLTH 1818
Sử dụng Macro – Thực thi
• Alt + F8• Chọn Macro� Run
Chuyên đề VBA – HIENLTH 1919
Sử dụng Macro – Thực thi
• Alt + F8• Chọn Macro� Edit
Chuyên đề VBA – HIENLTH 2020
Demo 01 VBA Example
Sub loichao()MsgBox "Chao mung cac ban den voi
chuyen de VBA", vbInformation, "Thong bao"
End Sub
Chuyên đề VBA – HIENLTH 2121
End Sub
F5: để chạy
Hiển thị câu thông báoMsgBox “Chuỗi thông báo”, biểu tượng + nút nhấn,
“Tiêu đề”Biểu tượng:• vbCritical• vbInformation• vbQuestion• vbExclamation
Chuyên đề VBA – HIENLTH 2222
• vbExclamationCác loại nút nhấn:• vbYesNo• vbYesNoCancel• vbOKCancel• vbOKOnly• vbRetryCancel
Các loại biểu tượng
Chuyên đề VBA – HIENLTH 2323
Các loại nút nhấn
Chuyên đề VBA – HIENLTH 2424
Nhập liệu
• InputBox(prompt[, title] [, default] [, xpos] [, ypos] [, helpfile][, context])
• Hiển thị hộp thoại nhập liệu, giao tiếp với người dùng• Tham số:
– prompt: Giá trị mà bạn muốn hiển thị trong InputBox– Title: Tiêu đề của InputBox– Default: Giá trị mặc định khi InputBox xuất hiện
Chuyên đề VBA – HIENLTH 2525
– Default: Giá trị mặc định khi InputBox xuất hiện– xpos, ypos: Vị trí xuất hiện của InputBox– Helpfile: Đường dẫn file help– Context: Ngữ cảnh của file help
• VD:bien = InputBox("Nhap vao ngay sinh cua ban", "nhap lieu", "01/01/1981", 0, 0)
Các kiểu dữ liệu VBA
• Boolean: mang giá trị True/False• Byte: Số nguyên nhỏ [0 – 255]• Currency: Giá trị tiền tệ• Date: Dùng để biểu diễn ngày, giờ
Chuyên đề VBA – HIENLTH 2626
• Date: Dùng để biểu diễn ngày, giờ• Double: Số thực dấu chấm động• Integer: Số nguyên có dấu• Long: Số nguyên lớn có dấu• Object: Chứa tham chiếu đến đối tượng
Các kiểu dữ liệu VBA• Single: Số thực dấu chấm động• String: Chuỗi• Variant: Ký tự• Kiểu người dùng:
– Khai báo:
Chuyên đề VBA – HIENLTH 2727
– Khai báo:Type KhachHang
HoTen As StringMaKH As LongNgayGiaNhap As Date
End Type
Khai báo biến, hằng
Khai báo biến:• Public/Dim/Private <tên biến> [as
<kiểu>]• Ví dụ:
Chuyên đề VBA – HIENLTH 2828
– Dim x as Integer
– Dim y– Public d as Date
• Nên khai báo đầy đủ kiểu để giảm số lỗi.
Khai báo biến, hằng
• Quy tắc đặt tên biến:– Bắt đầu với ký tự chữ– Không vượt quá 255 ký tự– Không trùng từ khóa VBA– Không chứa khoảng trắng, ., !, #, $, %, &,
Chuyên đề VBA – HIENLTH 2929
– Không chứa khoảng trắng, ., !, #, $, %, &, @
Khai báo tường minh trong VBA
Option Explicit• Chương trình sẽ tự kiểm tra và nhắc khai báo
biến tường minh (khai báo trong phần General)
Chuyên đề VBA – HIENLTH 3030
Require Variable Declaration
• Có thể khai báo
tự động trong mục:
Menu Tools - Option
Phạm vi sử dụng của biến
• Khai báo biến ở General– Sử dụng ở bất kỳ đoạn
lệnh nào trong form.– Chỉ mất khi ứng dụng
được giải phóng.
• Khai báo biến trong phần
Teân kieåu Ghi chuù
Byte Soá nguyeân 0-255
Integer Soá nguyeân
Long Soá nguyeân daøi
Single Soá thöïc
Chuyên đề VBA – HIENLTH 3131
• Khai báo biến trong phầnviết lệnh xử lý sự kiện chođối tượng.– Chỉ có phạm vi giữa hai
dòng Sub và End Sub
Double Soá thöïc
Boolean -1/0 - True/False
Date Ngaøy
String Chuoãi
Khai báo biến, hằng
Khai báo hằng:• CONST <tên hằng> [as <kiểu>] = trị• Ví dụ:
– Const x = 5
Chuyên đề VBA – HIENLTH 3232
– Const x = 5– Const y = 1
Các hàm chuyển đổi ki ểu…
• Trong lập trình, cần chuyển đổi qua lại giữa các kiểu dữ liệu.
• Các hàm chuyển đổi kiểu là một phần không thể thiếu của các ngôn ngữ lập trình.
Chuyên đề VBA – HIENLTH 3333
trình.• VBA cung cấp các hàm chuyển đổi kiểu
khá tiện.
CBool Chuyển 0 thành false, các trị khác thành true
CByteChuyển đổi tên_biến thành kiểu Byte. tên_biến có thể chứa dữ liệu số bất kỳ haydữ liệu chuỗi có thể chuyển đổi thành số, trong khoảng 0 đến 255. Nếu tên_biếnngoài khoảng đó, VBA báo lổi Overflow. Nếu tên_biến là dấu chấm động, nó đượclàm tròn thành số nguyên gần nhất tr ước khi chuyển đổi ki ểu.
CDecChuyển đổi tên_biến thành kiểu phụ Decimal. Hàm này chấp nhận dữ liệu số haychuỗi có thể chuyển thành số, trong giới hạn của kiểu Decimal. Đây là hàm cung cấpphương thức duy nhất để tạo kiểu phụ Decimal.
Chuyển đổi tên_biến thành kiểu Date. CDate chấp nhận số và chuỗi biểu diễn ngày
Chuyên đề VBA – HIENLTH 3434
CDateChuyển đổi tên_biến thành kiểu Date. CDate chấp nhận số và chuỗi biểu diễn ngàyvà chuyển đổi thành dạng được mô tả bởi thông tin địa phương trên máy tính. Thí dụmáy tính được cài đặt dạng ngày của Mỹ mm/dd/yy, nếu ta nhập ngày dạng Anhdd/mm/yy và dùng hàm Cdate thì ngày được sẽ chuyễn đổi sang dạng Mỹ.
CCurChuyển đổi tên_biến thành kiểu Currency. CCur chấp nhận dữ liệu số hay chuỗi bấtkỳ biểu diễn giá trị tiền tệ. Hàm này nhận dạng thập phân hay dấu phân cách hàngngàn theo thông tin địa phương của máy tính. Chỉ dùng cho VBA.
CDblChuyển đổi tên_biến thành kiểu double. Chấp nhận dữ liệu số bất kỳ nằm trong giớihạn của kiểu Double hoặc bất kỳ dữ liệu chuỗi có thể chuyển đổi thành số trong giớihạn của kiểu Double.
CDbl
Chuyển đổi tên_biến thành kiểu double. Chấp nhận dữ liệu số bất kỳ nằm trong giới hạn của kiểu Double hoặc bất kỳ dữ liệu chuỗi có thể chuyển đổi thành số trong giới hạn của kiểu Double.
CInt Chuyển đổi tên_biến thành kiểu Integer.
CLng Chuyển đổi tên_biến thành kiểu Long.
CSng Chuyển đổi tên_biến thành kiểu Single.
Chuyên đề VBA – HIENLTH 3535
CSng Chuyển đổi tên_biến thành kiểu Single.
CStrChuyển đổi tên_biến thành kiểu String. CStr chấp nhận kiểu dữ liệu bất kỳ.
CVarChuyển đổi tên_biến thành kiểu Variant. CVar chấpnhận kiểu dữ liệu bất kỳ.
Hàm chuyển đổi chuỗi thành số…:Val
• Val là một hàm chuyển đổi kiểu “dễ dãi”.
• Val(chuoi) �dạng số đầu tiên tìm thấy trong chuỗi
Chuyên đề VBA – HIENLTH 3636
• Val(“30something”) � 30CInt(“30something”) �lỗi
Các toán tử
• Toán tử đại số:+ - * / ^ Mod
• Toán tử cộng chuỗi: &• Toán tử so sánh:
Chuyên đề VBA – HIENLTH 3737
• Toán tử so sánh:= > < >= <= <>
• Toán tử logic:And Or Xor Not
KHAI BÁO TH Ủ TỤC/HÀM
Khai baùo thủ tục:
[Public][Private]SUB < Tên thủ tục >( [TS1 As <Kieåu >, TS2 As <Kiểu>])Thân hàm
END SUB
Chuyên đề VBA – HIENLTH 3838
Ví duï:
Sub HoanVi(a as Integer, b as Integer)Dim c as Integerc = aa = bb = c
End Sub
KHAI BÁO TH Ủ TỤC/HÀM
Khai baùo hàm:
[Public][Private]Function < Tên hàm >( [TS1 As <Kieåu >, TS2 As <Kiểu>]) as <Kiểu>
Thân hàm< Tên hàm > = Kết quả trả về
End Function
Chuyên đề VBA – HIENLTH 3939
Ví duï:Function TinhTrungBinh(a as single, b as single) as single
Dim kq as singlekq = (a+b)/2TinhTrungBinh = kq
End Function
Các hàm toán học của VBA
Abs(num) Giá trị tuyệt đối của num
Atn(num) Arctangent của num
Cos(num) Cosi của num
Int(num) Phần nguyên của num
Exp(num) enum
Log(num) Lg(num)
Chuyên đề VBA – HIENLTH 4040
Log(num) Lg(num)
Rnd(num) Số ngẫu nhiên trong 0 < x < 1
Sgn(num) Dấu của num
Sin(num) Sin của nu
Sqr(num) Bình phương của num
Tan(num) Tangent của num
Các hàm chuỗi của VBA
Asc(str) Lấy mã ASCII của str
Chr(numchar) Lấy ký tự (dạng Variant) ứng với mã ASCII là nmchar
Chr$(numchar) Lấy ký tự (dạng String) ứng với mã ASCII là nmchar
CStr(exp) Chuyển biểu thức sang dạng chuỗi
InStr(start, s1, s2) Lấy vị trí kí tự đầu tiên của s2 trong s1 bắt đầu ở start
Chuyên đề VBA – HIENLTH 4141
InStr(start, s1, s2) Lấy vị trí kí tự đầu tiên của s2 trong s1 bắt đầu ở start
LCase(str) Chuyển sang chữ thường, dạng variant
LCase$(str) Chuyển sang chữ thường, dạng string
Left(str, len) Lấy len kí tự tính từ bên trái, dạng variant
Left$(str, len) Lấy len kí tự tính từ bên trái, dạng string
Các hàm chuỗi của VBA
Len(str) Số lượng ký tự trong str
LTrim(str) Cắt các khoảng trắng đầu str, dạng variant
LTrim$(str) Cắt các khoảng trắng đầu str, dạng string
Mid(str, start, len) Lấy len kí tự bắt đầu từ start trong str, dạng variant
Mid$(str,start,len) Lấy len kí tự bắt đầu từ start trong str, dạng string
Chuyên đề VBA – HIENLTH 4242
Mid$(str,start,len) Lấy len kí tự bắt đầu từ start trong str, dạng string
Right(str, len) Lấy len kí tự tính từ bên phải, dạng variant
Right$(str, len) Lấy len kí tự tính từ bên phải, dạng string
RTrim(str) Bỏ các khoảng trắng bên phải, dạng variant
Rtrim$(str) Bỏ các khoảng trắng bên phải, dạng string
Các hàm chuỗi của VBA
Trim(str) Bỏ tất cả các khoảng trắng dư, dạng variant
Trim$(str) Bỏ tất cả các khoảng trắng dư, dạng string
Str(num) Đổi num chữ chuỗi dạng variant
Chuyên đề VBA – HIENLTH 4343
Str(num) Đổi num chữ chuỗi dạng variant
Str$(num) Đổi num chữ chuỗi dạng string
UCase(str) Đổi sang chữ hoa, dạng variant
UCase$(str) Đổi sang chữ hoa, dạng string
Xem thêm các hàm trong Xem thêm các hàm trong VBLibVBLib (tên, ví d ụ)(tên, ví d ụ)
Các cấu trúc điều khiển
• Nếu … thìIF <biểu thức> THEN
<lệnh khi đúng>ELSE
<lệnh khi sai>
Chuyên đề VBA – HIENLTH 4444
<lệnh khi sai>END IF
Các cấu trúc điều khiển
• Lựa chọnSELECT CASE <biểu thức>
CASE <giá trị>: Lệnh
CASE <giá trị>: Lệnh…
Chuyên đề VBA – HIENLTH 4545
…CASE ELSE: Lệnh
END SELECT
CẤU TRÚC LẶP WHILE...WEND
Vieát chöông trình tính toång cuûa n soá nguyeân döông vôùi n nhaäp töø baøn phím.
Sub Private ….
Dim i, n as integer
WHILE <BIỂU THỨC LOGIC>LỆNH/KHỐI LỆNH 1
WEND
Chuyên đề VBA – HIENLTH 4646
Dim i, n as integer
Dim S as long
‘Nhaäp soá nguyeân döông nS = 0
WHILE i<=n
S = S + i
i = i + 1
WEND
‘Xuat tong cua n so nguyen duong dau tien: SEnd Sub
Cấu trúc lặp
• Cấu trúc DO WHILE … LOOPDO WHILE <Biểu thức điều kiện>
‘Các câu lệnh muốn thực thi khi BTDK còn đúngLOOP ‘Quay về DO WHILE để kiểm tra BTDK
• Ví dụ: S = 1 + 2 + … + N
Chuyên đề VBA – HIENLTH 4747
• Ví dụ: S = 1 + 2 + … + NS = 0, I = 1
Do While I < N
S = S + I
I = I + 1;
Loop
Cấu trúc lặp
• Cấu trúc DO … LOOP WHILEDO
‘Thực hiện lệnhLOOP WHILE <biểu thức điều kiện>
• Ví dụ: S = 1 + 2 + … + N
Chuyên đề VBA – HIENLTH 4848
• Ví dụ: S = 1 + 2 + … + NS = 0, I = 1
Do
S = S + I
I = I + 1;
Loop While I <= N
Cấu trúc lặp
• Cấu trúc DO … LOOP UNTILDO
‘Thực hiện lệnhLOOP UNTIL <biểu thức điều kiện>
• Ví dụ: S = 1 + 2 + … + N
Chuyên đề VBA – HIENLTH 4949
• Ví dụ: S = 1 + 2 + … + NS = 0, I = 1
Do
S = S + I
I = I + 1;
Loop Until I > N
Cấu trúc lặp
• Lặp có số lần xác định: FOR … NEXTFOR <Biến = Giá trị đầu> TO <Giá trị cuối>
[STEP khoảng tăng]‘ Phần các lệnh thực thi khi biến chưa đạt giá trị cuối
Chuyên đề VBA – HIENLTH 5050
NEXT BiếnS = 0
For I = 1 to 5 step 1
S = S + i
Next I
Cấu trúc lặp
• Lặp có số lần xác định: FOR EACH… NEXTFOR EACH <phần tử> IN <tập hợp>
Thực hiệnNEXT phần tử
Ví dụ:
Sub ConvertToProper()’Excel VBA
Chuyên đề VBA – HIENLTH 5151
Sub ConvertToProper()’Excel VBA
Dim cellObject As Range
For Each cellObject In Selection
cellObject.Formula = WorksheetFunction(Proper(cellObject.Formula))
Next
End Sub
Một số lệnh ngắt
• Break• Continue• EXIT FOR• EXIT DO
Chuyên đề VBA – HIENLTH 5252
• EXIT DO• EXIT SUB• END
Làm việc với mảng• Mảng cố định:
<Phạm vi> tên_mảng(số phần tử) as <kiểu>VD: Dim myInt(5) as Integer
• Mảng động:<Phạm vi> tên_mảng() as <kiểu>
Chuyên đề VBA – HIENLTH 5353
ReDim tên_mảng(số phần tử)ReDim Preserve tên_mảng(số phần tử)
Ví dụ:Dim iDynamicArray() As IntegerReDim iDynamicArray(10)ReDim Preserve iDynamicArray(12)
Xác định cận của mảng
• Các hàm Ubound và LBound có thể tìm cận trên và dưới của một mảng
• Cú pháp:x = UBound(tên_mảng) ‘Cận trên của mảngy = LBound(tên_mảng) ‘Cận dưới của mảng
Chuyên đề VBA – HIENLTH 5454
y = LBound(tên_mảng) ‘Cận dưới của mảng
• Ta có thể định nghĩa cận của mảng:Dim myInt(1 to 10) as Integer
Mảng nhiều chiều
• Dim tên_mảng(cận trên 1, cận trên 2, ....) As <kiểu>
• Ví dụ:Dim arr1(2,4) as SingleDim arr2(0 to 1, 1 to 4) as Single
Chuyên đề VBA – HIENLTH 5555
Dim arr2(0 to 1, 1 to 4) as Single
Làm việc với các đối tượng
• Tham chiếu đến thuộc tính:Object.PropertyNameVD:– Application.ActiveWindow– ActiveCell.Font.Italic
Chuyên đề VBA – HIENLTH 5656
– ActiveCell.Font.Italic• Xác lập giá trị cho 1 thuộc tính:
Object.PropertyName = ValueVD: ActiveCell.Font.Size = 16
• Làm việc với các phương thức:Object.MethodName
Làm quen với các đối tượng
• Có thể gán đối tượng cho 01 biến:Dim sht As WorksheetSet sht = Workbooks(“Demo.xls").Worksheets(“Demo01")
• Một đối tượng có nhiều thuộc tính, ta có thể sử dụng cấu trúc WITH như sau:WITH đối tượng
Chuyên đề VBA – HIENLTH 5757
WITH đối tượng.Thuộc tính 1.Thuộc tính 2
END WITH• Ví dụ:
With ActiveCell.Font.Italic = True.Font.Name = "Times New Roman“
End With
Đối tượng Application
Các thuộc tính:• Application.Dialogs: Trả về tập hợp các
dialog được xây dựng sẵn• Application.Height
Chuyên đề VBA – HIENLTH 5858
• Application.Width• Application.Path: Trả về đường dẫn tới đối
tượng Application• Application.ScreenUpdating: Xác lập
screenupdating của ứng dụng
Đối tượng Application
Các phương thức:• Application.CheckSpelling: Kiểm tra lỗi chính
tả (xem thêm)• Application.Help
Chuyên đề VBA – HIENLTH 5959
• Application.Quit: Thoát ứng dụng• Application.Repeat: Lặp lại thao tác cuối
cùng của ứng dụng
Đối tượng Window
Các thuộc tính:• Window.Caption• Window.Height• Window.Width
Chuyên đề VBA – HIENLTH 6060
• Window.WidthCác phương thức:• Window.Active• Window.Close• Window.LargeScroll
Làm quen UserForm
• Chuột phải Project (tên_file)�Insert�UserForm
Chuyên đề VBA – HIENLTH 6161
Làm quen UserForm
• Giao diện Form:
Chuyên đề VBA – HIENLTH 6262
• Thanh ToolBox:
Làm quen User Form
• Nên đặt lại tên cho các đối tượng
Chuyên đề VBA – HIENLTH 6363
Làm quen Module
• Chuột phải Project (tên_file)�Insert�Module
Chuyên đề VBA – HIENLTH 6464
Làm quen với Module
• Viết code: Hàm (Sub)
Chuyên đề VBA – HIENLTH 6565
Đại Học Sư Phạm Tp. Hồ Chí MinhĐại Học Sư Phạm Tp. Hồ Chí Minh
Chuyên đề VBA Chuyên đề VBA
VBA for Word
Làm việc với Document
• Chỉ định 01 document:– Documents("Memo.doc")– Documents(2)– ActiveDocument: Cửa sổ đang được focus– ThisDocument: Cửa sổ chứa code VBA thực
Chuyên đề VBA – HIENLTH 6767
– ThisDocument: Cửa sổ chứa code VBA thực thi
• Mở 01 tài liệu: Documents.Open(FileName)
VD: Documents.Open “D:\bangdiem.doc”
Làm việc với Document
• Lưu: Tài_liệu.Save• Lưu lại với tên khác:
Tài_liệu.Save As (tên, loại)• Đóng: Tài_liệu.Close chế_độ
Chuyên đề VBA – HIENLTH 6868
• Đóng: Tài_liệu.Close chế_độ– wdSaveChanges: Lưu tất cả thay đổi– wdDoNotSaveChanges: Không lưu– wdPromptToSaveChanges: Hỏi???
Làm việc với Document
• Cập nhật màn hình:Application.ScreenUpdating = False/True• Active:
– Documents(“demo.doc”).Activate
Chuyên đề VBA – HIENLTH 6969
– Documents(“demo.doc”).Activate
– Documents(1).Activate
• In:– ActiveDocument.PrintOut– Documents(1).PrintOut
Làm việc với Document
• Tài_liệu.Active: Kích hoạt document được chỉ định
• Tài_liệu.PrintOut: In tài liệu được chỉ định• Tài_liệu.Select
Chuyên đề VBA – HIENLTH 7070
• Tài_liệu.Undo (times)• Tài_liệu.Redo (times)
Làm việc với Range (vùng chọn)
• Khai báo vùng chọn: Tài_liệu.Range(Start,End)
• Ví dụ: ‘Làm nghiêng đoạn 1ActiveDocument.Paragraphs(1).Range.Italic = True
• Thuộc tính của Range:– Bold, Italic, Font
Chuyên đề VBA – HIENLTH 7171
– Bold, Italic, Font– Copy, Cut, Paste, Delete– InsertAfter (text)– InsertBefore (text)– InsertParagraph– InsertParagraphAfter– InsertParagraphBefore
Range – Vùng chọnInsertAfter (Text) Chèn text vào cuối vùng chọn
InsertBefore (Text) Chèn text vào đầu vùng chọn
InsertBreak (Type) Chèn/ Thay thế vùng chọn thành breakType:• wdPageBreak(default)• wdColumnBreak• wdSectionBreakNextPage
Chuyên đề VBA – HIENLTH 7272
• wdSectionBreakNextPage• wdSectionBreakContinuous• wdSectionBreakEvenPage• wdSectionBreakOddPage• wdLineBreak• wdLineBreakClearLeft• wdLineBreakClearRight• wdTextWrappingBreak
InsertParagraph Chèn/ Thay thế vùng chọn thành paragraph
InsertParagraphAfter Chèn paragraph vào cuối vùng chọn
Range – Vùng chọnInsertParagraphBefore Chèn paragraph vào đầu vùng chọn
StartOf (Unit, Extend) M ở rộng đầu vùng chọn đến đầu unit gần nhất
Extend = wdExtend
EndOf (Unit, Extend) M ở rộng cuối vùng chọn đến cuối unit gần nhất
Extend= wdExtend
Chuyên đề VBA – HIENLTH 7373
Extend= wdExtend
MoveLeft (Unit, Count, Extend) Mở rộng vùng chọn/range sang tráiCount > 0, Extend = wdExtend
MoveRight (Unit, Count, Extend) Mở rộng vùng chọn/range sang phảiCount > 0, Extend = wdExtend
MoveUp (Unit, Count, Extend) Mở rộng vùng chọn/range lên trênCount > 0, Extend = wdExtend
MoveDown (Unit, Count, Extend) Mở rộng vùng chọn/range xuống dướiCount > 0, Extend = wdExtend
Range – Vùng chọnHomeKey (Unit, Extend) Mở rộng vùng chọn về đầu Unit
Extend = wdExtend
MoveStart (Unit, Count) Thu hẹp/Mở rộng vùng chọnCount > 0 hay Count < 0
EndKey (Unit, Extend) Mở rộng vùng chọn về cuối UnitExtend = wdExtend
Chuyên đề VBA – HIENLTH 7474
Extend = wdExtend
MoveEnd (Unit, Count) Thu hẹp/Mở rộng vùng chọnCount > 0 hay Count < 0
MoveStartUntil (Cset, Count) Thu hẹp/Mở rộng vùng chọn đến khi gặp CsetCount > 0 hay wdFordward, wdBackward
MoveEndUntil (Cset, Count) Thu hẹp/Mở rộng vùng chọn đến khi gặp CsetCount > 0 hay wdFordward, wdBackward
Range – Vùng chọnMoveStartWhile (Cset, Count) Thu hẹp/Mở rộng vùng chọn chừng nào còn gặp
CsetCount > 0 hay wdFordward, wdBackward
MoveEndWhile (Cset, Count) Thu hẹp/Mở rộng vùng chọn chừng nào còn gặp Cset
Count > 0 hay wdFordward, wdBackward
Chuyên đề VBA – HIENLTH 7575
MoveUntil (Cset, Count) Thu hẹp/Mở rộng vùng chọn đến khi gặp CsetCount > 0, Count < 0 hay wdFordward,
wdBackward
MoveWhile (Cset, Count) Thu hẹp/Mở rộng vùng chọn chừng nào còn gặp Cset
Count > 0, Count < 0 hay wdFordward, wdBackward
Range – Vùng chọn
HomeKey (Unit, Extend) Mở rộng vùng chọn về đầu UnitExtend = wdExtend
EndKey (Unit, Extend) Mở rộng vùng chọn về cuối UnitExtend= wdExtend
Chuyên đề VBA – HIENLTH 7676
Extend= wdExtendExpand (Unit) Mở rộng vùng chọn đến unit
Extend (Char) Mở rộng vùng chọn đến unit lớn hơn nếu ExtendMode = True hoặc đến Char
Làm việc với đối tượng Selection
• Đối tượng Selection luôn tham chiếu đến:– Text được chọn– Vị trí cursor điểm chèn
• Ví dụ:
Chuyên đề VBA – HIENLTH 7777
ActiveDocument.Paragraphs(1).Range.Select
Làm việc với đối tượng Selection
• Selection.Collapse Direction: Loại bỏ vùng chọn và đặt điểm chèn tại Direction
• Selection.EndKey (Unit, Extend): Di chuyển vùng chọn đến cuối 01 đơn vị chỉ định
• Selection.EndOf (Unit, Extend): Di chuyển vùng chọn đến cuối 01 bộ được chỉ định
Chuyên đề VBA – HIENLTH 7878
chọn đến cuối 01 bộ được chỉ định• Selection.Expand Unit: Mở rộng vùng chọn theo
đơn vị Unit• Selection.Home (Unit, Extend)• Selection.Move (Unit, Extend)• Selection.StartOf (Unit, Extend)
Selection – Con trỏ
TypeText (Text) Nhập text Selection.TypeText(“Hello”)
TypeParagraph Nhập dấu paragraph Selection.TypeParagraph
TypeBackSpace Xóa lui Selection.TypeBackSpace
Chuyên đề VBA – HIENLTH 7979
StartOf (Unit) Di chuy ển con trỏ đến đầu unit gần nhất
Selection.StartOfUnit:=wdParagraph
EndOf (Unit) Di chuyển con trỏ đến cuối unit gần nhất
Selection – Con trỏMove (Unit, Count) Di chuyển con trỏ
Count > 0 hay Count < 0
HomeKey (Unit) Di chuyển con trỏ về đầu Unit
MoveLeft (Unit, Count) Di chuyển con trỏ sang trái Count > 0
EndKey (Unit) Di chuyển con tr ỏ về cuối Unit
Chuyên đề VBA – HIENLTH 8080
EndKey (Unit) Di chuyển con tr ỏ về cuối Unit
MoveRight (Unit, Count) Di chuyển con trỏ sang phải Count > 0
MoveUp (Unit, Count) Di chuyển con trỏ lên trên Count > 0
MoveDown (Unit, Count) Di chuyển con trỏ xuống dưới Count > 0
Làm việc với đối tượng Selection• Các loại Unit:
– wdCharacter– wdWord (mặc định)– wdLine– wdSentence– wdParagraph
Chuyên đề VBA – HIENLTH 8181
– wdParagraph– wdSelection– wdStory– wdCell– wdColumn– wdRow– wdTable
Selection – Soạn thảoCopy
CopyFormat Copy format vủa ký tự đầu (/và của dấu paragraph)
CopyAsPicture Copy vùng chọn thành ảnh
Cut
Chuyên đề VBA – HIENLTH 8282
Delete
Paste
PasteFormat Áp dụng format cho vùng chọn
Font
Text
Character, Word, Sentences• Đếm số lượng ký tự trong 01 file:
Documents(“VBADemo.doc").Characters.Count
• Đếm số lượng từ trong 01 file:Documents(" VBADemo.doc ").Words.Count
• Đếm số lượng câu trong 01 file:
Chuyên đề VBA – HIENLTH 8383
• Đếm số lượng câu trong 01 file:Documents(" VBADemo.doc ").Sentences.Count
• Đếm số lượng đoạn trong 01 file:Documents(" VBADemo.doc ").Paragraphs.Count
• Xác định số Font:Application.FontNames.Count
Đối tượng Paragraph
Một số thuộc tính:• Paragraph.LeftIndex: Thụt lề trái (point)• Paragraph.LineSpacing: Khoảng cách dòng• Paragraph.RightIndex
Chuyên đề VBA – HIENLTH 8484
• Paragraph.RightIndex• Paragraph.SpaceAfter• Paragraph.SpaceBefore• Paragraph.Style
VBA for Word Example• Thêm vào trang Word:
Public Sub Them_Chu()Selection.TypeText Text:="Hello World!“
End Sub
• Kiểm tra Word start up ở thư mục nào:
Chuyên đề VBA – HIENLTH 8585
• Kiểm tra Word start up ở thư mục nào:Public Sub AutoExec()MsgBox ("The Word Startup Folder is: " _
& vbCrLf & Word.Application.StartupPath)End Sub
VBA for Word ExampleChép nội dung file sẵn có sang file mới:Public SubAutoExec()
Dim MsgBoxResultDim SaveFileNameMsgBoxResult = MsgBox( "Click Yes to load the default letter" & vbCrLf & "Click No to load default Word.", vbYesNo, "Document Environment")
Chuyên đề VBA – HIENLTH 8686
vbYesNo, "Document Environment")If MsgBoxResult = vbYesThen
Documents.Open ("THUCHANH_VBA.doc")SaveFileName = InputBox( "Enter a name for the letter",
"Letter Name ?")If SaveFileName <> "" Then
ActiveDocument.SaveAs (SaveFileName)End If
End Sub
VBA for Word Example – Tìm và thaySub ReplaceText()
Dim FindStringArray As StringDim ReplaceStringArray As StringDim i As Integer
FindStringArray = "find 0"ReplaceStringArray = "replace 0"
Chuyên đề VBA – HIENLTH 8787
Selection.Find.Wrap = wdFindContinueWith Selection.Find
.Text = FindStringArray
.Replacement.Text = ReplaceStringArray
.Execute Replace:=wdReplaceAllEnd With
End Sub
Thư viện trợ giúp
• Bấm F2
Chuyên đề VBA – HIENLTH 8888
Đại Học Sư Phạm Tp. Hồ Chí MinhĐại Học Sư Phạm Tp. Hồ Chí Minh
Chuyên đề VBA Chuyên đề VBA
VBA for Excel
Các đối tượng của Excel
Chuyên đề VBA – HIENLTH 9090
Các đối tượng trong Excel
• Đối tượng này có thể chứa các đối tượng khác.
• Ví dụ:– Application.Workbooks đề cập (refer) đến tất cả
workbook đang mở trong Excel.
Chuyên đề VBA – HIENLTH 9191
workbook đang mở trong Excel.– Workbooks.Item(1) đề cập đến workbook đầu
tiên và thường được gọi tắt là Workbooks(1).– Workbooks(“Demo.xls”) sẽ đề cập đến workbook
tên đó.– Workbooks(“Demo.xls”).Worksheets(“Sheet1”).
Range(“B3”) đề cập tới ô B3
Các phương thức
• Các đối tượng có các phương thức mà có thể thực hiện các hành động trong nó.– Activate (Hoạt động hay hiện hành)– Clear (Xoá)
Chuyên đề VBA – HIENLTH 9292
– Clear (Xoá)– Copy (Sao chép)– Cut (Cắt bỏ đi)– Delete (Xoá nội dung trong Range)– Select (Lựa chọn)
• VD: Range(“B3”).Select
Các thuộc tính
• Mỗi đối tượng đều có các đặc điểm riêng.
• Đối với đối tượng Range, các thuộc tính đặc trưng như sau:– ColumnWidth
Chuyên đề VBA – HIENLTH 9393
– ColumnWidth– Font– Formula– Text– Value
Example
• Điền vào cell B1 trị là chuỗi “Happy”:Range("B1").SelectActiveCell.FormulaR1C1 = “Happy"
• Chọn nhiều ô:
Chuyên đề VBA – HIENLTH 9494
Range("A2:A8").Select
• Điền vào ô công thức:Range("E2").SelectActiveCell.FormulaR1C1 = "=SUM(RC[-3]:RC[-1])"
Tham chiếu đến ô và vùng
Chuyên đề VBA – HIENLTH 9595
• VD: Range(“A1:A3”).Select thì vùng A1:A3 được bôi đen.
Ví dụ• Với workbook đang hoạt động, trong worksheet Sheet1, bạn
gán nội dung “Chuyen de VBA” vào ô B3. Sau đó cho nội dung chữ đó đậm, nghiêng, màu đỏ và nền màu vàng.
• VD:Sub Thunghiem()
ActiveWorkbook.Sheets(“Sheet1”).Range("B3").SelectActiveCell.FormulaR1C1 = “Chuyên de VBA”Selection.Font.Bold = True
Chuyên đề VBA – HIENLTH 9696
Selection.Font.Bold = TrueSelection.Font.Italic = TrueSelection.Font.ColorIndex = 3With Selection.Interior
.ColorIndex = 6
.Pattern = xlSolidEnd WithRange("B4").Select
End Sub
Số chỉ mục
• Thuộc tính Cells có thể sử dụng để trả về đối tượng mảng là ô đơn.
• Số chỉ mục hàng và cột của ô cung cấp cho Cells(row_no,col_no).
• Nếu không có số hàng và cột thì Cells() sẽ trả
Chuyên đề VBA – HIENLTH 9797
• Nếu không có số hàng và cột thì Cells() sẽ trả về đối tượng là toàn bộ ô trong sheet (giống như phím tắt Ctr + A).
• Ví dụ:– Cells(4,1) trả về ô A4– Cells() trả về toàn bộ ô trong sheet– Cells.ClearContents : Xóa toàn bộ nội dung
Số hàng và số cột (Rows and Columns)
• Rows(4): Hàng số 4• Rows: Toàn bộ dòng trong sheet hiện hành• Columns(4): Cột D (cột thứ 4)• Columns(“D”): Cột D• Columns: Toàn bộ cột trong sheet hiện hành
Chuyên đề VBA – HIENLTH 9898
• Columns: Toàn bộ cột trong sheet hiện hành• VD:
– Rows(2).Font.Bold = Truecho toàn bộ hàng 2 trong sheet Week4 chữ đậm của workbook hiện hành.
Offset cells
• Được sử dụng để tham chiếu đến ô khác mà có quan hệ với ô đang hoạt động.
• offset(no_rows_down, no_cols_to_right)• VD:
Sub Offset()Range("B1").Activate
Chuyên đề VBA – HIENLTH 9999
Range("B1").ActivateActiveCell.Offset(1, 1).Font.ColorIndex = 3ActiveCell.Offset(4, 1).Font.Bold = TrueActiveCell.Offset(8, 1).Value = “VBA"ActiveCell.Offset(8, 1).Font.Size = 12Range("E9").ActivateActiveCell.Offset(-1, -2).Font.Italic = True
End Sub
Ki ểu tham chiếu R1C1
• Khi sử dụng kiểu R1C1, Excel sẽ tham chiếu đến ô mà được xác định bởi số hàng và cột.
• VD: – Nhập vào công thức Sum(“B2:B4”) trong ô B5.– Ô B5 có địa chỉ hàng 5 và cột B và có giá trị là tổng
Chuyên đề VBA – HIENLTH 100100
– Ô B5 có địa chỉ hàng 5 và cột B và có giá trị là tổng các ô của 3 hàng trước đó, gồm dòng thứ 2 đến dòng thứ tư nhưng cùng cột.Range(“B5”).SelectActiveCell.FormulaR1C1 = “=Sum(R[-3]C:R[-1]C)”
Example
• Chức năng tự điền nhanh:Range("B9").SelectSelection.AutoFill
Destination:=Range("B9:E9"), Type:=xlFillDefault
Chuyên đề VBA – HIENLTH 101101
Type:=xlFillDefault
Ví dụ ứng dụng Word trong Excel
Sub proWord()Dim varDoc As ObjectSet varDoc = CreateObject("Word.Application")varDoc.Visible = TrueSheets("Sheet1").Range("A1:b1").CopyvarDoc.Documents.AddvarDoc.Selection.Paste
Chuyên đề VBA – HIENLTH 102102
varDoc.Selection.PastevarDoc.Activedocument.SaveAs ThisWorkbook.Path & "/" & "testWord.doc"varDoc.Documents.ClosevarDoc.Quit
End Sub
VBA for Excel Tips
• Đóng gói (không xem mã nguồn):– Chuột phải VBAProject(tên_file.xls), chọn
VBA Project Properties.
Chuyên đề VBA – HIENLTH 103103
• Lần sau mở xem code (Alt + F11):
Chuyên đề VBA – HIENLTH 104104
Liên kết ứng dụng khác
Bước 1: Chèn thư viện sử dụng• (Alt + F11) Tools / References…
– Microsoft Word 11.0 Object Library– Microsoft Excel 11.0 Object Library
Chuyên đề VBA – HIENLTH 105105
– Microsoft PowerPoint 11.0 Object Library– Microsoft Access 11.0 Object Library– Microsoft Outlook 11.0 Object Library
Ví dụ: Tạo ứng dụng WordSub GetWord()
Dim objApp As Object
On Error Resume NextSet objApp = GetObject(, "Word.Application")
ElseOn Error GoTo ErrHandler
End If
'Add some text to the documentWith objApp.Documents(1)
Chuyên đề VBA – HIENLTH 106106
If Err.Number <> 0 ThenErr.ClearOn Error GoTo ErrHandlerSet objApp =
CreateObject("Word.Application")With objApp
.Visible = True
.Documents.AddEnd With
.Paragraphs(1).Range.InsertParagraphBefore
.Paragraphs(1).Range.Text = "Hello!" & vbNewLineEnd With
ErrHandler:Set objApp = NothingOn Error GoTo 0
End Sub
Ví dụ: Tạo ứng dụng ExcelSub GetExcel()
Dim objApp As ObjectOn Error Resume NextSet objApp = GetObject(, "Excel.Application")
If Err.Number <> 0 Then
Else'Bound to instance, activate
error handlingOn Error GoTo ErrHandler
End If
'Add some text to the document
Chuyên đề VBA – HIENLTH 107107
If Err.Number <> 0 ThenErr.Clear 'Could not get
instance, so create a new oneOn Error GoTo ErrHandlerSet objApp =
CreateObject("Excel.Application")With objApp
.Visible = True
.Workbooks.AddEnd With
'Add some text to the documentWith objApp.ActiveWorkbook
.Worksheets.Add
.Worksheets(1).Range("A1") = "Hello!"End With
ErrHandler:Set objApp = Nothing
On Error GoTo 0End Sub
Ví dụ: Tạo ứng dụng PowerPointSub GetPowerpoint()
Dim objApp AsObject
On Error Resume NextSet objApp = GetObject(, "Powerpoint.Application")
ElseOn Error GoTo ErrHandler
End If
With objApp.ActiveWindow.View.GotoSlide _
Index:=objApp.ActivePresentation.Slides
Chuyên đề VBA – HIENLTH 108108
If Err.Number <> 0 ThenErr.ClearOn Error GoTo ErrHandlerSet objApp =
CreateObject("Powerpoint.Application")With objApp
.Visible = True
.Presentations.AddEnd With
Index:=objApp.ActivePresentation.Slides.Add(Index:=1,Layout:=1).SlideIndex.ActivePresentation.Slides(1).Shapes.Title.TextFrame.Textrange.Text = "Hello!"End With
ErrHandler:Set objApp = NothingOn Error GoTo 0
End Sub
Ví dụ: Tạo ứng dụng AccessSub GetAccess()
Dim objApp As Object
On Error Resume NextSet objApp =
GetObject(, "Access.Application")
ElseOn Error GoTo
ErrHandlerEnd If
MsgBox "I have successfully bound to an Access application!"
Chuyên đề VBA – HIENLTH 109109
"Access.Application")
If Err.Number <> 0 ThenErr.ClearOn Error GoTo ErrHandlerSet objApp =
CreateObject("Access.Application")
objApp.Visible = True
bound to an Access application!"
ErrHandler:Set objApp = NothingOn Error GoTo 0
End Sub
Đại Học Sư Phạm Tp. Hồ Chí MinhĐại Học Sư Phạm Tp. Hồ Chí Minh
Chuyên đề VBA Chuyên đề VBA
VBA for PowerPoint
Đối tượng Presentation
• Tham chiếu đến đối tượng:– Presentations(1)– Presentations("Proposal.ppt")– ActivePresentation
• Mở 01 file trình chiếu:
Chuyên đề VBA – HIENLTH 111111
• Mở 01 file trình chiếu:– Presentations.Open(FileName)
• Thêm 01 file trình chiếu:– Presentations.Add(WithWindow)– Trong đó:
• WithWindow = True: Muốn file Hiển thị• WithWindow = False: Muốn file ẩn
Các thuộc tính của đối tượng Presentation
• Presentation.FullName: Đường dẫn và tên đầy đủ.
• Presentation.Name: Tên file trình chiếu.• Presentation.Path: Đường dẫn đến file trình
chiếu.
Chuyên đề VBA – HIENLTH 112112
chiếu.• Presentation.SlideMaster: Tham chiếu đến
đối tượng Slide Master• Presentation.TitleMaster: Tiêu đề Slide
Master
Các thuộc tính của đối tượng Presentation
• Presentation.Slides: Tham chiếu đến tập hợp các đối tượng Slides.
• Presentation.SlideShowSettings: Tham chiếu đến đối tượng SlideShowSetting
• Presentation.TitleMaster: Tiêu đề Slide
Chuyên đề VBA – HIENLTH 113113
• Presentation.TitleMaster: Tiêu đề Slide Master
• Presentation.PrintOut: In• Presentation.Save• Presentation.SaveAs kiểu
Đối tượng Slide
• Tham chiếu đến Slide:– ActivePresentation.Slides(1)– ActivePresentation.Slides("Slide1")– ActivePresentation.Slides.Range (Array("Slide1","Slide2"))
• Tạo mới 01 Slide:
Chuyên đề VBA – HIENLTH 114114
• Tạo mới 01 Slide:– Presentation.Slides.Add(Index, Layout)– Ví dụ:With ActivePresentation.Slides
.Add Index:=.Count + 1, Layout:=ppLayoutOrgchartEnd With
Các thuộc tính của Slide
• Slide.Background• Slide.Layout• Slide.Master• Slide.Name
Chuyên đề VBA – HIENLTH 115115
• Slide.Name• Slide.Shapes• Slide.SlideShowTransition
Các đối tượng trên 01 slide
• ActivePresentation.Shapes(1): Tham chiếu tới hình thứ 1 trên slide.
• Thêm hình:– Slide.Shapes.AddConnector– Slide.Shapes.AddCurve– Slide.Shapes.AddLabel– Slide.Shapes.AddLine
Chuyên đề VBA – HIENLTH 116116
– Slide.Shapes.AddLine– Slide.Shapes.AddMediaObject– Slide.Shapes.AddPicture– Slide.Shapes.AddPolyline– Slide.Shapes.AddShape– Slide.Shapes.AddTextbox– Slide.Shapes.AddTextEffect– …
Trình chi ếu
• Presentation.SlideShowSettings.Run• Đến slide kế tiếp:
SlideShowWindows(Index:=1).View.Next
• Đến slide thứ n:
Chuyên đề VBA – HIENLTH 117117
• Đến slide thứ n:SlideShowWindows(Index:=1).View.GotoSlide n
• Muốn ngừng (ngủ):Private Declare Sub Sleep Lib "kernel32" (ByVal
dwMilliseconds As Long)Sleep(1000)’Ngủ 1 giây
Đại Học Sư Phạm Tp. Hồ Chí MinhĐại Học Sư Phạm Tp. Hồ Chí Minh
Chuyên đề VBA Chuyên đề VBA
VBA for Access
Mô hình đối tượng củaActiveX Data Object
Chuyên đề VBA – HIENLTH 119119
Các phiên bản của ADO
• ADO bắt đầu từ phiên bản 2.0, được cài đặt cùng vớiMicrosoft Office 97
• Visual Studio 98 hoặc Microsoft Office 2000 đi kèmvới ADO 2.1
• Windows 2000 được cài đặt ADO 2.5• Microsoft Office XP có ADO 2.6
Chuyên đề VBA – HIENLTH 120120
• Microsoft Office XP có ADO 2.6• Windows XP được cài đặt ADO 2.7• Microsoft Office 2003 có ADO 2.8• ADO.NET là phiên bản dành cho người lập trình
Microsfot Visual Studio .NET và có cấu trúc khác vớicác phiên bản ADO trước đó.
Các bước chuẩn bị• Tạo tham chiếu: (Alt + F11) – Sử dụng ADO
– Tool / References– Chọn Microsoft ActiveX Data Object 2.8 Library
Chuyên đề VBA – HIENLTH 121121
Đối tượng Connection
1. Mục tiêu sử dụng, khai báo Connection2. Tạo kết nối tới CSDL3. Các loại Cursor4. Các thuộc tính thường dùng
Chuyên đề VBA – HIENLTH 122122
4. Các thuộc tính thường dùng5. Hành động Excute6. 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ảntrị 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 123123
Set CN = New ADODB. Connection
‘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 124124
• 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.ConnectionSet conn = CurrentProject.Connection
• Ở ngoài Access:Public conn As ADODB.ConnectionSet conn = New ADODB.Connection
Chuyên đề VBA – HIENLTH 125125
Set conn = New ADODB.Connectionconn.ConnectionString = "Provider =
Microsoft.Jet.OLEDB.4.0 ;Data Source=C:\Documents and Settings\HPT\Desktop\QLHS.mdb"
conn.CursorLocation = adUseClientconn.Open
Tạo kết nối với CSDL
• Kiểm tra kết nốiIf conn.State <> adStateOpen Then
MsgBox “Ket noi khong thanh cong”Else
MsgBox “Ket noi thanh cong”
Chuyên đề VBA – HIENLTH 126126
MsgBox “Ket noi thanh cong”End If
• Đóng kết nốiconn.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 127127
– Thiếu nhiều chức năng của các đối tượng ADO• 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 128128
– Xác định tập hợp các chức năng của Connection sẽ dùng
• 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 RecordDim rs As ADODB.RecordsetSet rs = new ADODB.Recordset• Mở:Recordset.Open Source, Connection, CursorType,
LockType, OptionsTrong đó:
Chuyên đề VBA – HIENLTH 129129
Trong đó:– 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 130130
– Recordset.CursorType– 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 131131
• adOpenKeySet– 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ựchiện hành động cập nhật (UpdateBatch)
• adLockOptimistic
Chuyên đề VBA – HIENLTH 132132
• adLockOptimistic– 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 133133
– Thường dùng trong quá trình di chuyển mẩu tin hiện hành, tìm kiếm,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 RecordsetSet rs = new ADODB.Recordset
rs.Open “HocSinh", conn
Chuyên đề VBA – HIENLTH 134134
rs.Open “HocSinh", conn ‘Thực hiện….rs.Close ‘Đóng kết nốiSet rs = Nothing
End Sub
Ví dụ 2
Sub RecordsetOpenTable_2()Dim rs As ADODB.Recordset ‘Khai báo biến RecordsetSet rs = new ADODB.RecordsetWith rs
.Source = “HocSinh“
Chuyên đề VBA – HIENLTH 135135
.ActiveConnection = conn
.OpenEnd Withrs.Close ‘Đóng kết nốiSet 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.RecordsetDim strSELECT As String
Chuyên đề VBA – HIENLTH 136136
Dim strSELECT As StringSet rs = new ADODB.RecordsetstrSELECT = "SELECT * FROM HocSinh WHERE
NoiSinh=‘KhanhHoa‘ ORDER BY TenHS;“rs.Open strSELECT, conn, adOpenKeysetrs.CloseSet 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 137137
Recordset(FieldIndex)
• Ví dụ:‘Sau khi mở kết nối, truy vấn SQLrs.Fields(“TenHS”) ’Lấy tên HSrs(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 138138
– Recordset.MovePrevious• 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 139139
– SkipRows: Tìm từ SkipRows mẫu tin tính từ vị trí 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ìmSub SearchRecordsWithFind()
Dim rs As ADBDO.RecordsetDim strCriteria As StringSet rs = new ADODB.RecordsetWith rs
.Source = “HocSinh“
.ActiveConnection = conn
.CursorType = adOpenKeyset
.OpenEnd With
Chuyên đề VBA – HIENLTH 140140
End With strCriteria = “NoiSinh=‘Khánh Hòa'“rs.Find strCriteriaDo While Not rs. EOF
MsgBox rs(“HoHS") & " " & rs(“TenHS") rs.Find strCriteria, 1
Loop rs.CloseSet rs = Nothing
End Sub
Thêm mới 01 mẫu tin (record)
rs.AddNewrs(“tên_trường") = “giá_trị“rs.UpdateVí dụ:
Chuyên đề VBA – HIENLTH 141141
Ví dụ:‘Khai báo kết nốirs.AddNewrs(“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 142142
• Gọi CancelUpdate khi EditMode=adEditNone sẽ có lỗi• 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ìmDo While Not rs.EOF
rs(“tên_trường") = “giá_trị“ rs.Updaters.Find điều_kiện_tìm, 1
LoopVí dụ:
Chuyên đề VBA – HIENLTH 143143
Ví dụ:dkTim = “NoiSinh = ‘Khánh Hà’ “rs.Find dkTimDo While Not rs.EOF
rs(“NoiSinh”) = “Khánh Hòa”rs.Updaters.Find dkTim, 1
Loop
Xóa 01 mẫu tin (record)
rs.Find điều_kiện_tìmIf Not rs.EOF Then
rs.Deleters.Update
End IfVí dụ:
Chuyên đề VBA – HIENLTH 144144
Ví dụ:dkTim = “MaHS = ‘HS001’ “rs.Find dkTimIf Not rs.EOF Then
rs.Deleters.Update
End If
Đại Học Sư Phạm Tp. Hồ Chí MinhĐại Học Sư Phạm Tp. Hồ Chí Minh
Chuyên đề VBA Chuyên đề VBA
VBA for Outlook
Bắt đầu sử dụng Outlook 2003
Chuyên đề VBA – HIENLTH 146146
Tùy chọn
Chuyên đề VBA – HIENLTH 147147
Gõ tên hiển thị trên Email
Chuyên đề VBA – HIENLTH 148148
Đặt địa chỉ Email
• Giả sử dùng Gmail
Chuyên đề VBA – HIENLTH 149149
Cài đặt thông số
• POP3• pop.gmail.com• smtp.gmail.com
Chuyên đề VBA – HIENLTH 150150
Cài đặt thông số
Chuyên đề VBA – HIENLTH 151151
Lựa chọn cách kết nối Internet
Chuyên đề VBA – HIENLTH 152152
Thông báo kết quả
Chuyên đề VBA – HIENLTH 153153
Giao diện Outlook 2003
Chuyên đề VBA – HIENLTH 154154
Cho phép dùng POP trong Gmail
Chuyên đề VBA – HIENLTH 155155
Bật POP
Chuyên đề VBA – HIENLTH 156156
Điều chỉnh cổng gửi/nhận thư
• Tools / Email Account
Chuyên đề VBA – HIENLTH 157157
Điều chỉnh cổng gửi/nhận thư
Chuyên đề VBA – HIENLTH 158158
Điều chỉnh cổng gửi/nhận thư
Chuyên đề VBA – HIENLTH 159159
Điều chỉnh cổng gửi/nhận thư
Chuyên đề VBA – HIENLTH 160160
Điều chỉnh cổng gửi/nhận thư
Chuyên đề VBA – HIENLTH 161161
Điều chỉnh cổng gửi/nhận thư
• POP3: 995• SMTP: 465
Chuyên đề VBA – HIENLTH 162162
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 163163
• Thêm, xóa, download attach• Sử dụng Outlook ở các ứng dụng khác
trong MS Office
Khai báo
Dim ns As NameSpaceDim ib As MAPIFolderSet ns = ThisOutlookSession.SessionSet ib = ns.GetDefaultFolder(olFolderInbox)
Chuyên đề VBA – HIENLTH 164164
Set ib = ns.GetDefaultFolder(olFolderInbox)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 FolderSub demo()
Dim ns As NameSpaceDim folder As MAPIFolderDim subfolder As MAPIFolder
' Dat namespace lam viecSet ns = ThisOutlookSession.Session
folder ns.FoldersFor Each folder In ns.FoldersMsgBox "TM cha: " & folder.NameIf folder.Folders.Count > 1 Then
For Each subfolder In folder.FoldersMsgBox subfolder.Name
Next 'subfolderEnd If
Next 'folder
Set ns = NothingEnd 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 166166
– HTMLBody: Nội dung thư dạng HTML– 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 167167
– Print Out– Send– Forward, Reply, ReplyAll
Gửi email đơn giản
Sub Send_First_Email() Dim mi As MailItemSet mi = Application.CreateItem(olMailItem)
mi.ToTo = "[email protected]"
Chuyên đề VBA – HIENLTH 168168
mi.ToTo = "[email protected]"mi.SubjectSubject = "Test email"mi.BodyBody = "test"
mi.SendSendEnd Sub
Ví dụ: Tạo email trả lời tự độngSub autoreply_Thanks()
Dim ns As NameSpaceDim oInbox As MAPIFolderDim msg As MailItem
'Tao doi tuong InboxSet ns = ThisOutlookSession.SessionSet oInbox = ns.GetDefaultFolder(olFolderInbox)
'Duyet các chua doc trong inboxFor Each msg In oInbox.Items
Chuyên đề VBA – HIENLTH 169169
For Each msg In oInbox.ItemsWith msg
If .UnRead ThenWith .Reply
.Subject = "THANKS FOR EMAIL"
.Body = "Thanks for email!!! Good luck!"
.SendEnd With
End IfEnd WithNext 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 170170
Attachment
• mi.Attachments.Add• mi.Attachments.FileName• mi.Attachments.Delete• mi.Attachments.SaveAs (Path)
Chuyên đề VBA – HIENLTH 171171
• mi.Attachments.SaveAs (Path)
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 172172
Khai báo sử dụng
Dim ol As Outlook.ApplicationSet ol = CreateObject("Outlook.Application")Dim ns As NameSpaceDim folder As MAPIFolder‘Thiết lập kết nối
Chuyên đề VBA – HIENLTH 173173
‘Thiết lập kết nốiSet 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 ở ExcelPublic Function SendEMail(Recipient As String, Subj As String, Body As String)
Dim App As ObjectDim Mail As Object
Set App = CreateObject("Outlook.Application")Set Mail = App.CreateItem(0)
With Mail.Subject = Subj ‘Tiêu đề thư
Chuyên đề VBA – HIENLTH 174174
.Subject = Subj ‘Tiêu đề thư
.Recipients.Add (Recipient) ‘Email người nhận
.Body = Body ‘Nội dung thưEnd WithMail.Send
Set Mail = NothingSet 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 175175
Recommended