32 C
Ho Chi Minh City
Friday, June 6, 2025
AIPHOGPT.COM
Trang chủ Blog Trang 199

VBA Excel Function and Sub Excel VBA

1. Cấu trúc

[Public | Private | Static] Function / Sub 

 

    Line(s) code 

End Function / Sub

Function/ End Function: Bắt đầu/ kết thúc một hàm.

Sub/ End Sub: Bắt đầu/ kết thúc một thủ tục.

Các từ khóa Public, Private, Static để xác định phạm vi (tầm vực) của Function/ Sub.

- Public: phạm vi toàn cục, ở đâu trong môi trường VBA Project cũng có thể thấy / dùng được.

Ví dụ:

'Module1:
Public Sub Vidu()
    MsgBox "Day la mot public_sub."
End Sub
'Module2:
Sub CallPublicSub()
    Call Vidu
    'Hoac:'
    Module1.Vidu
End Sub

- Private: phạm vi nội bộ, các Function/ Sub khác trong cùng môi trường VBA Project mới thấy/ dùng được.

Ví dụ:

'Module1:
Private Sub Vidu()
    MsgBox "Day la mot private_sub."
End Sub

'Module2:
Sub CallPrivateSub1()
    Call Vidu
    'Hoac:'
    'Module1.Vidu'
    'Ket qua: Xay ra loi - "Sub or Function not defined" '
End Sub

Tuy nhiên, có cách để gọi một Function/ Sub từ một Module khác được khai báo Private.

Tiếp ví dụ trên:

'Module2:
Sub CallPrivateSub2()
    'Cach goi toi mot Private Sub'
    Run "Module1.Vidu"
End Sub

- Static: Phạm vi toàn cục, ở đâu trong môi trường VBA Project cũng có thể thấy / dùng được.
Đặc biệt, các biến được khai báo trong Static Sub/ Function được lưu giá trị cho tới khi thoát ứng dụng.
Ví dụ:

'Module1:
Static Sub Vidu()
    Dim a As Long
    a = a + 10
    MsgBox a
    'Chay sub nay 3 lan, bien a van duoc luu gia tri sau cac lan chay sub:'
    'Lan 1: a=10'
    'Lan 2: a=20'
    'Lan 3: a=30'
End Sub
'Module2:
Sub CallStaticSub()
    Call Vidu
    'Chay sub nay sau khi chay sub Module1.Vidu'
    'Hoac:'
    Module1.Vidu
End Sub

 

2. Function

Cấu trúc:

[Public | Private | Static] Function([ByVal / ByRef | Arguments As type of variables]) [As type of variables] 

 

    Line(s) code 

End Function

Function/ End Function: Bắt đầu/ kết thúc một hàm.

Public | Private | Static: Không bắt buộc. Các từ khóa để xác định phạm vi (tầm vực) của Function.

ByVal / ByRef: Không bắt buộc. Kiểu truyền đối số cho hàm. Mặc định là ByRef (kiểu tham chiếu).

Arguments As type of variables: Không bắt buộc. Các đối số của hàm, và kiểu dữ liệu khai báo tương ứng với đối số.

[As type of variables]: Không bắt buộc. Kiểu dữ liệu của kết quả trả về của hàm. Không khai báo thì kết quả của hàm có kiểu dữ liệu được gán vào.

Ví dụ: 

'//Hàm tách ho tên
Function TachHoTen(ByVal chuoi As String) As Variant
    'Loai khoang trang dâu và cuôi chuôi:'
    chuoi = Trim(chuoi)
    Dim arrTmp As Variant, mangKQ()
    'Cat chuoi hoten bang dâu phân cách: khoang trang'
    arrTmp = Split(chuoi, " ")  'Ket qua tra ve là môt mang 1 chiêu gôm các chu phân cach boi khoang trang'
    ReDim mangKQ(1 To 3)
    mangKQ(1) = arrTmp(LBound(arrTmp))  'Ho'
    mangKQ(3) = arrTmp(UBound(arrTmp))  'Ten'
    mangKQ(2) = Mid(chuoi, Len(mangKQ(1)) + 2, Len(chuoi) - Len(mangKQ(1) & mangKQ(3)) - 2) 'Dem'
    mangKQ(2) = Trim(mangKQ(2)) 'Loai khoang trang nêu có.'
    TachHoTen = mangKQ          'Gán kêt qua cho Function'
End Function

Công thức trên bảng tính:

=INDEX(TachHoTen($A5),1) ‘Tra ve ho

=INDEX(TachHoTen($A5),2) ‘Tra ve ten dem

=INDEX(TachHoTen($A5),3) ‘Tra ve ten

Ví dụ:

'//Tính thê tích khôi hôp
Function TheTichHop(ByVal x As Double, ByVal y As Double, ByVal z As Double) As Double
    TheTichHop = x * y * z
End Function

Công thức trên bảng tính:

=TheTichHop(10,20,34)

=TheTichHop(B9, B10, B11)

3. Sub

sub function lequocthai.com
Sub function lequocthai.com

Cấu trúc:

[Public | Private | Static] Sub([ByVal / ByRef | Arguments As type of variables]) 

 

    Line(s) code 

End Sub

Sub/ End Sub: Bắt đầu/ kết thúc một Sub.

Public | Private | Static: Không bắt buộc. Các từ khóa để xác định phạm vi (tầm vực) của Sub.

ByVal / ByRef | Arguments As type of variables: Không bắt buộc. Các đối số của Sub. ByVal / ByRef là các kiểu truyền đối số.

Ví dụ:

Sub TachHoVaTen() 'Tách ho và tên'
    Dim chuoi, Tmp
    chuoi = Trim(Sheet1.Range("A5").Value)
    Tmp = Split(chuoi, " ")  'Ket qua tra ve là môt mang 1 chiêu gôm các chu phân cach boi khoang trang'
    Sheet1.Range("F5").Value = Tmp(LBound(Tmp))
    Sheet1.Range("H5").Value = Tmp(UBound(Tmp))
    Sheet1.Range("G5").Value = Mid(chuoi, Len(Tmp(LBound(Tmp))) + 2, Len(chuoi) - Len(Tmp(LBound(Tmp)) & Tmp(UBound(Tmp))) - 2)
End Sub

‘—————-‘

Sub TheTich()   'Tính thê tích khôi hôp'
    Dim x As Double, y As Double, z As Double
    x = Sheet1.Range("B9").Value
    y = Sheet1.Range("B10").Value
    z = Sheet1.Range("B11").Value
    MsgBox "Thê tích khôi hôp: " & x * y * z & " dvtt."
End Sub

‘—————-‘

Sub ScreenAndCal_ON()
    Dim i As Long, T As Double
    'Lây gôc thoi gian chay code:'
    T = Timer

 

    ‘Bât tang tôc cho code’
    SpeedCode True  ‘Goi môt thu tuc con’
    ‘Vòng lap gan sô thu tu: 1 – 100 000’
    For i = 1 To 100000
        Sheet1.Range(“E” & i).Value = i
    Next i

    ‘Tat tang tôc cho code’
    SpeedCode False ‘Goi môt thu tuc con’

    'Thoi gian hoàn thành:'
    MsgBox Round(Timer - T, 2) & " giây"    'T=2.62 giây'
End Sub

‘————–‘

Public Sub SpeedCode(ByVal OnOff As Boolean) 'Dây là môt thu tuc con'
With Application
    If OnOff = True Then        'Nêu chon là True'
        .ScreenUpdating = False     'Vô hiêu hóa câp nhât màn hình'
        .Calculation = xlCalculationManual      'Tính toán thu công'
    Else   'Nêu chon là False'
        .ScreenUpdating = True      'Câp nhât màn hình'
        .Calculation = xlCalculationAutomatic   'Tu dông tính toán'
    End If
End With
End Sub

