Thứ Ba , 21 Tháng 10 2025, 14:00 Chiều

Ví dụ về lệnh macro

Để thực hiện các mã ví dụ về lệnh macro, đầu tiên thêm một module vào sổ làm việc Excel của bạn, hoặc nếu bạn có một sổ làm việc Macro cá nhân, bạn có thể sử dụng một module hiện có ở đó, hoặc thêm mới. Để làm điều này, bạn cần nằm trong Visual Basic Editor (VBE). Để vào VBE, nhấn ALT + F11 hoặc nhấp vào Visual Basic Option trong tab Developer của bạn.

1. Đánh số thứ tự tự động
Code macro sau đây sẽ giúp bạn bổ sung đánh số thứ tự tự động trên trang Excel.
Sau khi bạn chạy mã macro này, màn hình sẽ hiển thị input box để bạn nhập tối đa số serial và sau đó, nó sẽ chèn các số vào cột theo thứ tự.

Sub AddSerialNumbers()
Dim i As Integer
On Error GoTo Last
i = InputBox("Enter Value", "Enter Serial Numbers")
For i = 1 To i
ActiveCell.Value = i
ActiveCell.Offset(1, 0).Activate
Next i
Last:Exit Sub
End Sub

2. Xóa tất cả các hàng trống
Macro ví dụ này sẽ xóa tất cả các hàng trống trong trang tính.

Sub DeleteBlankRows()
Dim x As Long

With ActiveSheet
For x = .Cells.SpecialCells(xlCellTypeLastCell).Row To 1 Step -1
If WorksheetFunction.CountA(.Rows(x)) = 0 Then
ActiveSheet.Rows(x).Delete
End If
Next
End With

End Sub

3. Chèn nhiều cột
Sau khi chạy mã macro dưới đây, màn hình sẽ hiển thị một input box và bạn phải nhập số cột mà bạn muốn chèn.

Sub InsertMultipleColumns()
Dim i As Integer
Dim j As Integer
ActiveCell.EntireColumn.Select
On Error GoTo Last
i = InputBox("Enter number of columns to insert", "Insert Columns")
For j = 1 To i
Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromRightorAbove
Next j
Last: Exit Sub
End Sub

4. Chèn nhiều hàng
Khi chạy mã macro sau, màn hình sẽ hiển thị một input box và bạn phải nhập số hàng mà bạn muốn chèn.

Sub InsertMultipleRows()
Dim i As Integer
Dim j As Integer
ActiveCell.EntireRow.Select
On Error GoTo Last
i = InputBox("Enter number of columns to insert", "Insert Columns")
For j = 1 To i
Selection.Insert Shift:=xlToDown, CopyOrigin:=xlFormatFromRightorAbove
Next j
Last: Exit Sub
End Sub

5. Tự động căn chỉnh cột

Sub AutoFitColumns()
Cells.Select
Cells.EntireColumn.AutoFit
End Sub

6. Tự động căn chỉnh hàng

Sub AutoFitRows()
Cells.Select
Cells.EntireRow.AutoFit
End Sub

7. Hiển thị tất cả các dòng và cột đã bị ẩn
Thay vì hiển thị từng hàng và cột một cách thủ công, bạn có thể sử dụng mã này để thực hiện chỉ trong một bước.

Sub UnhideRowsColumns()
Columns.EntireColumn.Hidden = False
Rows.EntireRow.Hidden = False
End Sub

8. Xóa Wrap Text
Mã code này sẽ giúp bạn xóa WrapText khỏi toàn bộ worksheet với một cái nhấp chuột. Đầu tiên nó sẽ chọn tất cả các cột và sau đó xóa WrapText và tự động căn chỉnh độ rộng các hàng và cột.

Sub RemoveWrapText() 
Cells.Select
Selection.WrapText = False
Cells.EntireRow.AutoFit
Cells.EntireColumn.AutoFit
End Sub

9. Bỏ hợp nhất các ô
Chọn các ô và chạy mã này, nó sẽ không trộn tất cả các ô (Merge Cells) vừa chọn với dữ liệu bị mất của bạn.

Sub UnmergeCells()
Selection.UnMerge
End Sub

10. Mở Calculator
Trong cửa sổ của một bảng tính cụ thể, và hãy sử dụng mã macro này, bạn có thể mở máy tính trực tiếp từ Excel cho việc tính toán.

Sub OpenCalculator()
Application.ActivateMicrosoftApp Index:=0
End Sub

11. Nhân tất cả các số với một số cụ thể
Ví dụ: bạn có một danh sách các số và bạn muốn nhân tất cả các số với một số cụ thể. Chọn một phạm vi các ô và chạy mã này. Đầu tiên mã sẽ yêu cầu bạn nhập số mà bạn muốn nhân và sau đó ngay lập tức sẽ nhân tất cả các số trong ô với số đó.

