- VBA (MS Word) - Tìm hiểu nhanh qua các ví dụ đơn giản
- VBA (MS Excel) - Tìm hiểu nhanh qua các ví dụ đơn giản
- Để hiển thị thẻ Developer
- Mở File -> Options
- Chọn Customize Ribbon
- Từ cột bên phải (Customize the Ribbon - Main Tabs), đánh dấu kiểm vào mục Developer
- Nhấn Ok
- Mở File -> Options
- Để mở cửa sổ lập trình VBA, nhấn tổ hợp phím Alt+F11, hoặc thực hiện:
- Mở thẻ Developer
- Nhấn nút Visual Basic
- Mở thẻ Developer
- Để tạo một Module, chọn lệnh Insert -> Module
- Hầu hết các lệnh dưới đây cần phải đặt trong một hàm hoặc thủ tục mới có thể chạy được, ví dụ
Mã: Chọn tất cả
Sub TenHam() X = 5 + 10 End Sub
- Cách tạo một nút trên thanh Ribbon để kích hoạt chạy chương trình:
- Mở File -> Options
- Chọn Customize Ribbon
- Từ cột bên trái (Choose commands from), chọn Macros
- Chọn chương trình cần thêm nút lệnh và nhấn nút Add >>
- Nhấn Ok
- Mở File -> Options
- Cách hiển thị nội dung tiếng Việt
- Lưu ý: Các cách làm dưới đây có thể sẽ không sử dụng được đối với các hộp thoại mặc định
- Cách 1
- Sử dụng bảng mã NCR Decimal trong Unikey, hoặc bảng mã tương tự trong các phần mềm khác
- Nhập nội dung vào chương trình (lúc này nội dung mà bạn thấy có thể sẽ không giống như những gì mà bạn đã nhập)
- Thực hiện điều chỉnh (nếu có): Thay thế toàn bộ nội dung có dạng
&#
XXXX
;
thành" & ChrW(
XXXX
) & "
- Ví dụ:
"Ti" & ChrW(7871) & "ng Vi" & ChrW(7879) & "t"
,"X" & ChrW(7917) & " l" & ChrW(237)
(Trong trường hợp này thì bỏ& "
sau cùng)
- Sử dụng bảng mã NCR Decimal trong Unikey, hoặc bảng mã tương tự trong các phần mềm khác
- Cách 2
- Thêm hàm sau đây vào chương trình (Nguồn Internet)
Mã: Chọn tất cả
Function UniConvert(text As String, InputMethod As String) As String Dim VNI_Type, Telex_Type, CharCode, temp, i As Long UniConvert = text VNI_Type = Array("a81", "a82", "a83", "a84", "a85", "a61", "a62", "a63", "a64", "a65", "e61", _ "e62", "e63", "e64", "e65", "o61", "o62", "o63", "o64", "o65", "o71", "o72", "o73", "o74", _ "o75", "u71", "u72", "u73", "u74", "u75", "a1", "a2", "a3", "a4", "a5", "a8", "a6", "d9", _ "e1", "e2", "e3", "e4", "e5", "e6", "i1", "i2", "i3", "i4", "i5", "o1", "o2", "o3", "o4", _ "o5", "o6", "o7", "u1", "u2", "u3", "u4", "u5", "u7", "y1", "y2", "y3", "y4", "y5") Telex_Type = Array("aws", "awf", "awr", "awx", "awj", "aas", "aaf", "aar", "aax", "aaj", "ees", _ "eef", "eer", "eex", "eej", "oos", "oof", "oor", "oox", "ooj", "ows", "owf", "owr", "owx", _ "owj", "uws", "uwf", "uwr", "uwx", "uwj", "as", "af", "ar", "ax", "aj", "aw", "aa", "dd", _ "es", "ef", "er", "ex", "ej", "ee", "is", "if", "ir", "ix", "ij", "os", "of", "or", "ox", _ "oj", "oo", "ow", "us", "uf", "ur", "ux", "uj", "uw", "ys", "yf", "yr", "yx", "yj") CharCode = Array(ChrW(7855), ChrW(7857), ChrW(7859), ChrW(7861), ChrW(7863), ChrW(7845), ChrW(7847), _ ChrW(7849), ChrW(7851), ChrW(7853), ChrW(7871), ChrW(7873), ChrW(7875), ChrW(7877), ChrW(7879), _ ChrW(7889), ChrW(7891), ChrW(7893), ChrW(7895), ChrW(7897), ChrW(7899), ChrW(7901), ChrW(7903), _ ChrW(7905), ChrW(7907), ChrW(7913), ChrW(7915), ChrW(7917), ChrW(7919), ChrW(7921), ChrW(225), _ ChrW(224), ChrW(7843), ChrW(227), ChrW(7841), ChrW(259), ChrW(226), ChrW(273), ChrW(233), ChrW(232), _ ChrW(7867), ChrW(7869), ChrW(7865), ChrW(234), ChrW(237), ChrW(236), ChrW(7881), ChrW(297), ChrW(7883), _ ChrW(243), ChrW(242), ChrW(7887), ChrW(245), ChrW(7885), ChrW(244), ChrW(417), ChrW(250), ChrW(249), _ ChrW(7911), ChrW(361), ChrW(7909), ChrW(432), ChrW(253), ChrW(7923), ChrW(7927), ChrW(7929), ChrW(7925)) Select Case InputMethod Case Is = "VNI": temp = VNI_Type Case Is = "Telex": temp = Telex_Type End Select For i = 0 To UBound(CharCode) UniConvert = Replace(UniConvert, temp(i), CharCode(i)) UniConvert = Replace(UniConvert, UCase(temp(i)), UCase(CharCode(i))) Next i End Function
- Sử dụng:
UniConvert("Tieesng Vieejt", "Telex")
- Thêm hàm sau đây vào chương trình (Nguồn Internet)
- Lưu ý: Các cách làm dưới đây có thể sẽ không sử dụng được đối với các hộp thoại mặc định
- Khai bái biến và hằng
Mã: Chọn tất cả
' ================================================= ' KHAI BÁO BIẾN & HẰNG ' ================================================= ' Câu lệnh dưới đây dùng để bắt buộc khai báo trước khi sử dụng biến Option Explicit ' Các kiểu dữ liệu thường dùng ' Byte, Boolean, Integer, Long, Single, Double ' Currency, Date, String ' Object, Variant Dim TenBien Dim TenBien As Byte Dim TenBien1, TenBien2 Dim TenBien1 As Integer, TenBien2 As Date ' Biến toàn cục thì sử dụng từ khóa Global ' Lưu ý: TenBienA sẽ có kiểu dữ liệu mặc định là Variant, TenBienB có kiểu dữ liệu là Date Dim TenBienA, TenBienB As Date Const TenHang As Integer = 10 Const TenHang1 As String = "Hello", TenHang2 As Long = 100 ' Mảng gồm 100 phần tử số nguyên Dim TenMang(1 to 100) As Integer ' Mảng dưới đây đồng nghĩa với (0 to 100) ' Trong trường hợp muốn tất cả mảng bắt đầu từ 1 theo mặc định ' Thì sử dụng lệnh: Option Base 1 Dim TenMang(100) As Integer ' Mảng nhiều chiều Dim TenMang(1 to 10, 1 to 10) As Integer
- Gán giá trị cho biến
Mã: Chọn tất cả
' ================================================= ' GÁN GIÁ TRỊ CHO BIẾN ' ================================================= ' Giá trị Date được đặt trong cặp dấu # ' CÁC PHÉP TOÁN ' Cộng: + ' Trừ: - ' Nhân: * ' Chia: / ' Lũy thừa: ^ ' Nối chuổi: & ' Chia lấy phần nguyên: \ ' Chia lấy phần dư: Mod ' Các phép toán Logic: Not, And, Or, XoR, Eqv, Imp TenBien = 10 TenBien = #01/01/2025# ' Gán giá trị 100 cho phần tử ở hàng thứ 3, cột thứ 4 TenMang(3,4)=100 ' Khai báo mảng nhưng chưa xác định số phần tử Dim TenMang() As Integer ' Xác định số phần tử trong khi sử dụng (xóa bỏ dữ liệu cũ) ReDim TenMang(10) ' Xác định số phần tử trong khi sử dụng (giữ lại dữ liệu cũ) ReDim Preserve TenMang(100)
- Các cấu trúc điều khiển
Mã: Chọn tất cả
' ================================================= ' CẤU TRÚC ĐIỀU KHIỂN ' ================================================= If 1 > 2 Then ' Nội dung công việc End If If 1 > 2 Then ' Nội dung công việc Else ' Nội dung công việc End If If 1 > 2 Then ' Nội dung công việc ElseIf 4 > 3 Then ' Nội dung công việc Else ' Nội dung công việc End If Select Case 60 Case 100 ' Nội dung công việc Case 50 ' Nội dung công việc Case Else ' Nội dung công việc End Select Do ' Nội dung công việc Loop Do While 1 > 2 ' Nội dung công việc Loop Do ' Nội dung công việc Loop While 1 > 2 Do Until 2 > 1 ' Nội dung công việc Loop For TenBien = 1 To 10 ' Nội dung công việc Next TenBien For TenBien = 1 To 10 Step 2 ' Nội dung công việc Next TenBien For Each TenBien In TenNhom ' Nội dung công việc Next TenBien
- Các hộp thoại
Mã: Chọn tất cả
' ================================================= ' HỘP THOẠI ' ================================================= TenBien = MsgBox("Nội dung", vbYesNoCancel + vbQuestion + vbDefaultButton1, "Tiêu đề") ' vbOKOnly ' vbOKCancel ' vbAbortRetryIgnore ' vbYesNoCancel ' vbYesNo ' vbRetryCancel ' vbCritical ' vbQuestion ' vbExclamation ' vbInformation ' vbDefaultButton1 ' vbDefaultButton2 ' vbDefaultButton3 ' vbDefaultButton4 ' vbApplicationModal ' vbSystemModal ' vbMsgBoxHelpButton ' vbMsgBoxSetForeground ' vbMsgBoxRight ' vbMsgBoxRtlReading TenBien = Application.InputBox("Nội dung", "Tiêu đề", Type:=8) ' 0: Công thức ' 1: Số ' 2: Chuổi ' 4: Logic ' 8: Tham chiếu ' 16: Giá trị lỗi ' 64: Mảng
- Hàm và thủ tục
Mã: Chọn tất cả
' ================================================= ' HÀM VÀ THỦ TỤC ' ================================================= Function TenThuTuc1() ' Nội dung công việc End Function Function TenThuTuc2(ThamSo As Integer, Optional ThamSoPhu As Boolean) ' Nội dung công việc End Function Function TenHam1() ' Nội dung công việc ' Kết quả trả về có thể có hoặc không TenHam1 = True End Function Function TenHam2(ThamSo As Integer) ' Nội dung công việc ' Kết quả trả về có thể có hoặc không TenHam2 = 100 End Function Function TenHam3(ThamSo As Long) As String ' Nội dung công việc ' Kết quả trả về có thể có hoặc không TenHam3 = "Hello" End Function Sub main() Const ThamSo = 100 TenThuTuc1 Call TenThuTuc1 TenThuTuc2(ThamSo) TenHam1 TenBien = TenHam1 TenHam2(ThamSo) End Sub
- Một số lệnh thường dùng liên quan đến kiểu dữ liệu Xâu kí tự
Mã: Chọn tất cả
' ================================================= ' MỘT SỐ LỆNH XỬ LÍ XÂU KÍ TỰ ' ================================================= TenBien = Join(TenMang, "PhanTach") TenBien = Left("Xâu kí tự", 2) TenBien = Right("Xâu kí tự", 3) TenBien = Mid("Xâu kí tự", 3, 7) TenBien = Len("Xâu kí tự") LTrim ("Xâu kí tự") RTrim ("Xâu kí tự") Trim ("Xâu kí tự") ' Tạo ra các khoảng trống Space(10) TenMang = Split("Xâu kí tự", " ") TenMang = StrConv("Xâu kí tự", vbUpperCase) ' vbLowerCase ' vbProperCase ' vbUnicode ' vbFromUnicode LCase ("Xâu kí tự") UCase ("Xâu kí tự") TenBien = String(10, "A") StrReverse ("ABC") Open "D:\TepXuat" For Output As #1 Print #1, "Hello"; Tab(10); "World" TenBien = Replace("Xâu kí tự Tìm kiếm", "Tìm kiếm", "Thay thế", 1, 100) TenBien = InStr("Xâu kí tự Tìm kiếm", "Tìm kiếm") TenBien = InStrRev("Xâu kí tự Tìm kiếm", "Tìm kiếm")
- Một số lệnh thường dùng liên quan đến kiểu dữ liệu số
Mã: Chọn tất cả
' ================================================= ' MỘT SỐ LỆNH XỬ LÍ SỐ ' ================================================= TenBien = Abs(-5.5) ' Làm tròn về số nhỏ hơn TenBien = Int(-5.5) ' Bỏ phần thập phân TenBien = Fix(-5.5) ' Tạo số thực ngẫu nhiên trong khoảng 0 đến 1 Rnd Rnd(1) ' Tạo số thực ngẫu nhiên (Cố định sau mỗi lần chạy) Rnd(-1) ' Lấy số ngẫu nhiên được tạo gần đây nhất Rnd(0) ' Tạo số nguyên ngẫu nhiên trong khoảng 50 và 100 TenBien = Int((100 - 50 + 1) * Rnd + 50) IsNumeric(TenBien) ' Định dạng số hiển thị: ' 5 số sau dấu thập phân; ' Có giữ phần nguyên đối với số nhỏ hơn 1 và lớn hơn -1; ' Không thay thế dấu âm bằng cặp dấu ngoặc; ' Có phân tách hàng nghìn, triệu,... TenBien = FormatNumber(-1234.5678, 5, vbTrue, vbFlase, vbTrue) ' Định dạng số hiển thị dạng phần trăm TenBien = FormatPercent(-1234.5678, 5, vbTrue, vbFlase, vbTrue) ' Định dạng số hiển thị dạng tiền tệ TenBien = FormatCurrency(-1234.5678, 5, vbTrue, vbFlase, vbTrue)
- Một số lệnh thường dùng liên quan đến kiểu dữ thời gian và ngày tháng
Mã: Chọn tất cả
' ================================================= ' MỘT SỐ LỆNH XỬ LÍ THỜI GIAN, NGÀY THÁNG ' ================================================= ' Lấy ngày tháng, thời gian hiện tại TenBien = Now ' Lấy ngày tháng hiện tại TenBien = Date ' Lấy thời gian hiện tại TenBien = Time ' Lấy số ngày trong tuần TenBien = Weekday("2/12/1969") ' Cộng thêm ngày tháng, thời gian ' yyyy: Năm; q: Quý; m: Tháng; ww: Tuần ' y: Ngày trong năm; d: Ngày; k: Ngày trong tuần ' h: Giờ; n: Phút; s: Giây TenBien = DateAdd("m", 2, "3-Jan-95") ' Khoảng cách ngày tháng, thời gian TenBien = DateDiff("m", "3-Jan-95", "15-Jul-95") ' Thành phần trong ngày tháng, thời gian TenBien = DatePart("m", "3-Jan-95") ' Tạo một giá trị ngày tháng TenBien = DateSerial(1969, 2, 13) ' Tạo một giá trị thời gian TenBien = TimeSerial(16, -15, 17) ' Chuyển xâu kí tự thành giá trị ngày tháng TenBien = DateValue("February 12, 1969") ' Chuyển xâu kí tự thành giá trị thời gian TenBien = TimeValue("4:35:17 PM") ' Lấy phần năm trong ngày tháng, thời gian TenBien = Year("February 12, 1969") ' Lấy phần tháng trong ngày tháng, thời gian TenBien = Month("February 12, 1969") ' Lấy phần ngày trong ngày tháng, thời gian TenBien = Day("February 12, 1969") ' Lấy phần giờ trong ngày tháng, thời gian TenBien = Hour("4:35:17 PM") ' Lấy phần phút trong ngày tháng, thời gian TenBien = Minute("4:35:17 PM") ' Lấy phần giây trong ngày tháng, thời gian TenBien = Second("4:35:17 PM") ' Định dạng hiển thị ngày tháng, thời gian ' vbShortTime, vbLongTime, vbLongDate, vbGeneralDate FormatDateTime("February 12, 1969", vbShortDate) ' Kiểm tra có phải là giá trị ngày tháng, thời gian hay không TenBien = IsDate("February 12, 1969") ' Chuyển số thành tên tháng TenBien = MonthName(3, True) ' Chuyển số thành tên ngày TenBien = WeekdayName(3, False) ' Lấy số giây kể từ 12 giờ đêm TenBien = Timer
- Một số lệnh thường dùng khác
Mã: Chọn tất cả
' ================================================= ' LỆNH THƯỜNG DÙNG KHÁC ' ================================================= ' Bỏ qua việc cập nhật hiển thị cho mỗi điều chỉnh (chỉ cập nhật sau khi đã hoàn thành một chức năng) Application.ScreenUpdating = False ' Bỏ qua các hộp thoại cảnh báo Application.DisplayAlerts = False ' Lấy thông tin đường dẫn đến tệp đang mở TenBien = Application.Path ' Tạo đối tượng liên kết CreateObject("Excel.Application").Wait (Now + TimeValue("00:00:05")) ' Lệnh nhảy GoTo TenNhan TenNhan: ' Nội dung công việc ' Lệnh thoát ' Exit Do ' Exit For ' Exit Function ' Exit Property ' Exit Sub ' Lệnh xử lí khi xảy ra lỗi On Error GoTo TenNhan On Error Resume Next On Error GoTo 0 IsArray(TenBien) ' Kiểm tra TenBien đã được khởi tạo hay chưa IsEmpty(TenBien) ' Kiểm tra tham số trong chương trình con có được đưa vào chưa IsMissing(TenThamSo)