4. ByVal / ByRef

Là 2 kiểu truyền đối số cho Function/ Sub.

ByVal: Truyền đối số kiểu truyền giá trị.

ByRef: Truyền đối số kiểu tham chiếu

Mặc định, trong VBA truyền đối số kiểu tham chiếu ByRef.

Ví dụ:

Sub Test_ByValRef()
    Dim x As Long, y As Long
    x = 50
    y = 50
    MsgBox "By_Ref = " & By_Ref(x) & vbNewLine & "x = " & x      'By Ref_1 = 500 | x = 500
    MsgBox "By_Val = " & By_Val(y) & vbNewLine & "y = " & y      'By Val_2 = 500 | y = 50
End Sub

‘————-‘

FFunction By_Ref(ByRef n As Long) As Long
    n = 10 * n
    By_Ref = n
End Function

‘————-‘

Function By_Val(ByVal n As Long) As Long
    n = 10 * n
    By_Val = n
End Function

Chú thích:

– Với Function By_Ref():

Truyền đối số bằng tham chiếu (ByRef), tức là ta đang tham chiếu tới giá trị gốc. Giá trị của n (giá trị ban đầu) được thay đổi trong hàm. (Ví dụ trên: Sau khi truyền đối số thì x = 500).

– Với Function By_Val():

Truyền đối số bằng giá trị, tức là ta chỉ lấy giá trị của đối số (copy value), chứ không làm thay đổi giá trị ban đầu của đối số. Giá trị của n (giá trị ban đầu) vẫn giữ nguyên không đổi. (Ví dụ trên: Sau khi truyền đối số thì y =50).

 5. Ví dụ

Hàm trả về dòng cuối dùng có dữ liệu tương ứng với cell tham chiếu.

'//Function tra vê dòng cuôi cùng có du liêu'
Function LastRow(ByVal ws As Worksheet, ByVal sCol As String) As Long
    If ws.FilterMode = True Then ws.ShowAllData     'Nêu dang filter thi clear'
    ws.Cells.EntireRow.Hidden = False               'Unhide toan bô rows'
    LastRow = ws.Cells(ws.Rows.Count, sCol).End(xlUp).Row 'Tra vê dòng cuôi cùng có du liêu'
End Function

Hàm rút ngắn họ và tên với trường hợp có từ 2 tên đệm trở lên.

'//Function rut ngan ho và tên (nêu có 2 tên dêm)'
Function ShortName(ByVal sName As String) As String '//Công thuc o bang tinh Excel =ShortName("ho và tên")'
    Dim arrTmp, i As Long
    sName = WorksheetFunction.Trim(sName)
    arrTmp = Split(sName, " ")
    If UBound(arrTmp) > 2 Then
        For i = LBound(arrTmp) + 1 To UBound(arrTmp) - 1
            arrTmp(i) = Left(arrTmp(i), 1) & "."
        Next i
        ShortName = Join(arrTmp, " ")
    Else
        ShortName = sName
    End If
End Function

Tải file ví dụ: Private Sub | Public Sub | Static Sub | ByVal-ByRef | Ví dụ

VBA Excel Events, Application Object

  1. Loạt các bài viết có liên quan chuyên đề VBA:
  2. VBA Excel Hộp thoại thông báo
  3. VBA Excel Biến trong VBA Excel
  4. VBA Excel sử dụng Scripting Dictionary
  5. VBA Excel Biến trong VBA Excel
  6. VBA Excel Workbook, worksheet
  7. VBA Excel Range, Cells
  8. VBA Excel Hàm trong Excel VBA
  9. VBA Excel Events, Application Object
  10. VBA Excel Function and Sub Excel VBA
  11. VBA Excel Array Mảng trong Excel VBA
  12. VBA Excel FileSystemObject trong Excel VBA
  13. VBA Excel Collection trong Excel VBA
  14. VBA Excel Hashtable trong Excel VBA
  15. VBA Excel Stack trong Excel VBA
  16. VBA Excel Queue trong Excel VBA
  17. VBA Excel SortedList Excel VBA
  18. VBA Excel ArrayList Excel VBA
  19. VBA Excel Ví dụ về Scripting Dictionary
  20. Sách VBA Excel 2016 power programming with vba (pdf)

1. Events

Một số sự kiện thường dùng.

1.1. Worksheet_Activate

Sự kiện khi Worksheet được kích hoạt hiện hành.

Ví dụ:

Private Sub Worksheet_Activate()
    'Jump to last cell in column:'
    Dim Cll As Range
    Set Cll = Range("B" & Rows.Count).End(xlUp).Offset(1, 0)
    Cll.Select
End Sub
1.2. Worksheet_Change

Sự kiện thay đổi, cập nhật dữ liệu của cell trên Worksheet.

Ví dụ:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim Rng As Range
    Set Rng = Range("B3:B100")  'Vùng nhâp du liêu.'
    If Not Intersect(Target, Rng) Is Nothing Then   'Nêu ô dang xét không phai không thuôc vùng Rng thì:'
            Target.Offset(0, 2).Value = Now         'Nhâp thoi gian hiên hành vào ô tuong ung cách 2 côt'
    End If
End Sub

Lưu ý: Nếu không chỉ định địa chỉ cho Target thì Target sẽ nhận là toàn bộ cells trên bảng tính.

1.3. Worksheet_SelectionChange

Sự kiện khi di chuyển trỏ chuột trên chọn cells trên Worksheet.

Ví dụ:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    'Hight light row and column from activecell:'
    
    Exit Sub   '<---------Bo dòng này dê chay code'
    
    Dim iRow As Long, iCol As Long, i As Long, j As Long
    Application.ScreenUpdating = False
    
    Cells.Interior.ColorIndex = 0   'Xóa màu nên cu'
    iRow = ActiveCell.Row           'Tra vê dòng cua ô hiên hành'
    iCol = ActiveCell.Column        'Tra vê côt cua ô hiên hành'
    
    For i = 1 To iRow
        Cells(i, iCol).Interior.ColorIndex = 6  'Tô màu ô cùng dòng'
    Next i
    
    For j = 1 To iCol
        Cells(iRow, j).Interior.ColorIndex = 6  'Tô màu ô cùng côt'
    Next j
    
    Application.ScreenUpdating = True
End Sub
1.4. Workbook_BeforeClose

Sự kiện trước khi đóng Workbook.

Ví dụ: 

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    'Hide sheets:'
    Sheets("Temp").Visible = xlSheetHidden
    
    'Luu bang tinh:'
    ThisWorkbook.Save
End Sub
1.5. Workbook_BeforePrint

Sự kiện trước khi in bảng tính.

Ví dụ: 

Private Sub Workbook_BeforePrint(Cancel As Boolean)
    'Luu bang tinh truoc khi in:'
    ThisWorkbook.Save
End Sub
1.6. Workbook_Open

Sự kiện khi mở Workbook.

Ví dụ: 

Private Sub Workbook_Open()
    'Gioi han ngay su dung file:
    Dim dkNgay As Long
    dkNgay = Sheet1.Range("A1").Value2  'Nhâp ngày diêu kiên vào [A1] cua sheets "Data"
    If CLng(Date) > dkNgay Then     'Nêu ngày hiên tai > ngày diêu kiên
        MsgBox "Quá han su dung!" & vbNewLine & "Liên hê tác gia:...", , "Thông báo"
    Else
        MsgBox "Xin chào!", , "Thông báo"
    End If
End Sub

2. Application Object

2.1. ScreenUpdating

Điều khiển cập nhật màn hình: Khi điều khiển các đối tượng (sheets, range, cells), việc vô hiệu hóa cập nhật màn hình (tránh nhấp nháy) giúp tốc độ code nhanh hơn.

2.2. Calculation