Sub multiplyWithNumber()
Dim rng As range
Dim c As Integer
c = InputBox("Enter number to multiple", "Input Required")
For Each rng In Selection
If WorksheetFunction.IsNumber(rng) Then
rng.Value = rng * c
Else
End If
Next rng
End Sub

Tương tự, bạn cũng có thể thêm một số vào một bộ số.

Sub addNumber()
Dim rng As range
Dim i As Integer
i = InputBox("Enter number to multiple", "Input Required")
For Each rng In Selection
If WorksheetFunction.IsNumber(rng) Then
rng.Value = rng + i
Else
End If
Next rng
End Sub

12. Thay thế các ô rỗng bằng giá trị 0
Đối với dữ liệu có ô khoảng trắng, bạn có thể sử dụng mã dưới đây để thêm số vào những ô trắng này. Bạn sẽ sử dụng những ô này cho các tính toán sau một cách dễ dàng với mã này.

Sub replaceBlankWithZero()
Dim rng As range
Selection.Value = Selection.Value
For Each rng In Selection
If rng = "" Or rng = " " Then
rng.Value = "0"
Else
End If
Next rng
End Sub

13. Tính căn bậc hai, bậc ba của các số trong vùng được chọn
Bạn có thể sử dụng mã này để tính số căn bình phương mà không cần áp dụng công thức. Mã sẽ kiểm tra tất cả các ô được chọn và chuyển đổi các số thành căn bình phương của chúng.

Sub getSquareRoot()
Dim rng As range
Dim i As Integer
For Each rng In Selection
If WorksheetFunction.IsNumber(rng) Then
rng.Value = Sqr(rng)
Else
End If
Next rng
End Sub

Mã sau sẽ kiểm tra tất cả các ô được chọn và chuyển đổi các số thành căn bậc ba của chúng.

Sub getCubeRoot()
Dim rng As range
Dim i As Integer
For Each rng In Selection
If WorksheetFunction.IsNumber(rng) Then
rng.Value = rng ^ (1 / 3)
Else
End If
Next rng
End Sub

14. Thêm thông tin ở chân trang/đầu trang
Sử dụng mã này để bổ sung ngày vào phần Header và Footer trong worksheet.
Bạn có thể điều chỉnh mã này để đổi từ Header sang Footer.

Sub DateInHeader()
With ActiveSheet.PageSetup
.LeftHeader = ""
.CenterHeader = "&D"
.RightHeader = ""
.LeftFooter = ""
.CenterFooter = ""
.RightFooter = ""
End With
ActiveWindow.View = xlNormalView
End Sub

Nếu bạn muốn chèn Header tùy chỉnh thì đây là một mã dành cho bạn.
Chạy mã này, nhập giá trị tùy chỉnh vào input box. Để thay đổi liên kết của Header hoặc Footer, bạn có thể điều chỉnh mã.

Sub CustomHeader()
Dim myText As String
myText = InputBox("Enter your text here", "Enter Text")
With ActiveSheet.PageSetup
.LeftHeader = ""
.CenterHeader = myText
.RightHeader = ""
.LeftFooter = ""
.CenterFooter = ""
.RightFooter = ""
End With
End Sub

15. In vùng được chọn

Sub printSelection()
Selection.PrintOutCopies:=1, Collate:=True
End Sub

16. Chuyển đổi tất cả các công thức sang giá trị
Đơn giản chỉ là chuyển đổi các formulas trong vùng chọn sang values.
Khi bạn chạy mã macro này, mã sẽ thay đổi các formulas sang các absolute values.

Sub ConvertToValues()
Dim MyRange As range
Dim MyCell As range
Select Case MsgBox("You Can't Undo This Action. " & "Save Workbook First?", vbYesNoCancel, "Alert")
Case Is = vbYes
ThisWorkbook.Save
Case Is = vbCancel
Exit Sub
End Select
Set MyRange = Selection
For Each MyCell In MyRange
If MyCell.HasFormula Then
MyCell.Formula = MyCell.Value
End If
Next MyCell
End Sub

17. Xóa tất cả các khoảng trắng (space) trong bảng tính
Đây là một trong những mã macro hữu ích nhât trong danh sách này. Mã sẽ kiểm tra selection của bạn và sau đó xóa tất cả khoảng trắng từ selection đó.

Sub RemoveSpaces()
Dim myRange As range
Dim myCell As range
Set myRange = Selection
For Each myCell In myRange
If Not IsEmpty(myCell) Then
myCell.Replace What:=" ", Replacement:="", LookAt:=xlPart
End If
Next myCell
End Sub

Và, thay thế tất cả khoảng trắng trong toàn bảng tính:

Sub ReplaceSpaces()
Application.ScreenUpdating = False
Dim c As range
    For Each c In ActiveSheet.UsedRange
    c = Replace(c.Value, " ", "")
    Next
Application.ScreenUpdating = True
End Sub

