MỤC LỤC 1 Bài 1: MARCRO trang 2 2 Bài 2: Biến – Kiểu dữ liệu trang 8 3Bài 3: Lệnh điều kiện (Conditional Statements) trang 9 4Bài 4: Lệnh vòng lặp (Loop Statements trang 18 5Bài 5: Mảng (Array) THỰC HÀNH TRÊN FILE HAMSO2.XLMS Private Sub CommandButton1_Click() row_number = 0 dem_kytu = 0 KYTU = Sheets(sheet1).Range(F3) Do DoEvents row_number = row_number + 1 CHU = Sheets(sheet1).Range(A row_number) If InStr(CHU, KYTU) > 0 Then dem_kytu = dem_kytu + 1 End If Loop Until CHU = MsgBox so ky tu xuat hien : dem_kytu lan End Sub
Trang 1MỤC LỤC
-Workbooks(“Seles.xls”).Worksheets(“Sheet1” ).Range(“B3”)
- Bạn có thể dùng ngoặc vuông [ ] để chọn vùng ô thay vì () So sánh với ví dụ như sau:
[A1:A3].Select là cách chọn vùng giống như Range(“A1:A3”).Select thay
input - output – inventory : nhập - xuất - tồn
Dim lastColumn As Integer
lastColumn = ActiveSheet.Cells(2, Columns.Count).End(xlToLeft).Column
MsgBox lastColumn
Sub TimKiem_Trich_loc_MoTieuKien()
' Xoa ket qua tim kiem truoc
' tim kiem cac dong thoa man dieu kien va copy qua sheet REPORT
Dim Datasheet As Worksheet
Dim reportsheet As Worksheet
Dim chonlua As String
Dim lr As Long
' Gan cac bien
Set Datasheet = Sheet1
Set reportsheet = Sheet4
If (Cells(i, 2) Like chonlua & "*") Then
Range(Cells(i, 1), Cells(i, 12)).Copy
reportsheet.Select
Range("A200").End(xlUp).Offset(1, 0).PasteSpecial xlPasteFormulasAndNumberFormats
Datasheet.Select ' Tro lai sheet1 (N1) và tim kiem
Trang 2Private Sub Worksheet_Change(ByVal Target As Range)
Dim KeyCells As Range
' The variable KeyCells contains the cells that will
' cause an alert when they are changed.
Set KeyCells = Range("A1:C10")
If Not Application.Intersect(KeyCells, Range(Target.Address)) _
Is Nothing Then
' Display a message when one of the designated cells has been
' changed
' Place your code here
MsgBox "Cell " & Target.Address & " has changed."
Using the Columns property without an object qualifier is equivalent to
using ActiveSheet.Columns If the active document isn't a worksheet,
the Columns property fails.
To return a single column, include an index in parentheses For
example, Columns(1) and Columns("A")return the first column.
Trang 4Đối với Excel 13 thì ta bât Ribbon Devoloper lên bằng cách
Customize ribbon-> clich chọn vào Developer
10
Lúc này trên excel sẽ xuất hiện 1 thẻ Developer
Khi nhấn thẻ Developer ta sẽ có Thẻ Record Macro/stop Macro
Và thẻ Use Relative Reference : sử dụng tham chiếu ô tường đối (quan hệ với vị trí ô được kích hoạt
ban đầu )
Macro security : Tùy chọn bảo mật macro ( cho phép chạy hay không )
Để thiếp lập chế độ Enable cho Macro ta thao tác như sau :
Trang 5Để vào cửa sổ soan thảo Lập trinh ( viết code ) ta có 2 cách lựa chọn thứ nhất nhấp vào cửa sổ Visual Basic hoặc nhấn phím tắt Alt+F11
Visual Basic(Alt+F11 ) : cửa sổ soạn thảo VBA
Trang 62 -GHI MACRO BẰNG RECORD MACRO, THỰC HIỆN MACRO
3-THỰC HIỆN(RUN) MACRO ĐÃ TẠO
Cách 1 : Thực hiện từ bảng điều khiển
Chọn Marco (Alt+F8) từ Ribbon Developer
Chọn Macro cần thực hiện và nhấn phím Run
Cách 2 : Thực hiện từ phím tắt
Bấm tổ hợp phím tắt đã đặt cho Macro để chạy Macro
Cách 3 : Thực hiện bằng cách Gán Macro vào đối tượng
Đối tượng có thể là các đối tượng được Insert (ảnh , hình vẽ …)
Hoặc có thể là đối tượng DATA FORM
ảnh , hình vẽ : NHẤP chuột phải vào hình ảnh, hoặc hình vẽ
Trang 7TẠO COMBOBOX :
TA tiên hành từ 1->7
LẬP TRINH VISUAL TRN EXCEL
HÀM NGƯỜI DÙNG (USER FUNCTIONS)
CÁCH BIÊN SOẠN VÀ SỬ DỤNG
Ta tạo ra bằng cách đưa ra những biểu thức hoặc dùng mã lệnh Visual Basic trong một Visual Basic Modul
Hàm được biên soạn trong cửa sổ modul theo mẫu :
Public Function TênHàm(danh sách đối số )
Các câu lệnh để tính trị cho hàm
End function
1)Nếu bảng tính đã có Modul sheet ,thì gọi lệnh tools –Marco-Visual basic Editor
-vào insert chọn Module hoặc insert –procedure
Trang 8Ví dụ viết chươn trình tính diện tích hình tam giác
public Function TAMGIAC(A, B, C)
Muốn thử chương trình có chạy hay không ta có Ctrl-G
Sau đó trong cửa sổ ta gõ ?tên chương trình cùng các đối số
Ví dụ ? TAMGIAC(3,4,5)
6
Lưu tên file này lại ,kể từ nay khi bạn mở file này sẽ cảnh giác bạn rằng bảng tính này chứa Macro , mà Marco thì có thể chứa Virus ,do đó Excel gợi ý sẵn là Disable Marco, nhưng bạn phải chọn Enable Macro thì các hàm tự biên mới hoạt động được
PHONG CẤP CHO HÀM
Sau khi viết xong ,ta hãy lưu bảng tính vào thư mục chỉ định
C:\Program Files\Microsoft Office\OFFICE11\Library
Mục save as type chọn Microsoft Excel Add-In
Mục file name gõ tên tập tin ví dụ MyUser
Các hàm này được phong cấp từ hàm cục bộ sang thành hàm toàn cục (global user functions )
Go và Browse chọn Add-Ins cần bổ sung vào Excel.)
Nhấp chọn MyUser-Ok
-Sử dụng user defined User -Insert-function- chọn user defined
Trang 9Function : Hàm là 1 tập hợp các câu lệnh để thực hiện 1 chức năng nào đó
Ví dụ: Viết 1 hàm đơn giản trên VBA.
Bước 1: Mở cửa sổ VBA.
Bước 2: Thêm 1 hàm có tên là Hello.
Bước 3: Gõ vào dòng lệnh sau:
MsgBox ("Chao ban, day là chuong trinh VBA dau tien cua toi!!!")
Khi đó trên cửa sổ VBA, bạn sẽ thấy kết quả như sau:
Bước 4: Kiểm tra (test) chức năng của hàm Hello.
Quay lại Excel, tại 1 ô b ất kỳ, gõ vào công thức sau: =Hello()
Bài 2: Biến – Kiểu dữ liệu
Biến (variable) là 1 vùng bộ nhớ dùng để lưu trữ 1 giá trị có tính tạm thời Trước khi sử dụng 1 biến, ta phải khai báo biến.
1) Cách khai báo biến
Dim <tên biến> As <kiểu> [,<tên biến> As <kiểu>]…
- tên biến : phải bắt đầu bằng 1 ký tự, dài tối đa 255 ký tự, không được có khoảng trắng và dấu chấm.
- kiểu (data type) : có nh ững kiểu sau:
Loại Tên kiểu Số byte Miền giá trị
Trang 10Ngày, giờ Date 8 01/01/100 to 31/12/9999
Ví dụ 1:
Dim diem As Single, phai As Boolean, ngay as Date
Dim ten As String
Chú ý: Bật chế độ bắt buộc phải khai báo biến trước khi dùng: tại cửa sổ VBA, click menu Tools
=> Options, rồi chọn Require Variable Declaration.
2) Các phép toán
- Cộng, trừ, nhân, chia : +, –, *, /
- Lũy th ừa : ^ VD: 6^2 -> 36
- Trả về số dư của phép chia: mod VD: 14 mod 3 -> 2
- Trả về thương số của phép chia: \ VD: 14 \ 3 -> 4
- Nối nhiều chuỗi: & VD: “abc” & “456” & “xyz” -> “abc456xyz”
Ví dụ 3: viết hàm trả về thương số của 1 phép chia
Public Function ThuongSo(SoBiChia As Integer, SoChia As Integer)
ThuongSo = SoBiChia \ SoChia
End Function
Chú ý:
- Khai báo tham số (argument / parameter): <tên tham số>As<kiểu>
Bài tập
1) Viết hàm trả về số dư của 1 phép chia.
2) Viết hàm nhận vào 1 số nguyên có 3 chữ số, tính tổng và tích của 3 chữ số ấy.
3) Viết hàm nhận vào 1 số tiền nguy ên, đổi số tiền ấy thành tờ 500, 20, và dư bao nhiêu.
4) Viết hàm nhận vào 1 thời gian tính theo giây, đổi sang dạng giờ:phút:giây.
(Gợi ý: các bài 2, 3, và 4 ta trả về 1 chuỗi)
Giải
Bt1
Public Function Duso(SoBiChia As Integer, SoChia As Integer)
Duso = SoBiChia Mod SoChia
End Function
Bt2
Public Function TongTich(So As Integer)
Dim tram As Integer, chuc As Integer, donvi As Integer
TongTich = ""
tram = So \ 100
chuc = (So \ 10) Mod 10
donvi = So Mod 10
TongTich = "Tong cac chu so la " & (tram + chuc + donvi)&chr(13)
TongTich = TongTich & ", Tich cac chu so la " & (tram * chuc * donvi)
End Function
Bt3
Trang 11Public Function DoiTien(SoTien As Integer)
Dim st50 As Integer, st20 As Integer, le As Integer
st50 = SoTien \ 50
st20 = (SoTien Mod 50) \ 20
le = (SoTien Mod 50) Mod 20
DoiTien = st50 &" to Nam muoi, " & st20 & " to hai muoi " & le & " tien le "
End Function
Bt4
Dim gio As Integer, phut As Integer
gio = Giay \ 3600
phut = (Giay Mod 3600) \ 60
Giay = (Giay Mod 3600) Mod 60
DoiGiay = gio &" gio, " & phut & " phut, " & Giay & " giay "
End Function
Bài 3: Lệnh điều kiện (Conditional Statements)
Lệnh điều kiện cho phép CPU thực thi 1 tập hợp lệnh trong những điểu kiện được định trước.
1) Điều kiện (Condition / Criterion)
- Điều kiện là những biểu thức so sánh và luôn trả về True hoặc False
Trang 12Ý nghĩa : thực thi các lệnh 1 khi đk1 đúng (True); ngược lại th ực thi các lệnh 2 khi đk2 đúng; …;
nếu tất cả các điều kiện đều sai (False) thì các lệnh else được thực thi.
Ví dụ 3: viết hàm nhận vào 1 số nguyên, cho biết số đó chẵn hay lẻ.
Public Function ChanLe(So As Integer)
If (So mod 2) = 0 then
Ví dụ 4: viết hàm nhận vào 1 số, cho biết số đó âm, dương, hay bằng 0.
Public Function Dau(So As Double)
Trang 13Select Case <biểu thức B>
Ví dụ 7: viết hàm nhận vào tháng và năm, cho biết tháng đó có bao nhiêu ngày?
Public Function SoNgay(Thang As Byte, Nam As Integer)
Dim sn As Byte, tmp As Integer
Select Case Thang
1) Viết lại ví dụ 3 và 4 bằng cách dùng SELECT.
2) Viết lại ví dụ 7 bằng cách dùng IF.
3) Viết hàm nhận vào 3 số Cho biết số lớn nhất ( dùng IF dạng 1 )
4) Viết hàm nhận vào 1 số nguyên có 3 chữ số, cho biết chữ số nhỏ nhất.
4b) Viết lại bằng cấu trúc If dạng 3
5) Viết hàm nhận vào 1 ngày Cho biết thứ trong tuần.
=CHOOSE(WEEKDAY("22/10/2016"),"CHỦ NHAT","Thu Hai","Thu Ba","Thu Tu","thu Nam","Thu Sau","Thu Bay")
6) Viết hàm nhận vào 1 năm Cho biết năm âm lịch.
(Hướng dẫn: năm âm lịch gồm can và chi.
Can:, Canh-0, Tân-1, Nhâm-2, Quí-3, Giáp-4, Ất-5, Bính-6, Đinh-7, M ậu-8, Kỷ-9
Chi: Thân-0, Dậu-1, Tuất-2, Hợi-3, Tí-4, Sửu-5, D ần-6, Mão-7, Thìn-8, Tỵ-9, Ngọ-10, Mùi-11,
7) Viết hàm nhận vào 2 số A và B Giải phương trình Ax + B = 0 Giai theo dang If 1 và If 2
(Hướng dẫn: nếu (A = 0) và (B = 0) thì phương trình có vô số nghiệm.
Nếu (A = 0) và (B <> 0) thì phương trình vô nghiệm.
Nếu (A <> 0) thì phương trình có nghiệm x = -B/A.)
8) Viết hàm nhận vào 3 số A, B và C Giải phương trình Ax2+ Bx + C = 0.
(Hướng dẫn: nếu (A = 0) thì giải phương trình Bx + C = 0.
Nếu (A <> 0)+ Tính = B2– 4AC
+ Nếu < 0 thì vô nghiệm
+ Nếu >= 0 thì có 2 nghiệm xác định bởi công thức
Trang 14Bt1)
(Ví dụ 3: viết hàm nhận vào 1 số nguyên, cho biết số đó chẵn hay lẻ.
Public Function ChanLe(So As Integer))
Public Function Chanle(so As Integer)
If (so Mod 2 = 0) Then
Chanle = "So chan"
Else: Chanle = "so le"
End If
Public Function Chanle(so As Integer)
Select Case (so Mod 2)
Case 0: Chanle = "So chan"
Case 1: Chanle = "so le"
End Select
End Function
BT2)
Public Function SoNga(Thang As Byte, Nam As Integer)
Dim sn As Byte, tmp As Integer
If (Thang = 1) Or (Thang = 3) Or (Thang = 7) Or (Thang = 8) Or (Thang = 10) Or (Thang = 12) Then
Public Function SoLN(a As Integer, b As Integer, c As Integer)
Dim max As Integer
max = a
If max < b Then max = b
If max < c Then max = c
SoLN = max
End Function
BT4)
Public Function NhoNhat(So As Integer)
4) Viet hàm nhan vào 1 so nguyên có 3 chu so, cho bit chu so nho nhat.
Dim tram As Byte, chuc As Byte, donvi As Byte
tram = So \ 100
chuc = (So \ 10) Mod 10
donvi = So Mod 10
NhoNhat = tram
If NhoNhat > chuc Then NhoNhat = chuc
If NhoNhat > donvi Then NhoNhat = donvi
4b) Ví d :ụ
so sánh 2 biến a, b
if( a > b) then'a lớn hơn b';
câu lệnh if có else
if(a > b) then'a lớn hơn b';
elseecho'b lớn hơn a';
câu lệnh if có elseif, else
Trang 15Public Function sosanh(a, b)
‘ câu lệnh if có else, elseif có lồng ghép phức tạp
Public Function maxx(a, b, c)
TH = NGAY & "/" & THANG & "/" & NAM
THU = Choose(Weekday("TH"), "CHU NHAT", "Thu Hai", "Thu Ba", "Thu Tu", "thu Nam", "Thu Sau",
"Thu Bay")
End Function
Bt6)
Public Function AmLich(Nam As Integer)
'Can:, Canh-0, Tân-1, Nhâm-2, Quí-3, Giáp-4, Ât-5, Bính-6, Dinh-7, Mau-8, Ky-9
Select Case Nam Mod 10
Case 0: Can = "Canh"
Case 1: Can = "Tân"
Case 2: Can = "Nhâm"
Case 3: Can = "Quí"
Case 4: Can = "Giáp"
Case 5: Can = "Ât"
Case 6: Can = "Bính"
Case 7: Can = "Dinh"
Case 8: Can = "Mau"
Case 9: Can = "Ky"
End Select
'Chi: Thân-0, Dau-1, Tuat-2, Hoi-3, Tí-4, Suu-5, Dan-6, Mão-7, Thìn-8, Ty-9, Ng?-10, Mùi-11,
Trang 16Select Case Nam Mod 12
Case 0: Chi = "Thân"
Case 1: Chi = "Dâu"
Case 2: Chi = "Tuât"
Case 3: Chi = "Hoi"
Case 4: Chi = "Ty"
Case 5: Chi = "Suu"
Case 6: Chi = "Dân"
Case 7: Chi = "Mão"
Case 8: Chi = "Thìn"
Case 9: Chi = "Ty."
Case 10: Chi = "Ngo."
Case 11: Chi = "Mùi"
End Select
AmLich = Can + Space(1) + Chi
End Function
Bt6 cach2)
Public Function AMLICH(Y)
Dim CAN, CHI
Dim N, M As Integer
CAN = Array("Canh", "Tan", "Nhm", "Qy", "Gip",”Ất", "Bính", "Đinh", "Mậu", "Kỷ")
CHI = Array("Thn", "Dậu", "Tuất", "Hợi", "Tý", "Sửu", “Dần", "Mo", "Thìn", "Tị", "Ngọ", "Mi")
Trang 17Áp dụng vào các sheet trên Excel HÀM IF
Public Sub TEST()
With Sheets("a") ‘ Tại Sheet a, nếu ký tự đầu tiên ở Ô C7 là 1 thì đến Ô J9
If Left(.Range("C7"), 1) = 1 Then ‘ viết vào ký tự 1, nếu không phải thì viết vào ký tự 3 Range("J9") = 1
Private Sub COMMAND()
Dim FirstNum, secondnum As Single
FirstNum = Cells(1, 1).Value
secondnum = Cells(1, 2).Value
If FirstNum > secondnum Then
Trang 18MsgBox " The First number is greater than the second number " ElseIf FirstNum < secondnum Then
MsgBox " The FirstNumber is less than the secon number "
Trang 19If c = 0 Then TextKetQua.Text = " pt Vo so nghiem " Else TextKetQua.Text = " pt VO NGHIEM " Else
Trang 20Bài 4: Lệnh vòng lặp (Loop Statements)
Lệnh vòng lặp cho phép thực thi các lệnh nhiều lần.
Loop Until <điều kiện D>
Ý nghĩa : thực thi các lệnh D cho đến khi điều kiện D đúng (True)
Ý nghĩa : khi điều kiện W còn đúng (True) thì thực thi các lệnh W.
Ví dụ 1 A : giải thích sự hoạt động của vòng lặp Do until… loop
Sub DoUntil_loop()
i = 1
Do Until i = 10 ' gioi han i=10 neu True thi thoat
Cells(i, 5) = i ' gia tri trong cac O tang dan
MsgBox i ' Hop Thong bao gia tri i
i = i + 1 ' cho gia tri tang dan
Loop
End Sub
Sub Doloop_until()
i = 1
Do ' gioi han i=10 neu True thi thoat
Cells(i, 5) = i ' gia tri trong cac O tang dan
MsgBox i ' Hop Thong bao gia tri i
i = i + 1 ' cho gia tri tang dan
Loop Until i = 10
End Sub
Trang 21Trong từng trường hợp cụ thể chúng có thể làm việc khác nhau, ta sử dụng vòng lặp Do Until …loop hoặc Do …loop Until để duyệt qua từng ô chứa tên học sinh, quê quán cho học sinh đó còn không nó sẽ
Range("B1").Offset(i, 1) = InputBox(" Nhâp Dia chi ")
Range("B1").Offset(i, 2) = InputBox(" Nhâp Que quan ")
Range("B1").Offset(i, 1) = InputBox(" Nhâp Dia chi ")
Range("B1").Offset(i, 2) = InputBox(" Nhâp Que quan ")
VdDoLoopUntil vẫn bắt nhập địa chỉ quê quan khi không có một em học sinh nào
Ví dụ 2: viết hàm nhận 1 số nguyên dương N, tính tổng và tích các số từ 1 đến N.
Tổng = 1 + 2 + 3 + … + N
Tích = 1x2x3x…xN = N!
Public Function TongTich(N As Integer)
Dim Tong As Integer, Tich As Double
Ví dụ 3: viết hàm nhận vào 1 số nguyên dương N, tính tổng các chữ số trong N.
Public Function TongChuSo(N As Integer)
Dim Tong As Integer, cs as Byte
Trang 22Ví dụ4:
Sub VD_DoW_Loop()
i = 1 ‘ Đặt i lúc đầu bằng 1
Do While i <= 10 ‘ Đặt giới hạn cho i, nếu False thì thoát
Cells(i,1) = i ‘ Gán i vào ô i = i + 1 „ Cho giá trị i tăng dần
MsgBox i ‘ Hộp thông báo giá trị i
1) Viết lại ví dụ 2 bằng cách sử dụng vòng lặp Do.
Ví dụ 2: viết hàm nhận 1 số nguyên dương N, tính tổng và tích các số từ 1 đến N.
Do
<các lệnh D>
Loop Until <điều kiện D>
2) Viết hàm nhận vào 1 số nguy ên dương N, tìm chữ số nhỏ nhất trong N.
Hướng dẫn:Public Function Nho_Nhat(N As Integer)
Vòng While…wend
3) Viết hàm nhận vào 1 số nguy ên dương N, tính tổng các số lẻ nhỏ hơn hoặc bằng N.
Public Function TongLe(N As Integer)
5) Viết hàm nhận vào 1 số nguy ên dương N Tính S = 1 + 1/2! + 1/3! + … + 1/n!
Hướng dẫn:Public Function TongS(N As Integer)
2 Vòng for lồng nhau
Trang 23Public Function TongTich2(N As Integer)
'Viet lai ví du 2 bang cách su dung vòng lap Do.
Dim i, Tong As Integer, Tich As Double
Public Function Nho_Nhat(N As Integer)
Dim Tong, cs, Min As Integer
Public Function TongLe(N As Integer)
'Viet hàm nhan vào 1 so nguyên duong N, tính tong các so le nho hon hoac bang NDim i, Tong As Integer
4)Public Function Tich(N As Integer)
' Viet hàm nhan vào 1 so nguyên duong N, neu N le thì tính tích các so le <= n,' neu N chan thì tính tích các so chan <= n
Dim i, Tong As Integer, T As Double
5)Public Function TongS(N As Integer)
'5) Viet hàm nhan vào 1 so nguy ên duong N Tính S = 1 + 1/2! + 1/3! + … + 1/n!Dim i, j As Integer, S As Double
Trang 24Bài 5: Mảng (Array)
- Mảng là 1 dãy các biến có cùng kiểu dữ liệu Các biến trong mảng có cùng 1 tên gọi là tên mảng Các biến trong mảng được phân biệt với nhau thông qua 1 chỉ số (số nguyên) Mỗi biến trong mảng được gọi là phần tử.
1) Khai báo và sử dụng
- Khai báo 1 mảng: Tên mảng(n1 to n2) As kiểu
Ví dụ 1: Dim A(1 To 4) As Byte
Dim N(0 To 6) As Integer
Dim X(–2 To 4) As Double
- Các số 53, 27, 64, 12 là những giá trị của các phần tử có chỉ số là 1, 2, 3 và 4.
- Để lấy giá trị 1 phần tử, ta dùng cú pháp: Tên mảng(chỉ số)
- Để gán giá trị cho 1 phần tử, ta dùng cú pháp: Tên mảng(chỉ số) = giá trị
Ví dụ 2: A(2) = A(1) + A(4)*2
2) Mảng 2 chiều (bảng / ma trận)
- Mảng 2 chiều được cấu thành từ nhiều dòng và nhiều cột.
- Khai báo: Tên mảng(d1 to d2, c1 to c2) As kiểu
- Sử dụng: Tên mảng(chỉ số dòng, chỉ số cột)
Ví dụ 3: Dim M(1 To 3, 1 To 4) As Double
M(1, 3) = –2.5
3) Mảng có số phần tử thay đổi (mảng động/dynamic array )
- Khai báo: Tên mảng() As kiểu
- Xác định số phần tử của mảng: Redim Tên mảng(n1 to n2)
Public Function Tong(Ran As Range)
Dim d As Integer, c As Integer, sum As Double
Public Function Tim(Val As Double, Ran As Range)
Dim num As Integer, oCell As Range
num = 0
For Each oCell In Ran
If oCell.Value = Val Then
Trang 25Bt tìm điểm trên năm bôi đậm và tô màu xanh, giả sử ta có file Excel như sau
Ta viết đoạn code như sau
B2) Public Sub TBINH()
Dim Diachi As String
Dim Traloi As Integer
Dim Otinh As Range ‘ Range là một dảy ta chọn trên Ecel
Dim Vungchon As Variant ‘ Biến số Variant thường là một vùng chọn
Vungchon = Selection
Diachi = Selection.Address ‘ Hiên lên địa chỉ vùng chọn ví dụ $C$4: #G$12
Traloi = MsgBox(Diachi, vbYesNo) ‘ Hiên lên bảng thông báo Đia chỉ và chọn lựa Yes -No
If Traloi = 1 Then End
For Each Otinh In Selection.Cells
Trang 26Sẽ hiện lên bảng dữ liệu theo yêu cầu
Giải thích :
Trang 27c) Tìm phần tử lớn nhất trong mảng
Public Function LonNhat(Ran As Range)
Dim max As Double, v As Integer, d As Integer, c As Integer
Bài 6: Ứng dụng VBA trong Excel
Ví dụ 2: Đổi chữ thành chữ hoa của vùng chọn.
Public Function EV(X As Range, W As Range)
Dim i As Integer, sum As Double
sum = 0
For i = 1 To X.Columns.Count
Ví dụ 2: Đổi chữ thành chữ hoa của vùng chọn.
Public Sub Hoa()
Dim SelRan As Range, d As Long, c As Long, s As String
Set SelRan = Selection
Sub phải găn vào macro THÌ MỚI CÓ TÁC DỤNG
Cách đưa thủ tục Hoa thành 1 nút trên thanh Menu:
Bước 1: Right click trên thanh menu chọn Customize Quick Access Toolbar…
Bước 2: Tại ô Choose commands from, chọn Macros Click mục Hoa trong ô phía dưới Rồi click nút Add Click Ok.
Bước 3: Trên thanh menu sẽ xuất hiện 1 nút Hoa Khi click vào nút này thì thủ tục Hoa sẽ th ực thi Chú ý:
- Thủ tục (Sub) không trả về giá trị và không gọi th ực hiện trong công thứ
Ví dụ 3: Dùng hàm có sẵn trong Excel
Public Function Ex(Ran As Range)
Ex = Application.WorksheetFunction.Sum(Ran)
End Function
Public Sub Kieu()
'Ví dU 4: Thay DOI kiEu chU (Font)
Dim SelRan As Range
Set SelRan = Selection
With SelRan
Trang 28Ví dụ 5: Thay đ ổi đư ờng viền (Borders)
Public FUNCTION KeKhung(Ran As Range) Dim SelRan As Range
Set SelRan = Selection
With SelRan
.Borders.Item(xlEdgeBottom).LineStyle = 1 Borders.Item(xlEdgeTop).LineStyle = 1
.Borders.Item(xlEdgeLeft).LineStyle = 1
.Borders.Item(xlEdgeRight).LineStyle = 1
.Borders.Item(xlInsideHorizontal).LineStyle = 1 Borders.Item(xlInsideVertical).LineStyle = 1 Borders.Item(xlDiagonalDown).LineStyle = 1 Borders.Item(xlDiagonalUp).LineStyle = 1 End With
End Sub
Nếu muôn tạo thành Maceo THÌ VIẾT NHƯ SAU Public Sub KeKhung()
Dim SelRan As Range
Set SelRan = Selection
With SelRan
.Borders.Item(xlEdgeBottom).LineStyle = 1 Borders.Item(xlEdgeTop).LineStyle = 1
.Borders.Item(xlEdgeLeft).LineStyle = 1
.Borders.Item(xlEdgeRight).LineStyle = 1
.Borders.Item(xlInsideHorizontal).LineStyle = 1 Borders.Item(xlInsideVertical).LineStyle = 1 Borders.Item(xlDiagonalDown).LineStyle = 1 Borders.Item(xlDiagonalUp).LineStyle = 1 End With
End Sub
Trang 29Call < tên thủ tục >[(< danh sách tham số truyền >)]
< tên biến > = < tên hàm >[(< danh sách tham số truyền >)]
3) Cách định nghĩa tham số trong thủ tục / hàm
ByVal < tên tham số > As < kiểu >, …
hoặc ByRef < tên tham số > As < kiểu >, …
- ByVal : tham số có kiểu giá trị (tham trị), có 2 đặc điểm sau:
+ Khi truy ền cho phép truyền giá trị hoặc biến.
+ Khi tham số bị thay đổi giá trị bởi những câu lệnh bên trong thủ tục định nghĩa nó, thì biến truy ền tương ứng sẽ không bị thay đổi.
- ByRef : tham số có kiểu biến (tham biến), có 2 đặc điểm sau:
+ Khi truyền chỉ nên truy ền biến.
+ Khi tham số bị thay đổi giá trị bởi những câu lệnh bên trong thủ tục định nghĩa nó thì biến
truy ền tương ứng sẽ bị thay đổi theo.
Ví dụ 1:
Public Function ThamTri()
Dim y As Integer, s As String
Public Function ThamBien()
Dim y As Integer, s As String
Public Function ThamBienM()
Dim y(1 To 5) As Integer, i As Integer
Trang 304) Tầm ảnh hưởng của các biến
- Biến cục bộ / tham số được khai báo trong thủ tục, hàm
+ Biến cục bộ chỉ được sử dụng đối với các câu lệnh trong thủ tục định nghĩa ra nó.
+ Biến cục bộ chỉ tồn tại trong bộ nhớ khi thủ tục được thực hiện.
+ Biến toàn cục Module được sử dụng đối với tất cả các câu lệnh trong Module.
+ Biến toàn cục Module tồn tại trong bộ nhớ khi workbook được mở.
Ví dụ 5:
Option Explicit
Dim TC As Integer ‘ TC là biến toàn cục Module
Public Function Test1()
Ví dụ 6:
Option Explicit
Dim TC As Integer ‘ TC là biến toàn cục Module
Public Function Test1()
Trang 31Bài 8: Hộp đối thoại
1) Phương pháp lập trình
Sau khi có lời giải của bài toán ở dạng ngôn ngữ tự nhiên, ta sẽ tiến hành tổ chức chương trình sao cho dễ phát triển, kiểm tra, nâng cấp, và làm theo nhóm Dưới đây ta trình bày sơ lược 3 phương pháp.
a) Lập trình theo hướng thủ tục/hàm (Procedural Programming)
+ Chương trình được chia thành nhiều thủ tục và hàm.
+ Mỗi thủ tục/hàm thực hiện 1 chức năng nào đó.
+ Mỗi thủ tục/hàm bao gồm 1 số câu lệnh nào đó để thực thi chức năng của nó.
+ Khi tên của thủ tục/hàm được gọi thì chức năng của thủ tục/hàm đó được thực hiện (các câu lệnh của thủ tục/hàm được thực thi).
+ Mỗi th ủ tục/hàm nên có tham số để chúng trở nên linh động và tổng quát.
b) Lập trình theo hướng đối tượng (Object Oriented Programming–OOP)
+ Chương trình được chia thành nhiều đối tượng.
+ Đối tượng là 1 thực thể có thật trong cuộc sống như: sinh viên, toán, cái bàn, đường tròn, … + Một đối tượng được cấu tạo bởi thuộc tính (property/attribute) và phương thức (method).
+ Thuộc tính là những tính chất mô tả đối tượng.
+ Phương thức (cũng là thủ tục/hàm) là những chức năng của đối tượng.
+ Ví dụ: Xét đối tượng hình tròn thì
Thuộc tính: bán kính, màu đường viền, màu tô, …
Phương thức: lấy bán kính hiện tại, thay đổi bán kính, tô màu nền, tô màu đường viền, …
+ Khi muốn sử dụng thuộc tính/phương thức của 1 đối tượng, ta dùng cú pháp: đối tượng.thuộc tính, đối tượng.phương thức
c) Lập trình theo hướng sự kiện (Event Driven Programming)
+ Đây là sự mở rộng của OOP nhưng thêm khái niệm sự kiện/biến cố (Event).
+ Sự kiện (cũng là thủ tục/hàm) là những tác động từ môi trường bên ngoài lên đối tư ợng mà đối tượng có thể hiểu.
+ Ví dụ: xét đối tượng nút lệnh (command button) thì các sự kiện là: click, right click, mouse move + Khi lập trình theo hướng này, thì ta chủ yếu viết các câu lệnh cho sự kiện cần thiết Nghĩa là dạy đối tượng cách ứng xử với tác động từ bên ngoài.
+ Các câu lệnh của 1 sự kiện chỉ được thi hành khi sự kiện đó được kích hoạt.
2) Form
+ Form là 1 cửa sổ Để thêm 1 Form, click menu Insert => UserForm.
+ Một vài thuộc tính quan trọng của Form:
Name: tên của Form (dùng để viết code)
Caption: chuỗi ký tự xuất hiện trên thanh tiêu đề của Form
+ Một vài sự kiện quan trọng của Form:
Activate: khi Form được kích hoạt
Terminate: khi đóng Form.
Ví dụ 1: Tạo 1 Form với các sự kiện sau:
Activate: hiển thị Hello
Terminate: hiển thị Bye Bye
MouseMove: thay đổi màu nền của Form.
Bước 1: Insert -> UserForm Sau đó đặt thuộc tinh Name là frmDemo.
Bước 2: Double click trên Form để mở cửa sổ viết sự kiện cho Form Rồi sau đó chọn sự kiện cần
viết code tại ô này
Trang 32Bước 3: viết code cho 3 sự kiện như sau
Private Sub UserForm_Activate()
Private Sub UserForm_Terminate()
MsgBox ("Bye Bye")
End Sub
Bước 4: viết hàm sau trong 1 Module.
Public Sub TestForm()
Caption: chuỗi ký tự xuất hiện trên nút lệnh
Enabled = True / False các sự kiện được / không được kích hoạt
Visible = True / False hiển thị / ẩn
+ Một vài sự kiện quan trọng của Form:
Click: sự kiện này xảy ra khi người dùng click chuột trên nút lệnh.
4) Label: hiển thị chuỗi ký tự tĩnh (ng ười dùng không thể thay đ ổi) Thuộc tính Caption chứa chuỗi ký
tự hiển thị.
5) TextBox: hiển thị chuỗi ký tự mà người dùng có th ể thay đ ổi.
+ Một vài thuộc tính quan trọng:
Text: chuỗi ký tự hiển thị.
Font: font chữ.
ForeColor: màu chữ.
MaxLength: số ký tự tối đa (=0 nghĩa là không giới hạn).
MultiLine = True / False nhiều dòng / 1 dòng.
Ví dụ 2: chia các ô trong vùng chọn bởi 1 số.
Bước 1: Tạo Form như hình sau.
Bước 2: Viết các sự kiện sau.
Private Sub cmdCancel_Click()
Unload frmPhepChia
End Sub
Private Sub cmdOk_Click()
Dim SoChia As Double, cell As Range
SoChia = CDbl(txtSoChia.Text)
For Each cell In Selection
cell.Value = cell.Value / SoChia
Next cell
End Sub
Trang 33Name = txtSoChia
Name = cmdCancel Name = cmdOk
Name = frmPhepChia
Dấu tách thập phân hợp lệ duy nhất mà hàm Val () có thể nhận dạng là dấu chấm (.) Nếu bạn sử dụng
một dấu tách thập phân khác, như một số ứng dụng quốc tế dùng, hãy dùng hàm CDbl để thay thế
Bước 3: Viết thủ tục sau trong 1 Module.
Public Sub PhepChia()
frmPhepChia.Show
End Sub
Bước 4: Đưa thủ tục PhepChia ở bước 3 lên thanh công cụ.
+ Right click trên thanh menu chọn Customize Quick Access Toolbar…
+ Tại ô Choose commands from, chọn Macros Click mục PhepChia trong ô phía dưới Rồi click nút Add Click Ok.
+ Trên thanh menu sẽ xuất hiện 1 nút PhepChia Khi click vào nút này thì thủ tục PhepChia sẽ thực thi.
6) OptionButton / CheckBox : chọn 1 mục duy nhất / chọn nhiều mục cùng lúc.
+ Một vài thuộc tính quan trọng:
Value = True / False ⇔ chọn / không chọn.
Caption : chữ hiển thị.
Ví dụ 3 : đổi chữ hoa/thường cho các ô trong vùng chọn.
Bước 1: Tạo Form như hình sau.
Bước 2: Viết các sự kiện sau.
Private SubcmdClose _ Click ()
Unload frmChangeCase
End Sub
Private SubopbLower _ Click ()
Dim cell As Range
For Each cell In Selection
cell.Value = LCase(cell.Value)
Next cell
End Sub
Private SubopbProper _ Click ()
Dim cell As Range
Trang 34For Each cell In Selection
cell.Value = Application.WorksheetFunction.Proper(cell.Value)
Next cell
End Sub
Private SubopbUpper _ Click ()
Dim cell As Range
For Each cell In Selection
cell.Value = UCase(cell.Value)
Next cell
End Sub
7) ListBox : hiển thị 1 danh sách các mục ( item ).
+ Một vài thuộc tính quan trọng:
MultiSelect :
0 : chỉ được chọn 1 mục.
1 : cho phép chọn nhiều mục bằng cách click vào các mục cần chọn.
2 : cho phép chọn nhiều mục bằng cách nhấn CTRL hoặc SHIFT và click vào các mục cần chọn
ListCount : tổng số mục có trong ListBox.
List : là mảng kiểu chuỗi, các phần tử được đánh chỉ số từ 0 đến (ListCount –1) Mỗi phần tử giữ
chuỗi ký tự của 1 mục.
Selected : đây là 1 mảng kiểu Boolean với số phần tử giống như thuộc tính List.
Selected(i) = true ⇔ List(i) được chọn
Selected(i) = false ⇔ List(i) không được chọn
+ Một vài phương thức :
Xóa tất cả các mục: <Tên ListBox> Clear
Thêm 1 mục vào ListBox: <Tên ListBox> AddItem < chuỗi >
Xóa 1 mục: <Tên ListBox> RemoveItem < index >
Ví dụ 4 :
Trang 35Bước 1: Tạo Form có Name là frmListBox như hình sau.
Bước 2: Viết các sự kiện sau.
Private SubcmdAdd _ Click ()
Trang 36Cấu trúc lệnh IF <ĐIỀU KIÊN >
Cấu trúc câu lệnh IF trong VBA sẽ giống như thế này:
Public Function VND(BAONHIEU)
Dim Ketqua, Sotien, Nhom, Dich, S1, S2, S3 As String
Dim I, j, Vitro As Byte, S As Double
Dim Hang, Doc, Dem
Sotien = Right(Space(15) & Sotien, 18)
Hang = Array("None", "trăm", "mươi", "gì đó")
Doc = Array("None", "ngàn tỷ", "tỷ", "triệu", "ngàn", "đồng", "xu")
Dem = Array("None", "một", "hai", "ba", "bốn", "năm", "sáu", "bảy", "tám", "chín") For I = 1 To 6
Nhom = Mid(Sotien, I * 3 - 2, 3)
If Nhom <>Space(3) Then
Select Case Nhom
Case "000"
Trang 37Dich = "mười" &Space(1)
Case 3 And S = 0 And Nhom <>Space(2) & "0"
Dich = Hang(j) & Space(1)
Case 3 And S = 5 And S2 <>Space(1) And S2 <> "0" Dich = "l" &Mid(Dich, 2) & Space(1)
Case 2 And S = 0 And S3 <> "0"
If (S1 >= "1" And S1 <= "9") Or (S1 = "0" And I = 4) Then Dich = "lẻ" &Space(1)
vitri = InStr(1, chu, "mươi một", 1)
If vitri > 0 Then Mid(chu, vitri, 9) = "mươi mốt"
Ketqua = Ketqua &chu
Public Sub TBINH()
Dim Diachi As String
Dim Traloi As Integer
Dim Otinh As Range
Dim Vungchon As Variant
Vungchon = Selection
Diachi = Selection.Address
Traloi = MsgBox(Diachi, vbYesNo)
Trang 38If Traloi = 1 Then End
For Each Otinh In Selection.Cells
If Val(Otinh.Value) >= 5 Then With Otinh.Font
Trang 39I4 :=ROUND(((C4*D4)+TAMGIAC(E4,F4,G4))*$C$25,-2)
J4 :=VLOOKUP(H4,DMT,2,0)
K4 :=ROUND(J4*I4,2)
K17:="kết toán số tiền là "&VND(K4)
Phím tắt để hiện ALT+F11 sẽ hiện lên cử sổ Microsoft Visuabasic
Phím tắt Alt+F8 ĐỂ hiện bảng Macro.