Mặc định thiết lập bảng tính tự động tính toán (CalculationAutomatic), khi điều khiển các đối tượng (sheets, range, cells), ví dụ gán kết quả xuống bảng tính, các công thức thực hiện tính toán với giá trị vừa được gán, máy tính phải xử lý thêm tác vụ, làm giảm tốc độ code thực hiện lệnh. Vậy, để tăng tốc độ cho code ta sẽ chuyển thiết lập về dạng thủ công (CalculationManual).

Xem 2 ví dụ để so sánh: 

Sub ScreenAndCal_ON()
'Vô hiêu hóa câp nhât màn hình
Application.ScreenUpdating = False
'Thiêt lâp tinh toan vê dang thu công
Application.Calculation = xlCalculationManual
Dim i As Long, T As Double
'Lây gôc thoi gian chay code:
T = Timer

 

'Vòng lap gan sô thu tu: 1 - 100 000
For i = 1 To 100000
    Sheet1.Range("A1").Offset(i, 0).Value = i
Next i

'Câp nhât màn hình
Application.ScreenUpdating = True
'Thiêt lâp tinh toan vê dang tu dông
Application.Calculation = xlCalculationAutomatic

'Thoi gian hoàn thành:
MsgBox Round(Timer - T, 2) & " giây"    'T=2.62 giây
End Sub

‘————–‘

Sub ScreenAndCal_OFF()
Dim i As Long, T As Double
'Lây gôc thoi gian chay code:
T = Timer

 

'Vòng lap gan sô thu tu: 1 - 100 000
For i = 1 To 100000
    Sheet1.Range("A1").Offset(i, 0).Value = i
Next i

'Thoi gian hoàn thành:
MsgBox Round(Timer - T, 2) & " giây"    'T=3.12 giây
End Sub

2.3. DisplayAlerts

Điều khiển hộp thoại thông báo khi thực thi code.

– Khi đóng file, xuất hiện hộp thoại:

 

Sub Alert_Close()
    Application.DisplayAlerts = False
    ActiveWorkbook.Close
    Application.DisplayAlerts = True
End Sub

Khi đó, Excel đóng mà không lưu bảng tính, tương ứng với chọn “Don’t Save”.

2.4. WorksheetFunction

Sử dụng thuộc tính WorksheetFunction để gọi các hàm trong bảng tính.

Cấu trúc:

Application.WorksheetFunction.Formula

Với Formula là một hàm trong bảng tính (sum, countA, Match…)

Ví dụ: 

Sub Worksheet_Function()
    Dim WF As WorksheetFunction
    Set WF = Application.WorksheetFunction
    Dim aCount As Long
    aCount = WF.CountIf(Sheet1.Range("A2:A10"), ">0")
    MsgBox aCount

 

    'Hoac viet gôp:
    Dim maxValue As Long
    maxValue = Application.WorksheetFunction.Max(Sheet1.Range("A2:A100"))
    MsgBox maxValue
End Sub

2.5. GetOpenFilename

Lấy tên file từ cửa sổ chọn

Application.GetOpenFilename([FileFilter],[FilterIndex],[Title],[ButtonText],MultiSelect])

FileFilter: Chuỗi đưa ra điều kiện lọc loại tập tin trong cửa sổ chọn.

FilterIndex: Chỉ định chỉ số của loại tập tin mặc định được lọc.

Title: Tiêu đề của hộp thoại chọn tập tin, mặc định là “Open”.

ButtonText: Với MAC OS.

MultiSelect: True cho phép chọn nhiều tập tin, False (mặc định) chỉ cho chọn một.

Ví dụ: 

Sub GetFileName_Any()
    Dim FilePath As String
    FilePath = Application.GetOpenFilename()
    MsgBox FilePath
End Sub
'--------------'
Sub GetFileName_Excel()
    Dim FilePath As String
    FilePath = Application.GetOpenFilename("Excel file (*.xlsx), *.xlsx")
    MsgBox FilePath
    'Workbooks.Open (OpenFile)
End Sub

 

Tải file ví dụ: Events   |   Application Object

VBA Excel Hàm trong Excel VBA

Các bài viết có liên quan đến Hàm trong Excel VBA

Một số ví dụ về các công thức sử dụng hàm COUNTIF

Các công thức Excel để tính tổng Sum, Sumif

Các hàm trong Excel VBA:

Lookup/Ref Functions

Hàm tìm kiếm, lựa chọn theo tham chiếu

String/Text Functions

Hàm xử lý về chuỗi, văn bản

Date/Time Functions

Hàm xử lý về ngày/ thời gian

Math/Trig Functions

Hàm về Toán học

Logical Functions

Hàm logic, cấu trúc lệnh (SELECT CASE, IF-THEN, FOR-NEXT…)*

Information Functions

Hàm xử lý thông tin

Data Type Conv. Functions

Hàm chuyển đổi kiểu dữ liệu

File/Directory Functions

Hàm xử lý về tập tin và thư mục



Lookup/Ref Functions

Hàm tìm kiếm, lựa chọn theo tham chiếu

CHOOSE

CHOOSE(position, value1, [value2, … value_n])

 

Trả về 1 giá trị từ một danh sách các giá trị dựa trên vị trí chỉ định.

String/Text Functions

Hàm xử lý về chuỗi, văn bản

ASC

Asc(String As String) ‘As Long’

 

Trả về một số nguyên (0-255) đại diện cho mã ký tự tương ứng với một ký tự.

ASCW

AscW(String As String) ‘As Long’

 

Trả về một số nguyên (0-65535) đại diện cho mã ký tự tương ứng với một ký tự.

CHR

Chr(CharCode as Long)

 

Trả về ký tự tương ứng với mã ký tự (0-255) chỉ định đưa vào.

CHRW

ChrW(CharCode as Long)

 

Trả về ký tự tương ứng với mã ký tự (0-65535) chỉ định đưa vào.

CONCATENATE with “&”

string1 & string2 [& string3 & string_n] ‘As String

 

Nối các chuỗi lại với nhau thành một chuỗi mới.

FORMAT STRINGS

Format (Expression, [Format ]) ‘As String

 

Định dạng giá trị đưa vào theo định dạng chỉ định.

INSTR

InStr([Start],[String1],[String2],[Compare As VbCompareMethod = vbBinaryCompare]) ‘As Long’

 

Trả về vị trí xuất hiện đầu tiên của chuỗi con trong chuỗi đang xét.

INSTRREV

InStrRev(StringCheck As String,StringMatch As String,[Start As Long = -1],[Compare As VbCompareMethod = vbBinaryCompare]) ‘As Long’

 

Trả về vị trí xuất hiện đầu tiên của chuỗi con trong chuỗi đang xét tính từ cuối chuỗi.

LCASE

LCase(String) ‘As String

 

Chuyển chuỗi từ chữ in hoa thành chữ thường.

UCASE

UCase(String) ‘As String

 

Chuyển chuỗi từ chữ thường thành chữ in hoa.

LEFT

Left(String,Length As Long) ‘As String

 

Trích xuất một chuỗi con từ một chuỗi, bắt đầu từ ký tự đầu tiên bên trái.

LEN

Len(Expression) As Long ‘As Long

 

Trả về số ký tự của chuỗi.

LTRIM

Ltrim(String) ‘As String

 

Loại bỏ khoảng trắng ở đầu (bên trái) chuỗi đưa vào.

MID

Mid(String,Start As Long,[Length]) ‘As String

 

Trích xuất một chuỗi con từ một chuỗi (bắt đầu ở bất kỳ vị trí nào).

REPLACE

Replace(Expression As String, Find As String, Replace As String, [Start As Long = 1], [Count As Long=-1],[Compare As VbComapareMethod = VbBinaryCompare]) ‘As String

 

Thay thế một chuỗi ký tự trong một chuỗi bởi một tập hợp các ký tự khác.

RIGHT

Right(String,Length As Long) ‘As String

 