18. Xóa hàng loạt ký tự trong bảng tính
Bạn có thể sử dụng mã này để xóa một ký tự cụ thể từ ô được chọn. Mã sẽ hiển thị một input box để nhập ký tự mà bạn muốn xóa.

Sub removeChar()
Dim Rng As Range
Dim rc As String
rc = InputBox("Character(s) to Replace", "Enter Value")
For Each Rng In Selection
Selection.Replace What:=rc, Replacement:=""
Next
End Sub

19. Chèn thêm ký tự Degree Symbol
Ví dụ: bạn có một danh sách các số trong một cột và bạn muốn thêm degree symbol (độ C, độ F,…) vào chúng thì dùng đoạn mã sau.

Sub degreeSymbol()
Dim rng As range
For Each rng In Selection
rng.Select
If ActiveCell <> "" Then
If IsNumeric(ActiveCell.Value) Then
ActiveCell.Value = ActiveCell.Value & Chr(176)
End If
End If
Next
End Sub

20. Đảo ngược tất cả các ký tự trong ô
Bạn chỉ cần nhập công thức =rvrse(cell) vào một ô và chuyển đến ô có văn bản mà bạn muốn đảo ngược. Đoạn mã Function đó như sau:

Public Function rvrse(ByVal cell As Range) As String
rvrse = VBA.strReverse(cell.Value)
End Function

21. Đếm tất cả các từ có trong worksheet
Mã có thể giúp bạn đếm tất cả các từ trong một worksheet.

Sub Word_Count_Worksheet()
Dim WordCnt As Long
Dim rng As range
Dim S As String
Dim N As Long
For Each rng In ActiveSheet.UsedRange.Cells
S = Application.WorksheetFunction.Trim(rng.Text)
N = 0
If S <> vbNullString Then
N = Len(S) - Len(Replace(S, " ", "")) + 1
End If
WordCnt = WordCnt + N
Next rng
MsgBox "There are total " & Format(WordCnt, "#,##0") & " words in the active worksheet"
End Sub

22. Kích hoạt R1C1 reference style, hiển thị DataForm nhập tự động
Mã macro này sẽ giúp bạn kích hoạt R1C1 reference style mà không phải sử dụng Excel options.

Sub DataForm()
ActiveSheet.ShowDataForm
End Sub

23. Chuyển đổi chữ hoa, chữ thường
Chọn các ô và chạy mã này. Mã sẽ kiểm tra mỗi một ô của phạm vi được chọn và sau đó chuyển đổi chúng sang văn bản chữ hoa.

Sub convertUpperCase()
Dim Rng As Range
For Each Rng In Selection
If Application.WorksheetFunction.IsText(Rng) Then
Rng.Value = UCase(Rng)
End If
Next
End Sub

Mã này sẽ giúp bạn chuyển đổi văn bản được chọn sang văn bản chữ thường. Chỉ cần chọn một phạm vi các ô có văn bản và chạy mã này. Nếu một ô có 1 số hoặc bất kỳ giá trị nào không phải là văn bản thì giá trị đó sẽ được giữ lại.

Sub convertLowerCase()
Dim Rng As Range
For Each Rng In Selection
If Application.WorksheetFunction.IsText(Rng) Then
Rng.Value= LCase(Rng)
End If
Next
End Sub

Mã này sẽ chuyền đổi văn bản được chọn sang tên riêng mà có chữ cái đầu từ được viết hoa và phần còn lại được viết thường.

Sub convertProperCase()
Dim Rng As Range
For Each Rng In Selection
If WorksheetFunction.IsText(Rng) Then
Rng.Value= WorksheetFunction.Proper(Rng.Value)
End If
Next
End Sub

Trong trường hợp văn bản, từ đầu tiên có chữ cái đầu câu viết hoa và phần còn lại viết thường trong mỗi câu thì mã này sẽ giúp bạn chuyển đổi văn bản thường thành câu có chữ cái đầu được viết hoa.

Sub convertTextCase()
Dim Rng As Range
For Each Rng In Selection
If WorksheetFunction.IsText(Rng) Then
Rng.Value= UCase(Left(Rng, 1)) & LCase(Right(Rng, Len(Rng) -1))
End If
Next rng
End Sub

24. Thêm tự động bộ chữ cái (hoa, thường) vào bảng tính
Cũng giống như các dãy số, bạn cũng có thể chèn các chữ cái vào worksheet.
Đoạn mã sau sẽ giúp bạn làm điều đó.

'Chữ hoa
Sub addcAlphabets()
Dim i As Integer
For i = 65 To 90
ActiveCell.Value = Chr(i)
ActiveCell.Offset(1, 0).Select
Next i
End Sub

'Chữ thường
Sub addsAlphabets()
Dim i As Integer
For i = 97 To 122
ActiveCell.Value = Chr(i)
ActiveCell.Offset(1, 0).Select
Next i
End Sub

25. Chuyển đổi các ký hiệu số La Mã sang dạng số
Đôi khi, rất khó để nhận biết số La Mã là số seri. Mã này sẽ giúp bạn chuyển đổi số La Mã sang số Arabic.