Trích một chuỗi con từ một chuỗi bắt đầu từ ký tự đầu tiên bên phải.

RTRIM

Rtrim(String) ‘As String

 

Loại bỏ khoảng trắng ở cuối (bên phải) chuỗi đưa vào.

SPACE

SPACE(Number As Long) ‘As String

 

Trả về chuỗi là các ký tự khoảng trắng, với số lượng ký tự chỉ định đưa vào.

SPLIT

Split(Expression As String, [Delimiter], [Limit As Long = -1], [Compare As VbCompareMethod = vbBinaryCompare]) ‘Array1D() As String

 

Trả về một mảng 1 chiều, gồm các phần tử là các chuỗi con được tách ra từ chuỗi đưa vào bởi dấu phân cách, chỉ mục cận dưới của mảng luôn bằng 0 cho dù Option Base 1.

JOIN

Join(SourceArray,[Delimiter]) ‘As String’

 

Trả về một chuỗi được ghép từ các phần từ của mảng một chiều SourceArray bởi dấu phân cách Delimiter.

STR

STR(Numer) ‘As String

 

Trả về dạng chuỗi của một số.

STRCOMP

StrComp(String1, String2, [Compare As VbCompareMethod = vbBinaryCompare]) ‘As Integer

 

Trả về kết quả là một số nguyên đại diện cho kết quả so sánh 2 chuỗi.

STRCONV

StrConv(String,Conversion As VbStrConv,[LocaleID as Long]) ‘As String

 

Trả về một chuỗi được chuyển sang chữ hoa, chữ thường, in hoa ký tự đầu mỗi từ hoặc Unicode.

STRREVERSE

STRREVERSE(Expression As String) ‘As String

 

Trả về chuỗi mới với các ký tự có thứ tự đảo ngược.

TRIM

Trim(String) ‘As String

 

Loại bỏ khoảng trắng ở đầu và cuối của chuỗi.

VAL

Val(String as String) ‘As Double

 

Trả về các số được tìm thấy trong một chuỗi.

Date/Time Functions

 Hàm xử lý về ngày/ thời gian

DATE

Date ‘As Date

 

Trả về ngày hiện tại của hệ thống (máy tính).

DATEADD

DateAdd(Interval As String, Number As Double, Date) ‘As Date

 

Trả lại một ngày sau đó đã thêm một khoảng thời gian/ ngày nhất định.

DATEDIFF

DateDiff(Interval As String, Date1, Date2, [FirstDayOfWeek As VbDayOfWeek = vbSunday], [FirstWeekOfYear As VbFirstWeekOfYear = vbFirstJan1]) ‘As Long

 

Trả về sự khác biệt giữa hai giá trị ngày, dựa trên khoảng thời gian được chỉ định.

DATEPART

DatePart(Interval As String, Date, [FirstDayOfWeek As VbDayOfWeek = vbSunday], [FirstWeekOfYear As VbFirstWeekOfYear = VbFirstJan1]) ‘As Integer

 

Trả về một phần xác định của một ngày nhất định.

DATESERIAL

DateSerial(Year As Integer, Month As Integer, Day As Integer) ‘As Date

 

Trả về một ngày trong năm.

DATEVALUE

DateValue(Date As String) ‘As Date

 

Trả về giá trị ngày của chuỗi định dạng kiểu ngày.

DAY

Day(Date) ‘As Integer

 

Trả về một ngày trong tháng (một số từ 1-31) từ giá trị ngày tháng đưa vào.

FORMAT DATES

Format(Expression, [Format], [FirstDayOfWeek As VbDayOfWeek = vb Sunday], [FirstWeekOfYear As VbFirstWeekOfYear = vbFirstJan1]) ‘As String

 

Expression: Giá trị ngày cần định dạng.

HOUR

Hour(Time) As Integer

 

Trả về số giờ (một số từ 0-23) của thời gian đưa vào.

MINUTE

Minute(Time) ‘As Integer

 

Trả về số phút (một số từ 0-59) của thời gian đưa vào.

MONTH

Month(Date) ‘As Integer

 

Trả về tháng (một số từ 1-12) của giá trị ngày đưa vào.

MONTHNAME

MONTHNAME(Month As long, [Abbreviate As Boolean = False]) ‘As String

 

Trả về một chuỗi đại diện cho tháng được cho một số từ 1 đến 12.

NOW

Now ‘As Date

 

Trả lại ngày, giờ hiện tại của hệ thống.

TIMESERIAL

TimeSerial(Hour As Integer, Minute As Integer, Second As Integer) ‘As Date

 

Trả về thời gian ứng với giá trị giờ, phút và giây đưa vào.

TIMEVALUE

TimeValue(Time As String) ‘As Date

 

Trả về trị số thời gian của một thời gian ở dạng chuỗi.

WEEKDAY

Weekday(Date, [FirstDayOfWeek As VbDayOfWeek = vbSunday]) ‘As Integer

 

Trả về một số đại diện cho ngày trong tuần tương ứng với ngày xét.

WEEKDAYNAME

WeekdayName(Weekday As Long, [Abbreviate As Boolean = False], [FirstDayOfWeek As VbDayOfWeek = vbUseSytemDayOfWeek]) ‘As String

 

Trả về một chuỗi đại diện cho ngày trong tuần ứng với số từ 1 đến 7.

YEAR

Year(Date) ‘As Integer

 

Trả về trị số năm có bốn chữ số (một số từ năm 1900 đến 9999) ứng với ngày đang xét.

Math/Trig Functions

 Hàm về Toán học

ABS

Abs(Number) ‘As Double

 

Trả về giá trị tuyệt đối của một số.

ATN

Atn(Number As Double) ‘As Double

 

Trả về giá trị của phép tính ATAN trong Toán, từ -Pi/2 tới Pi/2.

COS

Cos(Number As Double) ‘As Double

 

Trả về giá trị của phép tính Cosine của một góc trong Toán (-1 tới 1).

EXP

Exp(Number As Double) ‘As Double

 

Trả về giá trị lũy thừa của cơ số e (e là hằng số toán học, xấp xỉ 2.718).

FIX

Fix(Number)

 

Trả về phần số nguyên của một số.

FORMAT NUMBERS

Format (Expression, [Format ]) ‘As String

 

Định dạng một số dưới dạng chuỗi.

INT

Int(Number) ‘As Double

 

Trả về phần số nguyên của một số.

LOG

Log(Number As Double) ‘As Double

 

Trả về giá trị của phép tính Logarit tự nhiên của một số (Log cơ số e hay Ln(x)).

RANDOMIZE

Randomize([Number])

 

Được sử dụng để thay đổi giá trị nguồn được sử dụng bởi máy tạo số ngẫu nhiên cho hàm RND.

RND

RND

 

Để tạo ra một số ngẫu nhiên giữa 0-1.

ROUND

Round(Number, [NumDigitsAfterDecimail As Long]) ‘As Double

 

Làm tròn một số đưa vào.

SGN

Sgn(Number) ‘As Integer

 

Trả về dấu của một số.

SIN

Sin(Number As Double) ‘As Double

 

Trả về giá trị của phép tính Sine của một góc trong Toán, từ -1 tới 1.

SQR

Sqr(Number As Double) ‘As Double

 

Trả về kết quả của phép toán căn bậc 2 của số cần tính.

TAN

Tan(Number As Double) ‘As Double

 

Trả về giá trị của phép tính Tan của một góc trong Toán.

Logical Functions

Hàm logic, cấu trúc lệnh trong VBA

AND

Conditions_1 And conditions_2 [… And conditions_n]

 

Trả về kết quả True nếu tất cả các điều kiện đưa vào là True.

OR

Conditions_1 Or conditions_2 [… Or conditions_n]

 

Trả về TRUE nếu cos bất kỳ điều kiện nào là TRUE.