Sub convertToNumbers()
Dim rng As range
Selection.Value = Selection.Value
For Each rng In Selection
If Not WorksheetFunction.IsNonText(rng) Then
rng.Value = WorksheetFunction.Arabic(rng)
End If
Next rng
End Sub

26. Highlight các bản sao (cùng giá trị) từ vùng được chọn
Mã macro sau đây sẽ kiểm tra mỗi ô bạn chọn và làm nổi bật các giá trị trùng lặp (cùng giá trị).
Bạn cũng có thể thay đổi màu sắc ColorIndex từ mã này.

Sub HighlightDuplicateValues()
Dim myRange As Range
Dim myCell As Range
Set myRange = Selection
For Each myCell In myRange
If WorksheetFunction.CountIf(myRange, myCell.Value) > 1 Then
myCell.Interior.ColorIndex = 36
End If
Next myCell
End Sub

27. Tô màu dòng và cột ô đang được chọn
Đoạn mã sau sẽ làm nổi bật dòng và cột đang được chọn bằng cách DoubleClick vào ô.
Hãy lưu ý rằng, khi áp dụng mã macro này bạn sẽ không thể điều chỉnh ô bằng cách nhấp đúp chuột.

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim strRange As String
strRange = Target.Cells.Address & "," & _
Target.Cells.EntireColumn.Address & "," & _
Target.Cells.EntireRow.Address
Range(strRange).Select
End Sub

28. Highlight làm nổi bật các ô trống
Macro cơ bản này sẽ làm nổi bật các ô trống trong vùng chọn

' Highlight all Blank Cells in Selection
Sub HighlightBlankCells()
Dim rng As Range
Set rng = Selection
rng.SpecialCells(xlCellTypeBlanks).Interior.Color = vbCyan
End Sub

29. Highlight làm nổi bật các dòng xen kẽ
Macro này hữu ích để làm nổi bật các hàng xen kẽ.

' Highlight Alternate Rows
Sub highlightAlternateRows()
Dim cell As Range
Dim myRange As Range

Set myRange = Selection

For Each cell In myRange.Rows
If cell.Row Mod 2 = 1 Then
cell.Interior.ColorIndex = 39
End If
Next cell
End Sub

30. Highlight top 10 giá trị
Chỉ cần bạn chọn một phạm vi chứa các giá trị cần tô màu và chạy mã macro sau đây. Đoạn mã thực thi sẽ làm nổi bật 10 giá trị lớn nhất với màu xanh.

Sub TopTen()
Selection.FormatConditions.AddTop10
Selection.FormatConditions(Selection.FormatConditions.Count).S
tFirstPriority
With Selection.FormatConditions(1)
.TopBottom = xlTop10Top
.Rank = 10
.Percent = False
End With
With Selection.FormatConditions(1).Font
.Color = -16752384
.TintAndShade = 0
End With
With Selection.FormatConditions(1).Interior
.PatternColorIndex = xlAutomatic
.Color = 13561798
.TintAndShade = 0
End With
Selection.FormatConditions(1).StopIfTrue = False
End Sub

31. Tô màu vùng đã được đặt tên (Highlight Named Ranges)
Nếu bạn không chắc chắn bao nhiêu vùng được đặt tên trong worksheet của bạn thì bạn có thể sử dụng mã này để làm nổi bật chúng.

Sub HighlightRanges()
Dim RangeName As Name
Dim HighlightRange As Range
On Error Resume Next
For Each RangeName In ActiveWorkbook.Names
Set HighlightRange = RangeName.RefersToRange
HighlightRange.Interior.ColorIndex = 33
Next RangeName
End Sub

32. Highlight Greater than Values
Sau khi chạy mã này, nó sẽ yêu cầu giá trị mà bạn muốn làm nổi bật các giá trị lớn hơn.

Sub HighlightGreaterThanValues()
Dim i As Integer
i = InputBox("Enter Greater Than Value", "Enter Value")
Selection.FormatConditions.Delete
Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlGreater, Formula1:=i
Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
With Selection.FormatConditions(1)
.Font.Color = RGB(0, 0, 0)
.Interior.Color = RGB(31, 218, 154)
End With
End Sub

33. Highlight Lower than Values
Khi muốn làm nổi bật các giá trị nhỏ hơn, chạy mã sau:

Sub HighlightLowerThanValues()
Dim i As Integer
i = InputBox("Enter Lower Than Value", "Enter Value")
Selection.FormatConditions.Delete
Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlLess, Formula1:=i
Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
With Selection.FormatConditions(1)
.Font.Color = RGB(0, 0, 0)
.Interior.Color = RGB(217, 83, 79)
End With
End Sub

34. Highlight các số âm
Chọn một phạm vi các ô và chạy mã này. Nó sẽ kiểm tra mỗi ô trong phạm vi này và làm nổi bật tất cả các ô có giá trị âm (negative numbers).

Sub HighlightNegativeNumbers()
Dim Rng As Range
For Each Rng In Selection
If WorksheetFunction.IsNumber(Rng) Then
If Rng.Value < 0 Then
Rng.Font.Color = -16776961
End If
End If
Next
End Sub

35. Highlight ký tự văn bản cụ thể cần tìm
Giả sử bạn có một tệp dữ liệu lớn và bạn muốn kiểm tra một chuỗi ký tự hoặc giá trị cụ thể. Trong trường hợp này, bạn có thể sử dụng mã này. Khi bạn chạy nó, màn hình sẽ hiện input box để bạn nhập giá trị muốn tìm kiếm.

Sub HighlightValue()
Application.ScreenUpdating = False
Dim Str As String, FindCll As Range, FindCLlAdd As String, i As Long
Str = InputBox("Enter Text Search", "Search")
Set FindCll = Cells.Find(What:=Str, After:=[IV65536], LookAt:=xlPart)
If FindCll Is Nothing Then Exit Sub
FindCLlAdd = FindCll.Address
Do
i = 1
Do Until InStr(i, FindCll.Value, Str) = 0
i = InStr(i, FindCll.Value, Str)
With FindCll.Characters(Start:=i, Length:=Len(Str)).Font
.FontStyle = "Bold"
.Color = -16776961
End With
i = i + Len(Str)
Loop
Set FindCll = Cells.FindNext(After:=FindCll)
Loop Until FindCll.Address = FindCLlAdd
Application.ScreenUpdating = True
End Sub

36. Highlight các ô có nhận xét
Để làm nổi bật tất cả các ô sử dụng Comments hãy dùng macro sau đây. Các ô chứa Comments sẽ được định dạng làm nổi bật lên.

Sub HighlightCommentCells()
Selection.SpecialCells(xlCellTypeComments).Select
Selection.Style = "Note"
End Sub

37. Tô màu những ô có giá trị duy nhất (không trùng)
Đoạn mã này sẽ làm nổi bật tất cả các ô được chọn mà có giá trị duy nhất.

Sub HighlightUniqueValues()
Dim rng As Range
Set rng = Selection
rng.FormatConditions.Delete
Dim uv As UniqueValues
Set uv = rng.FormatConditions.AddUniqueValues
uv.DupeUnique = xlUnique
uv.Interior.Color = vbGreen
End Sub

38. Tô màu những ô có giá trị bị trùng lặp
Sử dụng macro này để làm nổi bật tất cả các giá trị trùng lặp trong một vùng chọn.

' Highlight Duplicate Values in Selection
Sub HighlightDuplicateValues()
Dim myRange As Range
Dim cell As Range

Set myRange = Selection

For Each cell In myRange
If WorksheetFunction.CountIf(myRange, cell.Value) > 1 Then
cell.Interior.ColorIndex = 36
End If
Next cell
End Sub

39. Làm nổi bật sự khác nhau giữa 2 cột hoặc 2 dòng
Sử dụng mã này bạn có thể làm nổi bật sự khác biệt giữa 2 cột (các ô tương ứng).

Sub columnDifference()
Range("D7:D17,E7:E17").Select
Selection.ColumnDifferences(ActiveCell).Select
Selection.Style = "Bad"
End Sub

Sử dụng mã này bạn có thể làm nổi bật sự khác nhau giữa 2 hàng (các ô tương ứng).

Sub rowDifference()
Range("D7:D17,E7:E17").Select
Selection.RowDifferences(ActiveCell).Select
Selection.Style = "Good"
End Sub

40. Hiển thị chi tiết nội dung tất cả các Comments vào trong trang in
Sử dụng mã macro sau nhằm kích hoạt cài đặt để in (cell comments) ở cuối trang. Ví dụ: tổng số trang phải in là 1 trang. Sau khi sử dụng mã này bạn sẽ nhận được tất cả comments từ trang thứ 2.

Sub printComments()
With ActiveSheet.PageSetup
.printComments = xlPrintSheetEnd
End With
End Sub

41. Định dạng căn lề trang trước khi in
Sử dụng mã VBA này để in giấy có lề hẹp. Khi bạn chạy mã macro này, mã sẽ tự động thay đổi lề thành hẹp.

Sub printNarrowMargin()
With ActiveSheet.PageSetup
.LeftMargin = Application.InchesToPoints(0.25)
.RightMargin = Application.InchesToPoints(0.25)
.TopMargin = Application.InchesToPoints(0.75)
.BottomMargin = Application.InchesToPoints(0.75)
.HeaderMargin = Application.InchesToPoints(0.3)
.FooterMargin = Application.InchesToPoints(0.3)
End With
ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, IgnorePrintAreas:=False
End Sub