CASE

Select Case Expression

   Case condition_1

      result_1

   Case condition_2

      result_2

   …

   Case condition_n

      result_n

   Case Else

      result_else

End Select

 

Tương tự cấu trúc lệnh If Then Else, trả về một giá trị nếu một điều kiện trả về TRUE.

IF-THEN-ELSE

If condition_1 Then

   result_1

ElseIf condition_2 Then

  result_2

ElseIf condition_n Then

   result_n

Else

   result_else

End If

 

Trả về một giá trị nếu một điều kiện trả về TRUE hoặc một giá trị khác nếu nó trả về FALSE.

FOR…NEXT

FOR counter = start TO end [Step increment]

 

   {…statements…}

 

NEXT [counter]

 

Vòng lặp duyệt qua biến đếm.

DO WHILE…LOOP

Do While condition

 

   {…statements…}

 

Loop

 

Vòng lặp duyệt qua điều kiện đưa vào.

WHILE…WEND

WHILE condition

 

   {…statements…}

 

END

 

Vòng lặp duyệt qua điều kiện đưa vào. Giống cấu trúc lệnh DO WHILE…LOOP.

SWITCH

Switch(ParamArray VarExpr() As Variant)

 

Switch (expr1, value1, expr2, value2, … expr_n, value_n)

 

Xét một danh sách các biểu thức và trả về giá trị tương ứng cho biểu thức đầu tiên trong danh sách có kết quả TRUE.

Information Functions

 Hàm xử lý thông tin

ENVIRON

Environ(Expression) ‘As String

 

Trả về giá trị ứng biến của môi trường hệ điều hành cần xác định.

ISDATE

IsDate(Expression) ‘As Boolean

 

Trả về TRUE nếu biểu thức là một giá trị ngày hợp lệ.

ISEMPTY

IsEmpty(Expression) ‘As Boolean

 

Kiểm tra các ô trống hoặc các biến rỗng (chưa có giá trị), nếu đúng thì trả về True, ngược lại trả về False.

ISERROR

IsError(Expression) ‘As Boolean

 

Trả về kết quả True nếu điều kiện cần kiểm tra là một lỗi, ngược lại trả về False.

ISNULL

IsNull(Expression) ‘As Boolean

 

Kiểm tra giá trị NULL.

ISNUMERIC

IsNumeric(Expression) ‘As Boolean

 

Kiểm tra một giá trị là dạng số hay không. Trả về True nếu là dạng số, ngược lại trả về False.

ISARRAY

IsArray(VarName) ‘As Boolean’

 

Kiểm tra một biến (VarName) là dạng mảng (Array) hay không. Trả về True nếu là dạng mảng, ngược lại trả về False.

TYPENAME

TypeName(VarName) ‘As String’

 

Trả về kiểu dữ liệu của biến chỉ định.

Data Type Conv. Functions

Hàm chuyển đổi kiểu dữ liệu

CBOOL

CBool(Expression) ‘As Boolean

 

Chuyển giá trị về kiểu dữ liệu Boolean.

CBYTE

CByte(Expression) ‘As Byte

 

Chuyển giá trị về kiểu dữ liệu Byte (0-255).

CCUR

CCur(Expression) ‘As Currency

 

Chuyển giá trị về kiểu dữ liệu Currency.

CDATE

CDate(Expression) ‘As Date

 

Chuyển giá trị về kiểu dữ liệu Date.

CDBL

CDbl(Expression) ‘As Double

 

Chuyển giá trị về kiểu dữ liệu Double.

CDEC

CDbl(Expression) ‘As Decimal

 

Chuyển giá trị về kiểu dữ liệu Decimal.

CINT

CInt(Expression) ‘As Integer

 

Chuyển giá trị về kiểu dữ liệu Integer.

CLNG

CLng(Expression) ‘As Long

 

Chuyển giá trị về kiểu dữ liệu Long.

CSNG

CSng(Expression) ‘As Single

 

Chuyển giá trị về kiểu dữ liệu Single.

CSTR

CStr(Expression) ‘As String

 

Chuyển giá trị về kiểu dữ liệu String.

CVAR

CVar(Expression)

 

Chuyển giá trị về kiểu dữ liệu đưa vào.

File/Directory Functions

Hàm xử lý về tập tin và thư mục

CHDIR

ChDir(Path As String)

 

Dùng để thay đổi đường dẫn hoặc thư mục hiện tại.

CHDRIVE

Chdrive(Drive As String)

 

Dùng để thay đổi ổ đĩa hiện tại.

CURDIR

CurDir([Drive])

 

Trả về đường dẫn hiện tại.

DIR

Dir([PathName],[Attributes As VbFileArrtibute = vbNormal]) As String

 

Trả về tên tập tin (file) đầu tiên tương ứng với tên đường dẫn và các thuộc tính được chỉ định.

FILEDATETIME

FileDateTime(PathName as String) ‘As Date

 

Trả về ngày và thời gian khi tập tin được tạo hoặc sửa đổi lần cuối.

FILELEN

FileLen(PathName As String) ‘As Long

 

Trả về kích thước của tập tin ở đơn vị bytes.

GETATTR

GetAttr(PathName As String) ‘As VbFileAttribute

 

Trả về một số nguyên đại diện cho các thuộc tính của một tập tin, thư mục.

MKDIR

MkDir(Path As String)

 

Tạo một thư mục chỉ định.

RMDIR

RmDir(Path As String)

 

Xóa một thư mục chỉ định.

SETATTR

SetAttr PathName As String, Attributes As VbFileAttribute

 

Thiết lập thuộc tính cho tập tin

VBA Excel Range, Cells

  1. Loạt các bài viết có liên quan chuyên đề VBA:
  2. VBA Excel Hộp thoại thông báo
  3. VBA Excel Biến trong VBA Excel
  4. VBA Excel sử dụng Scripting Dictionary
  5. VBA Excel Biến trong VBA Excel
  6. VBA Excel Workbook, worksheet
  7. VBA Excel Range, Cells
  8. VBA Excel Hàm trong Excel VBA
  9. VBA Excel Events, Application Object
  10. VBA Excel Function and Sub Excel VBA
  11. VBA Excel Array Mảng trong Excel VBA
  12. VBA Excel FileSystemObject trong Excel VBA
  13. VBA Excel Collection trong Excel VBA
  14. VBA Excel Hashtable trong Excel VBA
  15. VBA Excel Stack trong Excel VBA
  16. VBA Excel Queue trong Excel VBA
  17. VBA Excel SortedList Excel VBA
  18. VBA Excel ArrayList Excel VBA
  19. VBA Excel Ví dụ về Scripting Dictionary
  20. Sách VBA Excel 2016 power programming with vba (pdf)

Range, cells là 2 đối tượng của worksheets (cells cũng là đối tượng của Range).

1. Đối tượng Range

+ Cấu trúc:

Worksheets.Range(Cell1, [Cell2])

Cell1 là cell đầu tiên trong vùng được gọi tới, tham số bắt buộc.

Cell2 là cell cuối cùng trong vùng được gọi tới, tham số không bắt buộc.

– Range có thể gồm một hoặc nhiều cells.

– Range có thể gồm một hoặc nhiều dòng/ cột, vùng không liên tục:

Ví dụ:

Set Rng1 = Sheet1.Range("A5", "B10") 
Set Rng2 = Sheet1.Columns("B:D") 
Set Rng3 = Sheet1.Rows("2:5")

+ Các cách viết gọi một range trong VBA:

Range("A5", "B10") 
OR: 
Range("A5:B10") 
OR: 
[A5:B10]

*Lưu ý:

– Khi gọi một range ta viết chỉ định cho một worksheet nào đó: Sheet1.Range(“A5:B10”)

Nếu không viết chỉ định Range(“A5:B10”) cho một worksheet cụ thể thì sẽ được hiểu Range đang gán cho worksheet hiện hành ActiveSheet.Range(“A5:B10”). Khi Run (khởi chạy) một Sub (thủ tục) nào đó trong cửa sổ VBA phải đảm bảo worksheet muốn thực hiện Sub đó phải đang được Active, nếu không sẽ chạy nhầm worksheet; hoặc ta có thể gán Sub đó vào nút lệnh trên worksheet muốn thực hiện và kích hoạt Sub bằng cách click vào nút lệnh.

2. Đối tượng Cells

+ Cấu trúc:

Worksheets.Cells([RowIndex], [ColumnIndex])

Range.Cells([RowIndex], [ColumnIndex])

– RowIndex: Địa chỉ dòng của cell cần gọi, nếu bỏ qua thì mặc định tham số nhận giá trị là 1.

– ColumnIndex: Địa chỉ cột của cell cần gọi, nếu bỏ qua thì Cells trả về có chỉ số trong Range được tính từ trái sang phải, từ trên xuống dưới.

– Nếu bỏ qua cả 2 tham số thì trả về toàn bộ Cells trong Range.

 Ví dụ:

Sub RngObject() 

Dim Rng As Range, Cll As Range, Cll1 As Range 
Set Rng = Sheet1.Range("A5:B10") 
Set Cll = Sheet1.Cells(1, 1) 
Set Cll1 = Rng.Cells(1, 1) 
MsgBox Rng.Address & vbNewLine & Cll.Address & vbNewLine & Cll1.Address 

End Sub

3. Một số thuộc tính, phương thức thường dùng
3.1. Thuộc tính:

Value / .Value2 / .Text

Xét ví dụ cụ thể bên dưới:

Formula  / Hasformula

Sub Set_Formula() 

Dim Cll As Range, i As Long 
Set Cll = Sheet1.Range("C5") 
For i = 0 To 5 
Cll.Offset(i, 0).Value = i + 10 
Next i 
Cll.Offset(6, 0).Formula = "=Sum(C5:C10)" 
MsgBox Cll.Offset(6, 0).HasFormula 

End Sub

Offset

Cú pháp:

            Range.Offset([RowOffset],[ColumnOffset])

RowOffset: Số dòng giữa vùng tham chiếu gốc và vùng đích, hướng về phía trên Range thì RowOffset mang giá trị âm.

     Nếu không nhập thì RowOffset=0, cú pháp khi đó: Range.Offset(, ColumnOffset)

ColumnOffset: Số cột giữa vùng gốc và vùng đích, hướng về bên trái Range thì ColumnOffset mang giá trị âm.

      Nếu không nhập thì ColumnOffset=0, cú pháp khi đó: Range.Offset(RowOffset)

Ví dụ:

Sub Offset()
    'Range.Offset([RowOffset],[ColumnOffset])'
    Dim Cll As Range, Rng As Range
    Set Cll = Sheet1.Range("B2")
    Set Rng = Sheet1.Range("A5:A10")
    MsgBox Cll.Offset(1, 1).Address     '$C$3'
    MsgBox Cll.Offset(, 2).Address      '$D$2'
    MsgBox Cll.Offset(2).Address        '$B$4'
    MsgBox Rng.Offset(1, 1).Address     '$B$6:$B$11'
    MsgBox Rng.Offset(, 1).Address      '$B$5:$B$10'
    MsgBox Rng.Offset(2).Address        '$A$7:$A$12'
End Sub

Resize

Cú pháp:

            Range.Resize([RowSize],[ColumnSize])

RowSize: Số dòng dãn ra so với cell đầu tiên của vùng tham chiếu gốc.

– Nếu không nhập thì RowSize=Range.Rows.Count, cú pháp khi đó: Range.Resize(, ColumnSize)

ColumnSize: Số cột dãn ra so với cell đầu tiên của vùng tham chiếu gốc.

– Nếu không nhập thì ColumnSize=Range.Columns.Count, cú pháp khi đó: Range.Offset(RowSize)

Ví dụ:

Sub Resize()
    'Range.Resize([RowSize],[ColumnSize])'
    Dim Cll As Range, Rng As Range
    Set Cll = Sheet1.Range("B2")
    Set Rng = Sheet1.Range("A5:A10")
    MsgBox Cll.Resize(2, 2).Address     '$B$2:$C$3'
    MsgBox Cll.Resize(, 2).Address      '$B$2:$C$2'
    MsgBox Cll.Resize(2).Address        '$B$2:$B$3'
    MsgBox Rng.Resize(3, 3).Address     '$A$5:$C$7'
    MsgBox Rng.Resize(, 2).Address      '$A$5:$B$10'
    MsgBox Rng.Resize(2).Address        '$A$5:$A$6'
End Sub

Count: Đếm các ô có trong range

Sub CountCells()
    Dim Rng As Range
    Set Rng = Sheet1.Range("A1:B10")
    MsgBox Rng.Count
    'Result 20
End Sub

Cell.Row: Trả về địa chỉ dòng của ô được gọi.

Cell.Column: Trả về địa chỉ cột của ô được gọi.

Sub RowColumnOfCell()
    MsgBox Sheet1.Range("D20").Row      'Rusult 20
    MsgBox Sheet1.Range("D20").Column   'Rusult 4
End Sub

Address: Trả về địa chỉ của vùng được gọi

Sub RngAddress()
    MsgBox Sheet1.Range("A2:B9").Address
    Result "$A$2:$B$9"
End Sub

Numberformat: Định dạng dữ liệu vùng tham chiếu tới.

Sub FormatRange()
    Sheet1.Range("A15").Value = 1000000
    Sheet1.Range("A15").NumberFormat = "#,0"
    Sheet1.Range("A16").Value = Date
    Sheet1.Range("A16").NumberFormat = "dd/mm/yyyy"
End Sub

End: Trả về cell cuối cùng theo hướng chỉ định.

(Nó tương ứng với việc nhấn Ctrl + Up/Down/Left/Right Arrow) 
Cú pháp:

            Range.End(XlDirection)

Với XlDirection có 4 tham số: xlDown, xlToLeft, xlToRight, xlUp

Sub EndDirection()
    Range("G20").End(xlDown).Select
    'Tra vê cell duoi cung côt G có du liêu liên tuc, tinh tu G20
    'Press: Ctrl + Arrow Down from cell G20
    Range("G20").End(xlUp).Select
    'Tra vê cell trên cung côt G có du liêu dâu tiên, tinh tu G20
    'Press: Ctrl + Arrow Up from cell G20
    Range("G20").End(xlToLeft).Select
    'Tra vê cell dâu tiên bên trái trên dòng 20 có du liêu, tinh tu G20
    'Press: Ctrl + Arrow Left from cell G20
    Range("G20").End(xlToRight).Select
    'Tra vê cell ngoài cùng bên phai trên dòng 20 có du liêu liên tuc, tinh tu G20
    'Press: Ctrl + Arrow Right from cell G20
End Sub

# Ứng dụng thuộc tính End() để xác định dòng cuối cùng có dữ liệu:

Sub LastRow1()
'Tra vê dòng trên cùng có du liêu dâu tiên, xet tu cell duoi cùng bang tinh tro lên
Dim lRow As Long
lRow = Sheet1.Range("A" & Sheet1.Rows.Count).End(xlUp).Row
'Voi Excel 2003-97: Rows.Count=65,536
'Voi Excel 2007 tro len: Rows.Count=1,048,576
MsgBox lRow
End Sub
 
Sub LastRow2()
'Tra vê dòng duoi cùng có du liêu liên tuc, xet tu cell chi dinh tro xuong
Dim lRow As Long
lRow = Sheet1.Range("A5").End(xlDown).Row
MsgBox lRow
End Sub
3.2. Phương thức:

Select: Chọn vùng