42. Print tùy chỉnh từ trang, đến trang
Thay vì sử dụng cài đặt từ print options, bạn có thể sử dụng mã này để in phạm vi trang điều chỉnh.
Ví dụ: bạn muốn từ trang 5 đến trang10. Bạn chỉ cần chạy mã VBA này và nhập trang bắt đầu và trang kết thúc.

Sub printCustomSelection()
Dim startpage As Integer
Dim endpage As Integer
startpage = InputBox("Please Enter Start Page number.", "Enter Value ")
If Not WorksheetFunction.IsNumber(startpage) Then
MsgBox "Invalid Start Page number. Please try again.", "Error"
Exit Sub
End If
endpage = InputBox("Please Enter End Page number.", "Enter Value ")
If Not WorksheetFunction.IsNumber(endpage) Then
MsgBox "Invalid End Page number. Please try again.", "Error"
Exit Sub
End If
Selection.PrintOut From:=startpage, To:=endpage, Copies:=1, Collate:=True
End Sub

43. Tùy chỉnh kích cỡ tất cả các biểu đồ về cùng kích thước
Mã macro này sẽ giúp bạn tạo tất cả các chart có chung kích cỡ. Bạn có thể thay đổi chiều cao và chiều rộng của Chart bằng cách thay đổi nó trong mã macro.

Sub Resize_Charts()
Dim i As Integer
For i = 1 To ActiveSheet.ChartObjects.Count
With ActiveSheet.ChartObjects(i)
.Width = 300
.Height = 200
End With
Next i
End Sub

44. Chèn tự động khung thời gian 24 giờ trong ngày

Với mã này, bạn có thể chèn phạm vi thời gian theo thứ tự từ 00:00 đến 23:00.

Sub TimeStamp()
Dim i As Integer
For i = 1 To 24
ActiveCell.FormulaR1C1 = i & ":00"
ActiveCell.NumberFormat = "[$-409]h:mm AM/PM;@"
ActiveCell.Offset(RowOffset:=1, ColumnOffset:=0).Select
Next i
End Sub

45. Chuyển đổi ngày tháng năm sang ngày (chỉ lấy giá trị ngày)
Nếu trong worksheet của bạn có dates và bạn muốn chuyển đổi tất cả các dates sang days. Bạn có thể sử dụng mã này. Đơn giản chỉ cần chọn phạm vi các ô và chạy mã này.

Sub dateToday()
Dim tempCell As range
Selection.Value = Selection.Value
For Each tempCell In Selection
If IsDate(tempCell) = True Then
With tempCell
.Value = Day(tempCell)
.NumberFormat = "00"
End With
End If
Next tempCell
End Sub

Tương tự, bạn cũng có thể chuyển đổi tất cả các dates sang month hoặc year

Sub dateToMonth()
Dim tempCell As range
Selection.Value = Selection.Value
For Each tempCell In Selection
If IsDate(tempCell) = True Then
With tempCell
.Value = Month(tempCell)
.NumberFormat = "00"
End With
End If
Next tempCell
End Sub

Sub dateToYear()
Dim tempCell As range
Selection.Value = Selection.Value
For Each tempCell In Selection
If IsDate(tempCell) = True Then
With tempCell
.Value = Year(tempCell)
.NumberFormat = "00"
End With
End If
Next tempCell
End Sub

46. Loại bỏ thời gian trong ô chứa thời gian và ngày tháng
Bạn có thể sử dụng mã này nếu trong worksheet có hiển thị thời gian cùng với ngày và bạn muốn xóa thời gian đi.

Sub removeTime()
Dim Rng As range
For Each Rng In Selection
If IsDate(Rng) = True Then
Rng.Value = VBA.Int(Rng.Value)
End If
Next
Selection.NumberFormat = "dd/mm/yyyy"
End Sub

Nếu bạn muốn xóa ngày đi, chỉ giữ lại thời gian thì đoạn mã sau sẽ xử lý việc đó.

Sub removeDate()
Dim Rng As range
For Each Rng In Selection
If IsDate(Rng) = True Then
Rng.Value = Rng.Value - VBA.Fix(Rng.Value)
End If
Next
Selection.NumberFormat = "hh:mm:ss am/pm"
End Sub

47. Ẩn tất cả các sheet, ngoại trừ sheet hiện hành

Ví dụ bạn muốn ẩn tất cả các worksheets trong workbook của bạn ngoài worksheet đang hoạt động. Mã macro sau sẽ giúp bạn làm điều này.

Sub HideWorksheet()
Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets
If ws.Name <> ThisWorkbook.ActiveSheet.Name Then
ws.Visible = xlSheetHidden
End If
Next ws
End Sub

48. Hiển thị tất cả các sheet đã ẩn trong workbook
Mã này dành cho việc nếu bạn muốn hiển thị tất cả các sheet có trong file mà bạn đã ẩn trước đó.

Sub UnhideAllWorksheet()
Dim ws As Worksheet
For Each ws In ActiveWorkbook.Worksheets
ws.Visible = xlSheetVisible
Next ws
End Sub