Range("A2:C10").Select

Activate: Kích hoạt cell chỉ định hiện hành

Cells(2,5).Activate 
Cells(2,5).Select

Copy: Sao chép vùng dữ liệu, bằng với thao tác chọn vùng dữ liệu rồi nhấn Ctrl + C

Range("A2:C10").Copy

Paste: Dán dữ liệu sau khi sao chép, bằng với thao tác nhấn Ctrl + V

Sub CopyRange()
   Range("A1:A3").Select
   Selection.Copy
   Range("C15").Select
   ActiveSheet.Paste
End Sub

'Viêt gon:
Sub CopyRange2()
   Range("A1:A3").Copy Range("C15")
End Sub

Clear: Xóa nội dung và định dạng của vùng chỉ định

ClearContents: Chỉ xóa nội dung

ClearFormats: Chỉ xóa định dạng

Sub Clear()
    Dim Rng As Range
    Set Rng = Sheet1.Range("A1:C30")
    Rng.Clear           'Xoa nôi dung va dinh dang
    Rng.ClearContents   'Chi xóa nôi dung
    Rng.ClearFormats    'Chi xoa dinh dang
End Sub

Delete: Xóa vùng, xóa dòng/cột, xóa ô (bằng với thao tác nhấn tổ hợp phím Ctrl và dấu trừ -)

Sub Delete()
    Sheet1.Rows("25:30").Delete
    Sheet1.Columns("H:K").Delete
End Sub

Tải file ví dụ về Range, Cells

VBA Excel Workbook, worksheet

  1. Loạt các bài viết có liên quan chuyên đề VBA:
  2. VBA Excel Hộp thoại thông báo
  3. VBA Excel Biến trong VBA Excel
  4. VBA Excel sử dụng Scripting Dictionary
  5. VBA Excel Biến trong VBA Excel
  6. VBA Excel Workbook, worksheet
  7. VBA Excel Range, Cells
  8. VBA Excel Hàm trong Excel VBA
  9. VBA Excel Events, Application Object
  10. VBA Excel Function and Sub Excel VBA
  11. VBA Excel Array Mảng trong Excel VBA
  12. VBA Excel FileSystemObject trong Excel VBA
  13. VBA Excel Collection trong Excel VBA
  14. VBA Excel Hashtable trong Excel VBA
  15. VBA Excel Stack trong Excel VBA
  16. VBA Excel Queue trong Excel VBA
  17. VBA Excel SortedList Excel VBA
  18. VBA Excel ArrayList Excel VBA
  19. VBA Excel Ví dụ về Scripting Dictionary
  20. Sách VBA Excel 2016 power programming with vba (pdf)
Sơ đồ dạng phả hệ (dạng cây – TreeView) các đối tượng trong VBA:

 

1- Application (Microsoft Excel)
2-     Workbook (Excel file)

3-         Worksheet
4-             Range
            
1. Đối tượng Workbook
Theo trên, workbook là đối tượng cấp 2 của Application (Microsoft Excel).
MsgBox ThisWorkbook.Parent Result: Microsoft Excel

 

Ví dụ:

 

Sub vidu1()
Range("A1").Value = "Xin chao!"
End Sub

Tức là đang hiểu (viết đầy đủ):

Sub vidu2()
Application.ThisWorkbook.Worksheets(1).Range("A1").Value = "Xin chao!"
End Sub

– Một số thuộc tính và phương thức thường dùng:

Workbooks.Open(filepath): Mở workbook mới, với filepath là đường dẫn của file cần mở.

Ví dụ: Workbooks.Open("C:\Users\Administrator\Desktop\Vidu.xlsx")
 
Workbooks.Add: Tạo mới workbook.

ActiveWorkbook.CodeName: Tên workbook trong VBA.

ThisWorkbook.Name: Tên workbook để quản lý tập tin (tên file).

ThisWorkbook.Path: Đường dẫn chứa workbook.

ThisWorkbook.FullName: Tên workbook bao gồm cả đường dẫn chứa nó.

ThisWorkbook.Save: Lưu các thay đổi đã tác động lên workbook.

ThisWorkbook.Close True '(SaveChanges = True): Đóng workbook và lưu các thay đổi đã tác động lên workbook.

ThisWorkbook.Close False '(SaveChanges = False): Đóng workbook và không lưu các thay đổi đã tác động lên workbook.

(Tham khảo file đính kèm ở cuối bài viết).

 

2. Đối tượng Worksheet
Trong VBA, khi xét tới đối tượng Worksheet thì nó là đối tượng cấp 3 (sau Workbook). 
(Xem lại ví dụ ở phần đối tượng workbook ở trên.) 

 

– Có 3 cách để gọi (tham chiếu tới) đối tượng worksheet:

 

 

Cách 1: Sử dụng worksheet name – Là tên của bảng tính nhìn thấy ở dưới thanh trạng thái (Sheet Tab). 

Sub wsName()
    Worksheets("Ten sheet 1").Range("A1").Value = "Xin chao!"
    'Hoac co the viet sheets thay cho worksheets
    Sheets("Ten sheet 1").Range("A2").Value = "Xin chao!"
End Sub

# Cách 2: Sử dụng thứ tự sắp xếp của worksheet ở sheet tab, tính từ trái qua phải, vị trí đầu tiên là 1 

Sub wsIndex()
    Sheets(1).Range("B1").Value = Sheets(1).Name & "-Vi tri=" & Sheets(1).Index
    Sheets(2).Range("B1").Value = Sheets(2).Name & "-Vi tri=" & Sheets(2).Index
End Sub

# Cách 3: Sử dụng CodeName của worksheet, là tên của worksheet trong VBA 

Sub wsCodeName()
    Sheet1.Range("B2").Value = Sheets(1).Name
    Sheet2.Range("B2").Value = Sheets(2).Name
    Sheet1.Range("C1").Value = Sheet1.CodeName
    Sheet2.Range("C1").Value = Sheet2.CodeName
End Sub

– Một số phương thức và thuộc tính thường dùng: 

.Count: Đếm số worksheets có trong một workbook 

MsgBox Worksheets.Count

.Activate: Kích hoạt worksheet được chỉ định 

Sheet1.Activate

.Select: Chọn worksheet được chỉ định 

Sheet1.Select

Gọi tới đối tượng của worksheet:

.Cells 
.Range 
.Rows 
.Columns

(Tham khảo file đính kèm ở cuối bài viết).

Tải file ví dụ: Workbook Object  |  Worksheet Object  | Ví dụ phương thức Open_Close

VBA Excel Biến trong VBA Excel

  1. Loạt các bài viết có liên quan chuyên đề VBA:
  2. VBA Excel Hộp thoại thông báo
  3. VBA Excel Biến trong VBA Excel
  4. VBA Excel sử dụng Scripting Dictionary
  5. VBA Excel Biến trong VBA Excel
  6. VBA Excel Workbook, worksheet
  7. VBA Excel Range, Cells
  8. VBA Excel Hàm trong Excel VBA
  9. VBA Excel Events, Application Object
  10. VBA Excel Function and Sub Excel VBA
  11. VBA Excel Array Mảng trong Excel VBA
  12. VBA Excel FileSystemObject trong Excel VBA
  13. VBA Excel Collection trong Excel VBA
  14. VBA Excel Hashtable trong Excel VBA
  15. VBA Excel Stack trong Excel VBA
  16. VBA Excel Queue trong Excel VBA
  17. VBA Excel SortedList Excel VBA
  18. VBA Excel ArrayList Excel VBA
  19. VBA Excel Ví dụ về Scripting Dictionary
  20. Sách VBA Excel 2016 power programming with vba (pdf)
1. Các kiểu dữ liệu

2. Khai báo biến và đặt tên biến trong VBA

– Mỗi chương trình ứng dụng thường xử lý nhiều dữ liệu, ta dùng khái niệm “biến” để lưu trữ dữ liệu trong bộ nhớ máy tính, mỗi biến lưu trữ một dữ liệu của chương trình.
– Mặc dù VBA không yêu cầu (*), nhưng ta nên định nghĩa rõ ràng từng biến trước khi truy xuất nó để code của chương trình được rõ ràng, dễ hiểu, dễ bảo trì và phát triển.

– Định nghĩa 1 biến là :
    •  Định nghĩa tên nhận dạng cho biến,
    •  Kết hợp kiểu với biến để xác định cấu trúc dữ liệu của biến,
    •  Định nghĩa tầm vực (phạm vi) truy xuất biến.

– Cú pháp đơn giản của lệnh định nghĩa biến: 

            [Static|Public|Private|DimAVariable [As Type]

+ Static, Public, Private, Dim (**): Các từ khóa để khai báo một biến.

+ Avariable: Tên biến cần khai báo.

Tại từng thời điểm, biến chứa một giá trị (nội dung) cụ thể. Theo thời gian nội dung của biến sẽ bị thay đổi theo tính chất xử lý của code.

– Cách đặt tên cho một biến :
    •  Tên biến có độ dài tối đa 255 ký tự
    •  Ký tự đầu tiên phải là một ký tự chữ (letter), không phải ký tự số (0-9)
    •  Các ký tự tiếp theo có thể là các ký tự chữ (letter), ký số (digit), dấu gạch dưới
    •  Tên biến không được chứa các ký tự đặc biệt như các ký tự : ^, &, ), (,%, $, #, @, !, ~, +, -, *, …
    •  VBA không phân biệt chữ HOA hay chữ thường trong tên biến.       

Ví dụ:

 Tên biến hợp lệ  Tên biến không hợp lệ
Bien1_dong
KhoiLuong
Bien-1: Vì có dấu gạch ngang
Bien&1: Vì có ký tự &
1Bien_dong: Vì có ký tự số ở đầu
Các lưu ý khi đặt tên biến:
– Nên chọn tên biến ngắn gọn nhưng thể hiện rõ ý nghĩa. 
Ví dụ: Ta muốn có một biến để lưu mã khác hàng thì có thể đặt: MaKH

 

– Khi viết tên biến ta nên viết hoa chữ đầu tiên của một từ có ý nghĩa.

Ví dụ: Đặt tên biến xác định khối lượng, số tiền: Kluong, SoTien

– Không được dùng tên biến trùng với các từ khoá như: Print, Sub, End… (từ khóa là những từ mà ngôn ngữ VBA đã dùng cho những thành phần xác định của ngôn ngữ).

 

+ As: Từ khóa, gán với kiểu dữ liệu nào cho biến.

+ Type: Kiểu dữ liệu cần gán cho biến đang khai báo. Nếu bỏ qua [As Type] thì biến đó mặc định nhận kiểu dữ liệu Variant.

Chú thích (*): Có hay không bắt buộc khai báo biến trong VBA
– Khi ở trên cùng trong các môi trường VBA Project (Worksheet, Workbook, Module, Class module, UserForm) có dòng Option Explicit thì các biến phải được khai báo trước khi sử dụng.
– Hai cách thiết lập Option Explicit:
Một là nhập trực tiếp ở trên cùng của môi trường viết code.
Hai là thiết lập Options trong VBA, yêu cầu khai báo biến (mục Require Variable Declaration được chọn) thì ở trên cùng trong các môi trường VBA Project (Worksheet, Workbook, Module, Class module, UserForm) sẽ tự động thêm dòng
 
Option Explicit.

 

 
 

Chú thích (**): Giải thích các từ khóa đứng trước tên biến trong cú pháp khai báo biến.

                [Static|Public|Private|DimAVariable [As Type]

Public, Private, Static là các từ khoá dùng để xác định phạm vi (tầm vực) của một vật thể (variable, sub, or function). 
Phạm vi/ tầm vực có hai tính chất: tính chất “có thể thấy được” và tính chất “tồn tại”.
– Tồn tại: Chỉ áp dụng cho biến (variable), không tồn tại có nghĩa là chưa được thiết lập, hoặc đã bị huỷ.
– Có thể thấy được: Áp dụng cho mọi loại (variable, sub, or function). Tùy theo cách khai báo mà vật thể có thể thấy được trong một phạm vi nhưng lại bị che khuất trong phạm vi khác. Lưu ý là vật thể có thể vẫn tồn tại, chỉ ở ngoài phạm vi thì không chạm được tới nó mà thôi.

Ở nội dung phần này, ta chỉ xét tới variable.
 

• Public: phạm vi toàn cục, ở đâu trong workbook cũng có thể thấy / dùng được. Tuy nhiên, nếu nó được khai báo trong module mức thấp thì qua mức cao hơn có thể phải thêm tên của module vào đầu để VBA biết nó ở đâu mà tìm.(TenModule.TenBien)

– Cấu trúc:
        Public AVariable [As Type]
– Tồn tại: Biến chỉ giải phóng khi thoát file.
– Vị trí: 
Để ngoài Sub/Function, trên cùng của môi trường VBA Project (Worksheet, Workbook, Module, Class module, UserForm).

 

• Private: phạm vi nội bộ khi xét cả VBAProject, nó khai báo trên cùng module thì nó là toàn cục của module đó, các code trong module đó đều thấy nó.
– Cấu trúc:
        Private AVariable [As Type]
– Tồn tại: Biến chỉ giải phóng khi thoát file.
– Vị trí:
Để ngoài Sub/Function, trên cùng của môi trường VBA Project (Worksheet, Workbook, Module, Class module, UserForm).

• Dim: Khai báo biến ở phạm vi toàn cục trong môi trường được khai báo (để ở ngoài Sub/ Function, trên cùng module) nhưng là phạm vi nội bộ khi xét cả VBAProject, hoặc nội bộ trong Sub/ Function.
– Cấu trúc: 
        Dim AVariable [As Type]
– Tồn tại: Biến giải phóng khi thoát file (phạm vi toàn cục của module), giải phóng khi thoát Sub/Function (phạm vi nội bộ của Sub/Function).
– Vị trí: 
+ Để ở ngoài Sub/ Function: Khai báo biến ở phạm vi toàn cục của môi trường khai báo.
+ Khai báo trong Sub/ Function: Phạm vi nội bộ của Sub/Function.

• Static: Khai báo biến ở phạm vi nội bộ trong Sub/ Function.
Cấu trúc: 
        Static AVariable [As Type]
– Tồn tại: Biến chỉ giải phóng khi thoát file.

– Vị trí: Chỉ đặt trong Sub/Function.
*** Ghi chú: Về vùng nhớ của chương trình

 

– Trong chương trình có 2 vùng bộ nhớ, vùng heap và vùng stack. Biến khai báo toàn cục thuộc về heap và biến khai báo nội bộ Sub/Function là biến thuộc về stack. Các vật thể nằm trong vùng stack sẽ bị huỷ sau khi Sub/Function Exit hoặc End. Riêng biến Static thì luôn thuộc về heap bất kể nó là Public hay Private. Vì vậy biến Static không bị huỷ khi Sub/Function thoát.

– Phạm vi/tầm vực của heap và stack:
Heap là vùng nhớ chung của chương trình. Khi chương trình còn chạy thì những gì nằm trong heap còn tồn tại.
Stack là vùng nhớ riêng của mỗi function/sub. Khi chương đang ở trong function/code thì những gì trong stack còn tồn tại. Khi thoát function/sub thì những gì trong stack (của function/sub này) bị huỷ hết.

– Tất cả các kiểu khai báo biến, kể cả Public hay Static thì biến đều được giải phóng khi code bị bất cứ lỗi nào và dừng chương trình.

Tải file tham khảo: Dim | Public | Private | Static