49. Tạo mật mã khóa bảo vệ worksheet
Đây là mã dành cho bạn nếu bạn muốn protect tất cả các worksheet chỉ trong một lần. Khi chạy mã macro này, bạn sẽ nhận được một input box để nhập password. Sau khi nhập password, click OK.

Sub ProtectAllWorskeets()
Dim ws As Worksheet
Dim ps As String
ps = InputBox("Enter a Password.", vbOKCancel)
For Each ws In ActiveWorkbook.Worksheets
ws.Protect Password:=ps
Next ws
End Sub

Macro này sẽ bảo vệ tất cả các trang tính trong một sổ làm việc.

' Protect All Worksheets
Sub ProtectAllSheets()
Dim ws As Worksheet

For Each ws In Worksheets
ws.Protect "password"
Next ws

End Sub

Còn nếu chỉ muốn protect sheet hiện hành, bạn có thể sử dụng mã này. Bạn chỉ cần nhập password của bạn vào trong đoạn mã.

Sub ProtectWS()
ActiveSheet.Protect "mypassword", True, True
End Sub

Ngược lại, nếu không muốn protect sheet bạn nhập đoạn mã sau.

Sub UnprotectWS()
ActiveSheet.Unprotect "mypassword"
End Sub

50. Chèn nhiều sheet cùng lúc chỉ trong một bước
Bạn có thể sử dụng mã này nếu bạn muốn thêm nhiều worksheet trong workbook của bạn chỉ trong một bước.
Khi bạn chạy mã macro này, bạn sẽ nhận được input box để nhập tổng số sheet mà bạn muốn nhập.

Sub InsertMultipleSheets()
Dim i As Integer
i = InputBox("Enter number of sheets to insert.", "Enter
Multiple Sheets")
Sheets.Add After:=ActiveSheet, Count:=i
End Sub

51. Sắp xếp lại thứ tự các worksheets theo tên
Mã này sẽ giúp bạn sắp xếp worksheets trong workbook dựa vào tên của worksheet.

Sub SortWorksheets()
Dim i As Integer
Dim j As Integer
Dim iAnswer As VbMsgBoxResult
iAnswer = MsgBox("Sort Sheets in Ascending Order?" & Chr(10) _
& "Clicking No will sort in Descending Order", _
vbYesNoCancel + vbQuestion + vbDefaultButton1, "Sort Worksheets ")
For i = 1 To Sheets.Count
For j = 1 To Sheets.Count - 1
If iAnswer = vbYes Then
If UCase$(Sheets(j).Name) > UCase$(Sheets(j + 1).Name) Then
Sheets(j).Move After:=Sheets(j + 1)
End If
ElseIf iAnswer = vbNo Then
If UCase$(Sheets(j).Name) < UCase$(Sheets(j + 1).Name) Then
Sheets(j).Move After:=Sheets(j + 1)
End If
End If
Next j
Next i
End Sub

52. Xóa tất cả các sheet rỗng (không có nội dung)
Chạy mã này và mã sẽ kiểm tra tất cả các worksheets trong workbook đang hoạt động và xóa chúng nếu là một worksheet trống rỗng.

Sub deleteBlankWorksheets()
Dim Ws As Worksheet
On Error Resume Next
Application.ScreenUpdating= False
Application.DisplayAlerts= False
For Each Ws In Application.Worksheets
If Application.WorksheetFunction.CountA(Ws.UsedRange) = 0 Then
Ws.Delete
End If
Next
Application.ScreenUpdating= True
Application.DisplayAlerts= True
End Sub

53. Lưu từng sheet thành từng file định dạng PDF
Đoạn mã này chỉ đơn giản là lưu từng worksheet thành một tệp PDF riêng. Bạn có thể thay đổi tên tệp từ mã này.

Sub SaveWorkshetAsPDF()
Dim ws As Worksheet
For Each ws In Worksheets
ws.ExportAsFixedFormat xlTypePDF, "pvdoffice" & ws.Name & ".pdf"
Next ws
End Sub

54. Sao chép worksheet hiện hành sang một workbook mới
Nếu bạn muốn sao chép worksheet đang hoạt động vào một workbook mới, bạn chỉ cần chạy mã macro và mã sẽ thực hiện việc đó cho bạn.
Điều này tiết kiệm rất nhiều thời gian.

Sub CopyWorksheetToNewWorkbook()
ThisWorkbook.ActiveSheet.Copy _
Before:=Workbooks.Add.Worksheets(1)
End Sub

55. Liệt kê danh sách tất cả các trang tính trong sổ làm việc
Macro này sẽ liệt kê tất cả các trang tính có trong trong sổ làm việc.

Sub ListSheets()
Dim ws As Worksheet
Dim x As Integer
x = 1
ActiveSheet.Range("C:C").Clear
For Each ws In Worksheets
ActiveSheet.Cells(x, 3) = ws.Name
x = x + 1
Next ws
End Sub

56. Sao chép và dán một hàng từ trang tính này sang trang tính khác
Macro siêu đơn giản này sẽ sao chép một hàng từ trang tính này sang trang tính khác

Sub Paste_OneRow()
'Copy and Paste Row
Sheets("sheet1").Range("1:1").Copy Sheets("sheet2").Range("1:1")

Application.CutCopyMode = False

End Sub

57. Đếm số workbook chưa được lưu (File > Save)

Ví dụ: bạn đang mở 5-10 workbook, bạn có thể sử dụng mã này để biết được số workbook chưa được lưu.

Sub VisibleWorkbooks()
Dim book As Workbook
Dim i As Integer
For Each book In Workbooks
If book.Saved = False Then
i = i + 1
End If
Next book
MsgBox i
End Sub

58. Làm mới dữ liệu (Refesh)

Trong Excel, Power Query cập nhật khi chúng ta bấm vào nút Refresh trong thẻ Data. Điều này chỉ làm mới dữ liệu cập nhật tại thời điểm đó. Tuy nhiên, có nhiều tình huống mà chúng ta muốn Power Query tự động làm mới. Code sau sẽ giúp chúng ta giải quyết vấn đề:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim MonitorRange As Range
Set MonitorRange = Me.Range("B5,B6:C13,Data")
If Not Application.Intersect(MonitorRange, Target) Is Nothing Then
ThisWorkbook.Connections("Query - Data").Refresh
End If
End Sub
Sub RefreshQueries()
ThisWorkbook.RefreshAll
End Sub
Sub RefreshQueries()
ThisWorkbook.Connections("Query - Data").Refresh
End Sub

59. Tạo nhanh email outlook gửi đi và đính kèm workbook hiện hành vào mail
Sử dụng mã macro này để gửi Active Workbook của bạn bằng email outlook một cách nhanh chóng. Bạn có thể thay đổi tên, email, nội dung trong mã và nếu bạn muốn gửi trực tiếp email này, sử dụng “.Send” thay vì “.Display”.

Sub Send_Mail()
Dim OutApp As Object
Dim OutMail As Object
Set OutApp = CreateObject("Outlook.Application")
Set OutMail = OutApp.CreateItem(0)
With OutMail
.to = "pvdofficeman@gmail.com"
.Subject = "HR Report"
.Body = "Hello, Please find attached HR Report."
.Attachments.Add ActiveWorkbook.FullName
.display
End With
Set OutMail = Nothing
Set OutApp = Nothing
End Sub

Nếu bạn chỉ cần đính kèm Active Workbook của bạn vào email outlook, thì sử dụng đoạn mã sau.

Sub OpenWorkbookAsAttachment()
Application.Dialogs(xlDialogSendMail).Show
End Sub

60. Tạo thư mục với VBA

Trong bài này, chúng ta sẽ thực hiện một dự án nhỏ để tạo một công cụ tạo thư mục. Với VBA, chúng ta có thể tạo một thư mục chỉ bằng một dòng mã.

Option Explicit
Sub CreateFolders()
MkDir "E:\pvdoffice\"
End Sub

Tạo nhiều thư mục dựa trên các ô đã chọn: thay vì sử dụng một ô duy nhất, hãy tạo một vòng lặp để chúng ta có thể tạo thư mục cho mỗi ô trong vùng chọn.

Sub CreateFolders()
On Error Resume Next
Dim c As Range
For Each c In Selection
MkDir c
Next c
On Error GoTo 0
End Sub

61. Delete pictures, shapes trong bảng tính
Trong một bảng tính excel có nhiều hình vẽ, hình ảnh khác nhau (mũi tên, hộp văn bản, hình elip, v.v.) . Làm thế nào để xóa tất cả chúng với một lần thao tác. Đoạn code sau sẽ giúp chúng ta giải quyết vấn đề:

Sub DeleteAllShapes()
Dim Shp As Shape
For Each Shp In ActiveSheet.Shapes
Shp.Delete
Next Shp
End Sub
Sub DeleteAllPictures()
Dim sh As Worksheet
For Each sh In ThisWorkbook.Worksheets
sh.Pictures.Delete
Next
End Sub
Sub DeleteAllShapes()
Dim GetShape As Shape
For Each GetShape In ActiveSheet.Shapes
GetShape.Delete
Next
End Sub

62. Xóa clipboard trong Excel
Để xóa clipboard, bạn có thể sử dụng đoạn mã bên dưới và chạy Sub TestClipboardClear để xóa clipboard của Windows

Option Explicit
Public Declare PtrSafe Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As LongPtr
Public Declare PtrSafe Function EmptyClipboard Lib "user32" () As LongPtr
Public Declare PtrSafe Function CloseClipboard Lib "user32" () As LongPtr

Public Function ClearClipboard()
OpenClipboard (0&)
EmptyClipboard
CloseClipboard
End Function

Sub TestClipboardClear()
Call ClearClipboard
End Sub