XEM NHANH BÀI VIẾT
Với VBA trong Excel, bạn có thể tự động hóa các tác vụ bằng cách viết cái gọi là macro. Trong phần đầu của bài viết này, hãy cùng Gitiho tìm hiểu cách tạo một macro đơn giản sẽ được thực thi sau khi kích vào nút lệnh. Bắt đầu bằng cách bật thẻ nhà phát triển Developer.
Developer Tab
Để bật tab Developer bạn hãy thực hiện theo các bước sau:
Bước 1: Kích chuột phải vào bất kỳ vị trí nào trên giao diện ribbon của Excel rồi chọn tùy chọn Customize the Ribbon … trong menu xổ xuống.
Bước 2: Trong cửa sổ mới hiện thị, chọn tùy chọn Main Tabs phía dưới mục Customize the Ribbon ở bên phải (nếu cần).
Bước 3: Di chuyển xuống phía dưới của mục Main Tabs, kích vào tùy chọn Developer.
Bước 4: Bấm nút OK để hoàn tất.
Bước 5: Quay trở lại giao diện ribbon, bạn sẽ tìm thấy thẻ Developer bên cạnh tab View như hình dưới đây.
Nút lệnh
Để đặt một nút lệnh trên file Excel của bạn, hãy thực hiện các bước sau.
Bước 1: Trên tab Developer bấm nút Insert.
Bước 2: Trong nhóm ActiveX Controls của menu xổ xuống, bấm nút Command Button.
Bước 3: Kích giữ chuột trái và kéo để tạo một nút lệnh trên sheets bất kỳ trong file Excel, nơi bạn muốn đặt nút lệnh.
Chỉ định Macro
Để gán macro (một hoặc nhiều dòng mã) cho nút lệnh, hãy thực hiện các bước sau.
Bước 1: Kích chuột phải vào nút CommandButton1 (đảm bảo nút Design Mode được chọn).
Bước 2: Chọn tùy chọn View Code trong menu xổ xuống. Trình soạn thảo Visual Basic xuất hiện.
Bước 3: Đặt con trỏ của bạn giữa Private Sub CommandButton1_Click() và End Sub.
Bước 4: Nhập vào dòng mã hiển thị như bên dưới.
Range("A1").Value = "Gitiho xin chào các bạn"
Lưu ý: Cửa sổ bên trái có tên là Sheet1 (Sheet1) và ThisWorkbook được gọi là Project Explorer. Nếu Project Explorer không hiển thị, hãy bấm View, Project Explorer. Nếu cửa sổ Code cho Sheet1không hiển thị, hãy bấm Sheet1 (Sheet1).
Bước 5: Đóng cửa sổ Visual Basic Editor.
Bước 6: Kích vào nút lệnh trên trang tính (đảm bảo nút Design Mode được bỏ chọn).
Kết quả sẽ hiển thị như hình dưới đây:
Như vậy bạn vừa tạo một macro đơn giản trong Excel.
Trình soạn thảo Visual Basic Editor
Để mở trình soạn thảo Visual Basic Editor, trên tab Developer, bấm nút Visual Basic hoặc nhấn tổ hợp phím Alt+F11.
Cửa sổ trình soạn thảo Visual Basic Editor sẽ hiển thị như hình dưới đây.
Để học VBA bài bản và nhanh chóng hơn, hãy tham khảo các khóa học sau tại Gitiho bạn nhé:
Để tăng tính tương tác cho bảng tính Excel có sử dụng VBA của bạn, cụ thể trong trường hợp bạn muốn đưa ra một thông báo, một lưu ý cho người dùng, chúng ta dùng MsgBox trong Excel VBA.
MsgBox là một hộp thoại trong Excel có sử dụng VBA. Mục đích của việc tạp hộp thoại này là đưa ra một thông báo cho người dùng. Một MsgBox trong Excel VBA có thể được tạo ra trong trình soạn thảo code VBA của Excel như sau:
Một tin nhắn đơn giản
Bằng cách thực hiện các bước tương tự như mục Chỉ định macro ở trên, nhưng đến bước 3 thì bạn nhập vào mã sau:
MsgBox "Học tin học với Gitiho thật thú vị"
Lưu ý: Đoạn mã trên phải được nhập vào giữa dòng Private Sub CommandButton1_Click () và End Sub. Có nghĩa mã đầy đủ sẽ như sau:
Private Sub CommandButton1_Click ()
MsgBox "Hoc tin hoc voi Gitiho that thu vi"
End Sub
Sau đó đóng cửa sổ Visual Basic Editor và bấm vào nút lệnh để chạy đoạn code trên trong Excel VBA, chúng ta sẽ nhận được kết quả như sau:
Một tin nhắn nâng cao hơn một chút
Thay vì đưa ra một thông báo đơn giản như trên bạn có thể tạo một thông báo kiểu như yêu cầu nhập một số vào ô A1. Lúc này mã chính sẽ như sau:
MsgBox "Entered value is " & Range("A1").Value
Khi bạn bấm vào nút lệnh trong Excel VBA sẽ nhận được kết quả như sau:
Lưu ý: Trong câu lệnh trên Gitiho đã sử dụng toán tử & để nối (nối) hai chuỗi. Mặc dù giá trị Range ("A1"). Không phải là một chuỗi, nhưng nó vẫn hoạt động ở đây.
Để bắt đầu một dòng mới trong tin nhắn, hãy sử dụng vbNewLine
Sử dụng đoạn mã sau
MsgBox "Line 1" & vbNewLine & "Line 2"
Khi bạn bấm vào nút lệnh trong Excel VBA sẽ nhận được kết quả như sau
Lưu ý: Những đoạn mã chỉ có mình phần mã chính. Bạn phải nhập các đoạn mã đó nằm giữa Private Sub CommandButton1_Click() và End Sub để có được một mã VBA hoàn chỉnh.
Xem thêm: Tìm hiểu về cách tự tạo hàm Excel trong VBA
Phần tiếp theo Gitiho sẽ cùng các bạn tìm hiểu thêm về đối tượng Workbook và Worksheet trong Excel VBA .
Cấu trúc phân cấp đối tượng
Trong Excel VBA, một đối tượng có thể chứa một đối tượng khác và đối tượng đó có thể chứa một đối tượng khác ... Nói cách khác, lập trình VBA trong Excel liên quan đến việc làm việc với một hệ thống phân cấp đối tượng. Điều này nghe có vẻ khá khó hiểu, nhưng chúng tôi sẽ nói rõ.
“Mẹ” của tất cả các đối tượng là chính Excel. Chúng tôi gọi nó là đối tượng Ứng dụng (Application). Đối tượng ứng dụng chứa các đối tượng khác. Ví dụ, đối tượng Workbook (tệp Excel). Đây có thể là bất kỳ workbook nào bạn đã tạo. Đối tượng Workbook chứa các đối tượng khác, chẳng hạn như đối tượng Worksheet. Đối tượng Worksheet lại chứa các đối tượng khác, chẳng hạn như đối tượng Phạm vi (Range object).
Ở phần tạo Macro đầu tiên trong bài này đã hướng dẫn chi tiết về cách chạy một mã VBA bằng cách bám vào nút lệnh. Trong đó chúng tôi đã sử dụng dòng mã sau:
Range("A1").Value = "Hello"
Nhưng ý nghĩa của dòng mã trên thực sự là:
Application.Workbooks("create-a-macro").Worksheets(1).Range("A1").Value = "Hello"
Lưu ý: Các đối tượng được kết nối bằng dấu chấm. Tuy nhiên chúng ta không phải thêm một dòng mã theo cách này. Đó là vì chúng ta đã đặt một nút lệnh của mình trong tệp create-a-macro.xlsm, trên worksheet đầu tiên. Nhưng nếu bạn muốn thay đổi mọi thứ trên các worksheet khác nhau, phải bao gồm đối tượng Worksheet.
Bộ sưu tập
Bạn có thể nhận thấy rằng Workbooks và Worksheets đều là số nhiều. Đó là bởi vì chúng là bộ sưu tập. Bộ sưu tập Workbooks chứa tất cả các đối tượng Workbook hiện đang mở. Trong khi bộ sưu tập Worksheets lại chứa tất cả các đối tượng Worksheet trong sổ làm việc.
Bạn có thể tham chiếu đến một thành viên của bộ sưu tập, ví dụ một đối tượng Worksheet đơn lẻ, theo ba cách.
1. Sử dụng tên Worksheet.
Worksheets("Sales").Range("A1").Value = "Hello"
2. Sử dụng số chỉ mục (1 là trang tính đầu tiên bắt đầu từ bên trái).
Worksheets(1).Range("A1").Value = "Hello"
3. Sử dụng CodeName.
Sheet1.Range("A1").Value = "Hello"
Để xem CodeName của một worksheet bạn cần mở trình soạn thảo Visual Basic Editor. Trong Project Explorer, tên đầu tiên là CodeName. Tên thứ hai là tên worksheet (Sales), như hình ảnh dưới đây
Lưu ý: CodeName vẫn giữ nguyên nếu bạn thay đổi tên worksheet hoặc thứ tự các worksheet của mình, vì vậy đây là cách an toàn nhất để tham chiếu worksheet. Bằng cách bấm menu View > Properties để thay đổi CodeName của một worksheet. Nhưng có một nhược điểm của phương pháp này đó là bạn không thể sử dụng CodeName nếu tham chiếu một worksheet trong một workbook khác.
Thuộc tính và phương thức
Bây giờ chúng ta hãy xem xét một số thuộc tính (Properties) và phương thức (Methods) của bộ sưu tập Workbooks và Worksheets. Thuộc tính là cái gì đó mà một bộ sưu tập có (chúng mô tả bộ sưu tập), trong khi phương thức thực hiện một cái gì đó (chúng thực hiện một hành động với một bộ sưu tập).
Để đặt một nút lệnh trên worksheet của bạn và thêm các dòng mã:
1. Chèn Method của bộ sưu tập Workbooks để tạo một workbook mới.
Workbooks.Add
2. Thuộc tính Count của bộ sưu tập Worksheets đếm số trang tính trong worksheets.
MsgBox Worksheets.Count
Kết quả khi bạn bấm vào nút lệnh trên trang tính sẽ có bảng thông báo như dưới đây hiển thị:
Lưu ý: Thuộc tính Count của bộ sưu tập Workbooks sẽ đếm số lượng workbooks đang hoạt động.
Lưu ý: Những đoạn mã chỉ có mình phần mã chính. Bạn phải nhập các đoạn mã đó nằm giữa Private Sub CommandButton1_Click() và End Sub để có được một mã VBA hoàn chỉnh.
Xem thêm: Hướng dẫn các phép toán trong VBA: Phép nhân, phép chia, phép cộng, mô đun
Đối tượng phạm vi Range Object là đại diện của một ô (hoặc nhiều ô) trên bảng tính (worksheet) của bạn, là đối tượng quan trọng nhất của Excel VBA.
Ở phần tiếp theo này Gitiho sẽ giới thiệu tổng quan về các thuộc tính và phương thức của đối tượng Range. Thuộc tính là một cái gì đó mà một đối tượng có (chúng mô tả đối tượng), trong khi các phương thức thực hiện một cái gì đó (chúng thực hiện một hành động với một đối tượng).
Ví dụ về phạm vi
Đặt một nút lệnh trên trang tính của bạn và nhập vào các dòng mã sau vào cửa sổ Visual Basic Editor:
Private Sub CommandButton1_Click ()
Range("B3").Value = 2
End Sub
Khi bạn nhấp vào nút lệnh trên trang tính, chúng ta sẽ nhật được kết quả như sau:
Với mã sau:
Private Sub CommandButton1_Click ()
Range("A1:A4").Value = 5
End Sub
Bạn sẽ nhận được kết quả như hình dưới đây
Tương tự như vậy với mã sau:
Range("A1:A2,B3:C4").Value = 10
Bạn sẽ nhận được kết quả như hình dưới đây
Lưu ý: Để tham chiếu đến phạm vi được đặt tên trong mã VBA Excel của bạn, hãy sử dụng dòng mã như sau:
Range("Prices").Value = 15
Cell
Thay vì phạm vi (Range), bạn cũng có thể sử dụng Ô (cell). Sử dụng Ô đặc biệt hữu ích khi bạn muốn lặp qua các phạm vi.
Mã sử dụng sẽ như sau:
Cells(3, 2).Value = 2
Kết quả trả về của lệnh trên sẽ như hình dưới đây.
Giải thích: Excel VBA nhập giá trị 2 vào ô ở giao điểm của hàng 3 và cột 2.
Với đoạn mã sau:
Range(Cells(1, 1), Cells(4, 1)).Value = 5
Kết quả sẽ trả về trong trang tính như hình dưới đây.
Khai báo một đối tượng phạm vi
Bạn có thể khai báo một đối tượng phạm vi bằng cách sử dụng các từ khóa Dim và Set.
Sử dụng đoạn mã đầy đủ như sau để thực hiện:
Private Sub CommandButton1_Click ()
Dim example As Range
Set example = Range("A1:C4")
example.Value = 8
End Sub
Kết quả của đoạn mã trên sẽ trả về như hình dưới đây:
Select
Một phương thức quan trọng của đối tượng Range là phương thức Select. Phương thức Select chỉ đơn giản là chọn một phạm vi.
Tương tự bạn có thể sử dụng đoạn mã sau:
Dim example As Range
Set example = Range("A1:C4")
example.Select
Kết quả sẽ trả về như hình dưới đây:
Lưu ý: Để chọn các ô trên một trang tính khác (worksheet), trước tiên bạn phải kích hoạt trang tính này. Ví dụ, các dòng mã sau đây sẽ chọn ô B7 trên trang tính thứ ba từ bên trái.
Worksheets(3).Activate
Worksheets(3).Range("B7").Select
Hàng (Rows)
Thuộc tính Rows cho phép truy cập vào một hàng cụ thể của một dải ô.
Bạn có thể sử dụng đoạn mã sau:
Dim example As Range
Set example = Range("A1:C4")
example.Rows(3).Select
Kết quả sẽ trả về như hình dưới đây:
Cột (Columns)
Thuộc tính Columns cho phép truy cập vào một cột cụ thể của một dải ô.
Bạn có thể sử dụng đoạn mã sau:
Dim example As Range
Set example = Range("A1:C4")
example.Columns(2).Select
Kết quả sẽ trả về như hình dưới đây:
Copy/Paste
Phương pháp Copy và Paste được sử dụng để sao chép một dải ô và dán vào một nơi khác trên trang tính.
Bạn có thể sử dụng đoạn mã sau:
Range("A1:A2").Select
Selection.Copy
Range("C3").Select
ActiveSheet.Paste
Kết quả sẽ trả về như hình dưới đây:
Mặc dù điều này được cho phép trong Excel VBA, nhưng tốt hơn nhiều là sử dụng dòng mã bên dưới để làm chính xác như vậy.
Range("C3:C4").Value = Range("A1:A2").Value
Xóa (Clear)
Để xóa nội dung của một phạm vi Excel, bạn có thể sử dụng phương pháp ClearContents với mã cực kỳ đơn giản sau:
Range("A1").ClearContents
Hoặc đơn giản là sử dụng mã:
Range("A1").Value = ""
Lưu ý: Sử dụng phương pháp Clear để xóa nội dung và định dạng của một dải ô. Sử dụng phương pháp ClearFormats để chỉ xóa định dạng.
Đếm (Count)
Với thuộc tính Count, bạn có thể đếm số ô, hàng và cột của một phạm vi.
Bạn có thể sử dụng đoạn mã sau:
Dim example As Range
Set example = Range("A1:C4")
MsgBox example.Count
Kết quả trả về sẽ là bảng thông báo sau hiển thị:
Hoặc cũng có thể sử dụng mã sau:
Dim example As Range
Set example = Range("A1:C4")
MsgBox example.Rows.Count
Kết quả trả về sẽ như hình dưới đây:
Lưu ý: Theo cách tương tự, bạn có thể đếm số cột của một phạm vi.
Lưu ý: Những đoạn mã chỉ có mình phần mã chính. Bạn phải nhập các đoạn mã đó nằm giữa Private Sub CommandButton1_Click() và End Sub để có được một mã VBA hoàn chỉnh.
Xem thêm: Hướng dẫn các phép toán trong VBA: Phép nhân, phép chia, phép cộng, mô đun
Ở phần này của bài viết, Gitiho sẽ hướng dẫn các bạn cách khai báo, khởi tạo và hiển thị một biến trong Excel VBA. Việc cho phép Excel VBA biết bạn đang sử dụng một biến được gọi là khai báo một biến. Khởi tạo đơn giản có nghĩa là gán giá trị bắt đầu (ban đầu) cho một biến.
Đặt một nút lệnh trên trang tính của bạn và thêm các dòng mã bên dưới. Để thực hiện các dòng mã, hãy bấm vào nút lệnh trên trang tính.
Số nguyên (Integer)
Biến số nguyên được sử dụng để lưu trữ số nguyên.
Đặt một nút lệnh trên trang tính của bạn và nhập vào các dòng mã sau vào cửa sổ Visual Basic Editor:
Dim x As Integer
x = 6
Range("A1").Value = x
Mã đầy đủ phải nhập sẽ là
Private Sub CommandButton1_Click ()
Dim x As Integer
x = 6
Range("A1").Value = x
End Sub
Kết quả khi bạn bấm vào nút lệnh trên trang tính sẽ hiển thị như hình dưới đây:
Giải thích: Dòng mã đầu tiên sẽ khai báo một biến có tên x kiểu Integer. Tiếp theo, chúng ta khởi tạo x với giá trị 6. Cuối cùng ghi giá trị của x vào ô A1.
Chuỗi (String)
Biến chuỗi được sử dụng để lưu trữ văn bản.
Đoạn mã cụ thể như sau:
Dim book As String
book = "bible"
Range("A1").Value = book
Kết quả trả về sẽ như hình ảnh dưới đây:
Giải thích: Dòng mã đầu tiên khai báo một biến có sổ tên kiểu String. Tiếp theo, khởi tạo sách bằng văn bản. Luôn sử dụng dấu nháy đơn để khởi tạo biến String. Cuối cùng, ghi văn bản của sổ biến vào ô A1.
Gấp đôi (Double)
Một biến kiểu Double chính xác hơn một biến kiểu Integer và cũng có thể lưu số sau dấu phẩy.
Đoạn mã cụ thể như sau:
Dim x As Integer
x = 5.5
MsgBox "value is " & x
Kết quả bảng thông báo sau sẽ hiển thị:
Nhưng đó không phải là giá trị phù hợp. Vì chúng tôi khởi tạo biến với giá trị 5.5 và nhận được giá trị 6. Những gì chúng tôi cần là một biến kiểu Double vì vậy mã sẽ như sau:
Dim x As Double
x = 5.5
MsgBox "value is " & x
Kết quả trả về sẽ là bảng thông báo sau:
Boolean
Sử dụng biến Boolean để giữ giá trị True hoặc False.
Đoạn mã cụ thể như sau:
Dim continue As Boolean
continue = True
If continue = True Then MsgBox "Boolean variables are cool"
Kết quả trả về sẽ là bảng thông báo sau:
Giải thích: Dòng đầu tiên khai báo một biến có tên là kiểu Boolean. Tiếp theo, chúng ta khởi tạo continue với giá trị True. Cuối cùng, sử dụng biến Boolean để chỉ hiển thị MsgBox nếu biến giữ giá trị True.
Lưu ý: Những đoạn mã chỉ có mình phần mã chính. Bạn phải nhập các đoạn mã đó nằm giữa Private Sub CommandButton1_Click() và End Sub để có được một mã VBA hoàn chỉnh.
Xem thêm: Hướng dẫn cách tùy biến comment trong Excel bằng VBA (Phần 1)
Sử dụng câu lệnh If Then trong Excel VBA để thực thi các dòng mã nếu một điều kiện cụ thể được đáp ứng.
Câu lệnh If Then
Đầu tiên bạn đặt một nút lệnh VBA trên trang tính (thực hiện như phần đầu Cách tạo Macro trong Excel) của bạn và nhập vào các dòng mã sau:
Dim score As Integer, result As String
score = Range("A1").Value
If score >= 60 Then result = "pass"
Range("B1").Value = result
Mã đầy đủ phải nhập sẽ là
Private Sub CommandButton1_Click ()
Dim score As Integer, result As String
score = Range("A1").Value
If score >= 60 Then result = "pass"
Range("B1").Value = result
End Sub
Giải thích: Nếu phạm vi ô A1 lớn hơn hoặc bằng 60, Excel VBA sẽ trả về kết quả Pass (Đạt).
Kết quả khi bạn bấm vào nút lệnh trên trang tính sẽ hiển thị như hình dưới đây:
Lưu ý: Nếu phạm vi ô A1 nhỏ hơn 60, Excel VBA sẽ đặt giá trị của kết quả trống vào ô B1.
Else Statement
Đặt một nút lệnh trên trang tính của bạn và thêm các dòng mã sau:
Dim score As Integer, result As String
score = Range("A1").Value
If score >= 60 Then
result = "pass"
Else
result = "fail"
End If
Range("B1").Value = result
Giải thích: Nếu phạm vi ô A1 lớn hơn hoặc bằng 60, Excel VBA trả về kết quả là Pass (Đậu), nếu không Excel VBA trả về kết quả là Fail (Trượt).
Kết quả khi bạn bấm vào nút lệnh trên trang tính sẽ hiển thị như hình dưới đây:
Lưu ý: Chỉ khi bạn có một dòng mã sau câu lệnh Then và no Else statement thì mới được phép đặt một dòng mã ngay sau Then và bỏ qua (bỏ đi) End If (ví dụ đầu tiên). Nếu không, hãy bắt đầu một dòng mới sau các từ Then và Else và kết thúc bằng End If (ví dụ thứ hai).
Lưu ý: Những đoạn mã chỉ có mình phần mã chính. Bạn phải nhập các đoạn mã đó nằm giữa Private Sub CommandButton1_Click() và End Sub để có được một mã VBA hoàn chỉnh.
Xem thêm: Hướng dẫn cách tùy biến comment trong Excel bằng VBA (Phần 2)
Looping (vòng lặp) là một trong những kỹ thuật lập trình mạnh mẽ nhất. Nó là quá trình lặp lại 1 đoạn mã theo một số lần nhất định trong VBA. Ưu điểm của nó là giúp giảm thời gian của những việc phải thực hiện lặp đi lặp lại nhiều lần như in ấn hàng loạt Hóa đơn, phiếu thu, phiếu chi … với một mẫu phiếu duy nhất.
Single Loop (Vòng lặp đơn)
Bạn có thể sử dụng một vòng lặp đơn để lặp qua phạm vi ô một chiều.
Bạn có thể đặt một nút lệnh trên trang tính của mình và nhập vào các dòng mã sau:
Dim i As Integer
For i = 1 to 6
Cells (i, 1) .Value = 100
Next i
Mã đầy đủ phải nhập sẽ là
Private Sub CommandButton1_Click ()
Dim i As Integer
For i = 1 to 6
Cells (i, 1) .Value = 100
Next i
End Sub
Kết quả khi bạn bấm vào nút lệnh trên trang tính sẽ hiển thị như hình dưới đây:
Giải thích: Các dòng mã giữa For và Next sẽ được thực thi sáu lần. Với i = 1, Excel VBA nhập giá trị 100 vào ô ở giao điểm của hàng 1 và cột 1. Khi Excel VBA đến Next i, nó tăng i với 1 và nhảy trở lại câu lệnh For. Đối với i = 2, Excel VBA nhập giá trị 100 vào ô ở giao điểm của hàng 2 và cột 1 …
Lưu ý: Nên sử dụng phím tab để tạo thụt lề cho mã giữa các từ For và Next. Điều này sẽ giúp cho mã của bạn dễ đọc hơn.
Double Loop (Vòng lặp kép)
Khi chúng ta cần thực hiện nhiều vòng lặp lồng nhau trong cùng 1 câu lệnh VBA, khi đó chúng ta cần sử dụng vòng lặp kép.
Bạn có thể đặt một nút lệnh trên trang tính của mình và nhập vào các dòng mã sau:
Dim i As Integer , j As Integer
For i = 1 To 6
For j = 1 To 2
Cells (i, j) .Value = 100
Next j
Next i
Kết quả khi bạn bấm vào nút lệnh trên trang tính sẽ hiển thị như hình dưới đây:
Giải thích: Với i = 1 và j = 1, Excel VBA nhập giá trị 100 vào ô ở giao điểm của hàng 1 và cột 1. Khi Excel VBA đến Next j, nó tăng j với 1 và nhảy trở lại câu lệnh For j. Đối với i = 1 và j = 2, Excel VBA nhập giá trị 100 vào ô ở giao điểm của hàng 1 và cột 2.
Tiếp theo, Excel VBA bỏ qua Next j vì j chỉ chạy từ 1 đến 2. Khi Excel VBA đến Next i, nó tăng i với 1 và nhảy trở lại câu lệnh For i. Đối với i = 2 và j = 1, Excel VBA nhập giá trị 100 vào ô ở giao điểm của hàng 2 và cột 1 …
Triple Loop (Vòng lặp ba)
Bạn có thể sử dụng một vòng lặp ba để lặp qua các phạm vi hai chiều trên nhiều trang tính Excel.
Đặt một nút lệnh trên trang tính của bạn và nhập vào các dòng mã sau vào cửa sổ Visual Basic Editor:
Dim c As Integer, i As Integer, j As Integer
For c = 1 To 3
For i = 1 To 6
For j = 1 To 2
Worksheets(c).Cells(i, j).Value = 100
Next j
Next i
Next c
Giải thích: Thay đổi duy nhất được thực hiện so với mã cho vòng lặp kép là chúng tôi đã thêm một vòng lặp nữa và thêm Worksheets(c). Ở phía trước Cells để lấy phạm vi hai chiều trên sheet đầu tiên cho c = 1, sheet thứ hai cho c = 2 và sheet thứ ba cho c = 3.
Do While Loop
Bên cạnh vòng lặp For Next, còn có các vòng lặp khác trong Excel VBA. Ví dụ, vòng lặp Do While Loop. Mã được đặt giữa Do While và Loop sẽ được lặp lại miễn là phần sau Do While là đúng.
Bạn tiến hành đặt một nút lệnh trên trang tính của mình và nhập vào các dòng mã sau vào cửa sổ Visual Basic Editor:
Dim i As Integer
i = 1
Do While i < 6
Cells(i, 1).Value = 20
i = i + 1
Loop
Kết quả khi bạn bấm vào nút lệnh trên trang tính sẽ hiển thị như hình dưới đây:
Giải thích: Miễn là i nhỏ hơn 6, Excel VBA nhập giá trị 20 vào ô ở giao điểm của hàng i và cột 1 và tăng i lên 1. Trong Excel VBA (và trong các ngôn ngữ lập trình khác), ký hiệu '= 'nghĩa là trở thành. Nó không có nghĩa là bình đẳng. Vì vậy, i = i + 1 có nghĩa là i trở thành i + 1.
Nói cách khác lấy giá trị hiện tại của i và thêm 1 vào nó. Ví dụ: nếu i = 1, i trở thành 1 + 1 = 2. Kết quả là giá trị 20 sẽ được đặt vào cột A năm lần (không phải 6 vì Excel VBA dừng khi kết quả bằng 6).
(Còn tiếp)
Trên đây Gitiho vừa giới thiệu với các bạn Phần 1 của bài viết Tìm hiểu về VBA và cách sử dụng cơ bản nhất trong Excel. Hãy tiếp tục theo dõi các bài viết tiếp theo của chúng tôi để tiếp tục tìm hiểu về VBA nhé. Chúc các bạn thành công!.
Ở phần 2 của bài viết này, Gitiho tiếp tục giúp bạn đọc tìm hiểu về VBA và cách sử dụng cơ bản nhất trong Excel
Xem thêm: Tìm hiểu về VBA phần 1
Khi viết các mã Excel VBA sẽ khó có thể tránh được các lỗi với các câu lệnh, nhưng làm thế nào để tìm ra các lỗi đó để khắc phục? Ở phần này của bài viết, gitiho sẽ hướng dẫn các bạn cách xử lý các lỗi macro trong Excel. Đầu tiên, hãy tạo một số lỗi.
Đặt một nút lệnh trên trang tính của bạn và thêm các dòng mã sau:
Xem thêm: Tìm hiểu về VBA và cách sử dụng cơ bản nhất trong Excel (Phần 1) để biết cách đặt một nút lệnh trên trang tính và các bước để thêm các dòng mã vào Excel VBA.
x = 2
Range("A1").Valu = x
Trong đó đoạn mã đầy đủ sẽ là:
Private Sub CommandButton1_Click ()
x = 2
Range("A1").Valu = x
End Sub
Bước 1: Khi bạn bấm vào nút lệnh trong Excel VBA sẽ nhận được kết quả thông báo lỗi như sau.
Bước 2: Bấm vào nút OK. Trong đó * biến x không được xác định.
Bước 3: Trong cửa sổ Visual Basic Editor hiển thị, bạn bấm nút Reset để dừng trình gỡ lỗi.
Bước 4: Sửa lỗi bằng cách thêm dòng mã sau vào đầu mã.
Dim x As Integer
Lúc này đoạn mã đầy đủ sẽ là:
Private Sub CommandButton1_Click ()
Dim x As Integer
x = 2
Range("A1").Valu = x
End Sub
Bạn có thể đã nghe nói về kỹ thuật được gọi là gỡ lỗi trước đây. Với kỹ thuật này, bạn có thể thực hiện từng bước mã của mình.
Bước 5: Trong Visual Basic Editor, đặt con trỏ của bạn trước từ Private và nhấn F8.
Dòng đầu tiên chuyển sang màu vàng.
Bước 6: Nhấn F8 ba lần nữa.
Thông báo lỗi sau xuất hiện.
Như hình ảnh hiển thị cho thấy đối tượng Range có một thuộc tính là Value. Trong đó từ đã Value không được viết đúng chính tả (chỉ ghi là Valu) ở đây và chúng ta đã xác định được lỗi của mã VBA trong này. Gỡ lỗi là một cách tuyệt vời để không chỉ tìm lỗi mà còn hiểu mã tốt hơn.
Xem thêm: Hướng dẫn các phép toán trong VBA: Phép nhân, phép chia, phép cộng, mô đun
Trong phần này của bài viết, Gitiho sẽ hướng dẫn các bạn cách tìm các hàm quan trọng nhất để thao tác với chuỗi trong Excel VBA .
Đặt một nút lệnh trên trang tính của bạn và thêm các dòng mã bên dưới. Để thực hiện các dòng mã, hãy bấm vào nút lệnh trên trang tính.
Join Strings (Nối chuỗi)
Ở đoạn mã dưới đây, chúng tôi sử dụng toán tử & để nối (nối) các chuỗi với nhau. Mã cụ thể sẽ như sau:
Dim text1 As String, text2 As String
text1 = "Hi"
text2 = "Tim"
MsgBox text1 & " " & text2
Lúc này đoạn mã đầy đủ sẽ là:
Private Sub CommandButton1_Click ()
Dim text1 As String, text2 As String
text1 = "Hi"
text2 = "Tim"
MsgBox text1 & " " & text2
End Sub
Sau đó đóng cửa sổ Visual Basic Editor và bấm vào nút lệnh để chạy đoạn code trên trong Excel VBA, chúng ta sẽ nhận được kết quả như sau:
Lưu ý: Để chèn khoảng trắng, hãy sử dụng dấu ""
Left (Trái)
Để trích xuất các ký tự ngoài cùng bên trái từ một chuỗi, hãy sử dụng Left. Mã cụ thể sẽ như sau:
Dim text As String
text = "example text"
MsgBox Left(text, 4)
Sau khi đóng cửa sổ Visual Basic Editor và bấm vào nút lệnh Excel VBA, chúng ta sẽ nhận được kết quả như sau:
Right (Phải)
Để trích xuất các ký tự ngoài cùng bên phải từ một chuỗi, hãy sử dụng Right. Chúng ta cũng có thể chèn trực tiếp văn bản vào một hàm.
MsgBox Right("example text", 2)
Kết quả trả về sau khi bạn bấm vào nút lệnh Excel VBA sẽ như hình dưới đây:
Mid (Giữa)
Để trích xuất một chuỗi con, bắt đầu ở giữa một chuỗi, hãy sử dụng Mid. Bạn có thể chèn trực tiếp văn bản vào một hàm.
MsgBox Mid("example text", 9, 2)
Kết quả trả về, bạn sẽ nhận được thông báo như hình dưới đây:
Trong đó: Bắt đầu ở vị trí 9 (t) với độ dài 2. Bạn có thể bỏ qua đối số thứ ba nếu muốn trích xuất một chuỗi con bắt đầu ở giữa một chuỗi, cho đến cuối chuỗi.
Len
Để lấy độ dài của một chuỗi, hãy sử dụng Len. Mã chi tiết sẽ như sau:
MsgBox Len("example text")
Kết quả trả về khi bạn bấm nút lệnh Excel VBA sẽ nhận được thông báo như hình dưới đây:
Lưu ý: Bao gồm khoảng trống (vị trí 8)!
Instr
Để tìm vị trí của một chuỗi con trong một chuỗi, hãy sử dụng Instr. Mã chi tiết sẽ như sau:
MsgBox Instr("example text", "am")
Kết quả trả về khi bạn bấm nút lệnh Excel VBA sẽ nhận được thông báo như hình dưới đây:
Lưu ý: chuỗi "am" được tìm thấy ở vị trí 3.
Trong phần tiếp theo này, Gitiho sẽ hướng dẫn các bạn cách sử dụng các mã Excel VBA để làm việc với các đối tượng: Ngày, tháng, năm, ngày và giờ hiện tại; Giờ, phút, giây; Giá trị thời gian.
Tìm hiểu cách làm việc với ngày và giờ trong Excel VBA .
Đầu tiên bạn đặt một nút lệnh trên trang tính của mình và thêm các dòng mã bên dưới vào cửa sổ trình soạn thảo Visual Basic Editor.
Mỗi đoạn mã dưới đây phải được nhập vào giữa dòng Private Sub CommandButton1_Click () và End Sub.
Để chạy các dòng mã này, bạn hãy bấm vào nút lệnh đã đặt trên trang tính.
Năm, Tháng, Ngày của một Ngày
Mã macro dưới đây sẽ lấy năm của một ngày. Để khai báo ngày, hãy sử dụng câu lệnh Dim. Để khởi tạo một ngày, hãy sử dụng hàm DateValue. Đoạn mã sẽ như sau:
Dim exampleDate As Date
exampleDate = DateValue("Jan 19, 2020")
MsgBox Year(exampleDate)
Đoạn mã đầy đủ sẽ là:
Private Sub CommandButton1_Click ()
Dim exampleDate As Date
exampleDate = DateValue("Jan 19, 2020")
MsgBox Year(exampleDate)
End Sub
Khi đóng cửa sổ Visual Basic Editor và bấm vào nút lệnh để chạy đoạn code trên trong Excel VBA, chúng ta sẽ nhận được kết quả như sau:
Lưu ý: Sử dụng Month và Day để lấy tháng và ngày của một ngày.
DateAdd
Để thêm một số ngày vào một ngày, hãy sử dụng hàm DateAdd. Hàm DateAdd có ba đối số. Điền vào "d" cho đối số đầu tiên để thêm ngày. Điền vào 3 để đối số thứ hai thêm 3 ngày. Đối số thứ ba đại diện cho ngày mà số ngày sẽ được thêm vào.
Đoạn mã sẽ như sau:
Dim firstDate As Date, secondDate As Date
firstDate = DateValue("Jan 19, 2020")
secondDate = DateAdd("d", 3, firstDate)
MsgBox secondDate
Khi đóng cửa sổ Visual Basic Editor và bấm vào nút lệnh để chạy đoạn code trên trong Excel VBA, chúng ta sẽ nhận được kết quả như sau:
Lưu ý: Thay đổi "d" thành "m" để thêm một số tháng vào một ngày. Đặt con trỏ của bạn vào dòng DateAdd trong Visual Basic Editor và bấm phím F1 để được trợ giúp về các khoảng thời gian khác.
Ngày và giờ hiện tại
Để lấy ngày và giờ hiện tại, hãy sử dụng chức năng Now. Đoạn mã chi tiết sẽ như sau:
MsgBox Now
Khi bấm vào nút lệnh để chạy đoạn code trên trong Excel VBA, chúng ta sẽ nhận được kết quả như sau:
Giờ, phút, giây
Nếu bạn muốn nhận giờ của một thời gian, hãy sử dụng hàm Hour với mã chi tiết như sau:
MsgBox Hour(Now)
Khi bấm vào nút lệnh để chạy đoạn code trên trong Excel VBA, chúng ta sẽ nhận được kết quả như sau:
Lưu ý: Tương tự sử dụng hàm Minute và Second để lấy phút và giây của thời gian.
Giá trị thời gian
Hàm TimeValue sẽ chuyển đổi một chuỗi thành số serial thời gian. Số serial của thời gian là một số từ 0 đến 1. Ví dụ: Buổi trưa (nửa ngày) được biểu thị bằng 0,5. Do đó đoạn mã chi tiết sẽ như sau:
MsgBox TimeValue("9:20:01 am")
Kết quả trả về sẽ như hình dưới đây:
Bây giờ, để thấy rõ rằng Excel xử lý thời gian nội bộ dưới dạng số từ 0 đến 1, hãy thêm các dòng mã sau:
Dim y As Double
y = TimeValue("09:20:01")
MsgBox y
Kết quả trả về sẽ là:
Sự kiện là các hành động do người dùng thực hiện để kích hoạt Excel VBA thực thi mã.
Thông báo sự kiện khi mở tệp Excel
Mã được thêm vào sự kiện mở sổ làm việc (Workbook Open Event) sẽ được Excel VBA thực thi khi bạn mở workbook.
Bước 1: Mở trình soạn thảo Visual Basic Editor bằng cách bấm nút Visual Basic trên tab Developer hoặc nhấn tổ hợp phím Alt+F11.
Bước 2: Kích đúp vào Workbook ở phía dưới mục Project Explorer của cột bên trái.
Bước 3: Chọn Workbook từ danh sách thả xuống bên trái. Chọn Open từ danh sách thả xuống bên phải.
Bước 4: Thêm dòng mã sau vào sự kiện mở sổ làm việc (Workbook Open Event):
MsgBox "Good Morning"
Bước 5: Sau đó đóng cửa sổ Visual Basic Editor và đóng tệp Excel. Rồi mở lại tệp Excel. Kết quả bảng thông báo sau sẽ hiển thị:
Thông báo sự kiện khi thay đổi trang tính (Worksheet)
Đoạn mã dưới đây được thêm vào sự kiện thay đổi trang tính (Worksheet Change Event) sẽ được Excel VBA thực thi khi bạn thay đổi một ô trên worksheet.
Bước 1: Mở trình soạn thảo Visual Basic Editor bằng cách bấm nút Visual Basic trên tab Developer hoặc nhấn tổ hợp phím Alt+F11.
Bước 2: Kích đúp vào một sheet (ví dụ Sheet1) ở phía dưới mục Project Explorer của cột bên trái.
Bước 3: Chọn Worksheet từ danh sách thả xuống bên trái. Chọn Change từ danh sách thả xuống bên phải.
Thêm các dòng mã sau vào Worksheet Change Event
Bước 4: Bây giờ sự kiện thay đổi trang tính sẽ chú ý tất cả các thay đổi trên Sheet1. Như trong trường hợp này, chúng tôi chỉ muốn Excel VBA làm điều gì đó nếu có gì đó thay đổi trong ô B2. Để thực hiện, hãy thêm các dòng mã sau:
If Target.Address = "$B$2" Then
End If
Bước 5: Như vậy chúng tôi chỉ muốn Excel VBA hiển thị một bảng thông báo nếu người dùng nhập giá trị lớn hơn 80. Để đạt được điều này, hãy thêm dòng mã sau giữa If và End If.
If Target.Value > 80 Then MsgBox "Goal Completed"
Bước 6: Trên Sheet1, nhập một số lớn hơn 80 vào ô B2.
Kết quả bạn sẽ nhận được bảng thông báo như hình dưới đây:
Array là một nhóm các biến. Trong Excel VBA, bạn có thể tham chiếu đến một biến (phần tử) cụ thể của mảng bằng cách sử dụng tên mảng và số chỉ mục.
Mảng một chiều (One-dimensional Array)
Để tạo mảng một chiều, hãy thực hiện các bước sau.
Đặt một nút lệnh trên trang tính của bạn và thêm các dòng mã sau vào cửa sổ Visual Basic Editor. Trong đó đoạn mã dưới đây phải được nhập vào giữa dòng Private Sub CommandButton1_Click () và End Sub.
Dim Films(1 To 5) As String
Films(1) = "Lord of the Rings"
Films(2) = "Speed"
Films(3) = "Star Wars"
Films(4) = "The Godfather"
Films(5) = "Pulp Fiction"
MsgBox Films(4)
Kết quả khi bạn bấm vào nút lệnh trên trang tính, bảng thông báo sau sẽ hiển thị:
Giải thích: Dòng mã đầu tiên sẽ khai báo một mảng String với tên Films. Mảng bao gồm năm phần tử. Tiếp theo, chúng ta khởi tạo từng phần tử của mảng. Cuối cùng, hiển thị phần tử thứ tư bằng MsgBox.
Mảng hai chiều (Two-dimensional Array)
Để tạo mảng hai chiều, hãy thực hiện các bước sau. Lần này chúng ta sẽ đọc tên từ trang tính.
Đặt một nút lệnh trên trang tính của bạn và thêm các dòng mã sau vào cửa sổ Visual Basic Editor:
Dim Films(1 To 5, 1 To 2) As String
Dim i As Integer, j As Integer
For i = 1 To 5
For j = 1 To 2
Films(i, j) = Cells(i, j).Value
Next j
Next i
MsgBox Films(4, 2)
Kết quả khi bạn bấm vào nút lệnh trên trang tính, bảng thông báo sau sẽ hiển thị:
Giải thích: Dòng mã đầu tiên khai báo một mảng String với tên Films. Mảng có hai chiều. Nó bao gồm 5 hàng và 2 cột. Hai biến khác kiểu Integer được sử dụng cho Double Loop để khởi tạo từng phần tử của mảng. Cuối cùng sẽ hiển thị phần tử tại giao điểm của hàng 4 và cột 2.
Sự khác biệt giữa một hàm Function và một sub trong Excel VBA là một hàm có thể trả về một giá trị trong khi một sub thì không thể. Các hàm và sub trở nên rất hữu ích khi kích thước chương trình tăng lên.
Function
Nếu bạn muốn Excel VBA thực hiện một tác vụ trả về kết quả, bạn có thể sử dụng một hàm. Đặt một chức năng vào một moduln (Trong cửa sổ Visual Basic Editor, truy cập vào menu Insert, Module). Như trong ví dụ này, Function có tên Area.
Function Area(x As Double, y As Double) As Double
Area = x * y
End Function
Giải thích: Hàm này có hai đối số (kiểu Double) và một kiểu trả về (phần sau As cũng thuộc kiểu Double). Bạn có thể sử dụng tên của hàm (Area) trong mã của mình để cho biết bạn muốn trả về kết quả nào (ở đây là x*y).
Bây giờ bạn có thể tham chiếu đến hàm này (nói cách khác là gọi hàm) từ một nơi khác trong mã của mình bằng cách chỉ cần sử dụng tên của hàm và đưa ra một giá trị cho mỗi đối số.
Đặt một nút lệnh trên trang tính của bạn và thêm các dòng mã sau vào cửa sổ Visual Basic Editor:
Dim z As Double
z = Area(3, 5) + 2
MsgBox z
Giải thích: Hàm trả về một giá trị vì vậy bạn phải 'lấy' giá trị này trong mã của mình. Bạn có thể sử dụng một biến khác (z) cho việc này. Tiếp theo, có thể thêm một giá trị khác vào biến này (nếu muốn). Cuối cùng, hiển thị giá trị bằng MsgBox.
Kết quả khi bạn bấm vào nút lệnh trên trang tính, bảng thông báo sau sẽ hiển thị:
Sub
Nếu bạn muốn Excel VBA thực hiện một số hành động, bạn có thể sử dụng một Sub. Đặt một Sub vào một modul (Trong cửa sổ Visual Basic Editor, truy cập vào menu Insert, Module). Như trong ví dụ này, Sub có tên Area.
Sub Area(x As Double, y As Double)
MsgBox x * y
End Sub
Giải thích: Sub này có hai đối số (kiểu Double). Bạn có thể tham chiếu đến sub này từ một nơi khác trong mã của bạn bằng cách sử dụng tên của sub và đưa ra một giá trị cho mỗi đối số.
Đặt một nút lệnh trên trang tính của bạn và thêm các dòng mã sau vào cửa sổ Visual Basic Editor:
Area 3, 5
Kết quả khi bạn bấm vào nút lệnh trên trang tính sẽ hiển thị như hình dưới đây:
Như vậy bạn có thể thấy sự khác biệt giữa Function và Sub. Function trả lại những giá trị 15. Chúng tôi đã thêm giá trị 2 vào kết quả này và hiển thị kết quả cuối cùng. Khi gọi Sub sẽ không còn quyền kiểm soát nhiều hơn kết quả (15) vì sub không thể trả về giá trị.
Excel là một trong những dạng đối tượng. Chúng tôi gọi đó là các đối tượng ứng dụng (Application object). Các đối tượng ứng dụng cho phép truy cập đến rất nhiều lựa chọn liên quan đến Excel .
WorksheetFunction
Bạn có thể sử dụng thuộc tính WorksheetFunction trong Excel VBA để truy cập các hàm Excel.
Ví dụ để đặt một nút lệnh trên trang tính của bạn và thêm các dòng mã sau vào cửa sổ Visual Basic Editor:
Range("A3").Value = Application.WorksheetFunction.Average(Range("A1:A2"))
Kết quả khi bạn bấm vào nút lệnh trên trang tính, Excel VBA sẽ tính giá trị trung bình của các giá trị trong ô A1 và ô A2 và đặt kết quả vào ô A3.
Lưu ý: Thay vì Application.WorksheetFunction.Average, chỉ cần sử dụng WorksheetFunction.Average. Nếu bạn nhìn vào thanh công thức, có thể thấy rằng chính công thức đó không được chèn vào ô A3. Để chèn chính công thức vào ô A3, hãy sử dụng dòng mã sau:
Range("A3").Value = "=AVERAGE(A1:A2)"
ScreenUpdating
Đôi khi bạn có thể thấy hữu ích khi tắt ScreenUpdating trong khi thực thi mã. Kết quả là mã của bạn sẽ chạy nhanh hơn.
1. Ví dụ đặt một nút lệnh trên trang tính của bạn và thêm các dòng mã sau vào cửa sổ Visual Basic Editor:
Dim i As Integer
For i = 1 To 10000
Range("A1").Value = i
Next i
Khi bạn bấm vào nút lệnh trên trang tính, Excel VBA sẽ hiển thị mỗi giá trị một phần nhỏ của giây và điều này có thể mất một chút thời gian.
2. Nhưng để tăng tốc quá trình xử lý, hãy cập nhật mã như sau.
Dim i As Integer
Application.ScreenUpdating = False
For i = 1 To 10000
Range("A1").Value = i
Next i
Application.ScreenUpdating = True
Kết quả là mã của bạn sẽ chạy nhanh hơn nhiều và bạn sẽ chỉ thấy kết quả cuối cùng (10000).
DisplayAlerts
Bạn có thể hướng dẫn Excel VBA không hiển thị cảnh báo trong khi thực thi mã.
1. Ví dụ đặt một nút lệnh trên trang tính của bạn và thêm các dòng mã sau vào cửa sổ Visual Basic Editor:
ActiveWorkbook.Close
Khi bạn bấm vào nút lệnh trên trang tính, Excel VBA sẽ đóng tệp Excel của bạn và yêu cầu bạn lưu các thay đổi bạn đã thực hiện.
2. Để hướng dẫn Excel VBA không hiển thị cảnh báo này trong khi thực thi mã, hãy cập nhật mã sau vào cửa sổ Visual Basic Editor.
Application.DisplayAlerts = False
ActiveWorkbook.Close
Application.DisplayAlerts = True
Do đó, Excel VBA đóng tệp Excel của bạn mà không yêu cầu bạn lưu các thay đổi bạn đã thực hiện. Mọi thay đổi đều bị mất.
Tính toán
Theo mặc định, tính toán được đặt thành tự động. Do đó, Excel sẽ tự động tính toán lại bảng tính mỗi khi giá trị ảnh hưởng đến công thức thay đổi. Nếu bảng tính của bạn chứa nhiều công thức phức tạp, bạn có thể tăng tốc macro của mình bằng cách thiết lập tính toán thành thủ công.
1. Ví dụ: đặt một nút lệnh trên trang tính của bạn và thêm các dòng mã sau vào cửa sổ Visual Basic Editor:
Application.Calculation = xlCalculationManual
Như vậy, khi bạn nhấp vào nút lệnh trên trang tính, Excel VBA sẽ đặt tính toán thành thủ công.
2. Bạn có thể xác minh điều này bằng cách truy cập vào menu File > Options > Formulas.
3. Bây giờ khi bạn thay đổi giá trị của ô A1, giá trị của ô B1 sẽ không được tính lại.
Bạn có thể tính toán lại bảng tính của mình theo cách thủ công bằng cách nhấn F9.
4. Trong hầu hết các tình huống, bạn sẽ thiết lập tính toán thành tự động trở lại khi kết thúc mã của mình. Chỉ cần thêm dòng mã sau để đạt được điều này.
Application.Calculation = xlCalculationAutomatic
Trong phần này của bài viết, Gitiho sẽ hướng dẫn các bạn tìm hiểu cách tạo ActiveX Controls, chẳng hạn như nút lệnh, hộp văn bản, hộp danh sách …Để tạo ActiveX Controls, hãy thực hiện các bước sau.
Bước 1: Trên tab Developer, nhấn Insert.
Bước 2: Trong nhóm tính năng ActiveX Controls, hãy bấm vào nút Command Button trong menu xổ xuống để chèn nút lệnh điều khiển.
Bước 3: Kích giữ chuột trái và kéo để tạo một nút lệnh trên sheets bất kỳ trong file Excel, nơi bạn muốn đặt nút lệnh.
Bước 4: Kích chuột phải vào nút lệnh (đảm bảo nút Design Mode được chọn).
Bước 5: Chọn tùy chọn View Code trong menu xổ xuống. Trình soạn thảo Visual Basic xuất hiện.
Lưu ý: Bạn có thể thay đổi chú thích và tên của một điều khiển bằng cách kích chuột phải vào điều khiển (đảm bảo Design Mode được chọn) và chọn tùy chọn Properties. Thay đổi chú thích của nút lệnh thành 'Apply Blue Text Color'. Bây giờ, chúng ta sẽ đặt tên CommandButton1 cho nút bấm.
Bước 6: Thêm dòng mã được hiển thị bên dưới giữa Private Sub CommandButton1_Click () và End Sub.
Bước 7: Chọn phạm vi B2:B4 và bấm vào nút lệnh (đảm bảo nút Design Mode trên thanh công cụ ribbon được bỏ chọn).
Kết quả sẽ hiển thị như hình dưới đây:
Ở phần này Gitiho sẽ hướng dẫn bạn cách tạo UserForm trong VBA. Sử dụng UserForm trong VBA sẽ giúp bạn tạo một ứng dụng đúng nghĩa. Với giao diện, các sự kiện và lệnh được liên kết với đối tượng trong UserForm VBA, bạn có thể tạo được một ứng dụng có giao diện thực hiện theo các yêu cầu được lập trình, giống như hình dưới đây.
Chèn Controls
Để thêm Controls vào UserForm, hãy thực hiện các bước sau.
Bước 1: Mở trình soạn thảo Visual Basic Editor bằng cách, trên tab Developer, bấm nút Visual Basic hoặc nhấn tổ hợp phím Alt+F11. Nếu Project Explorer không hiển thị, hãy truy cập vào menu View > Project Explorer.
Bước 2: Nhấn phím Insert > UserForm. Nếu Toolbox không tự động xuất hiện, truy cập vào menu View > Toolbox. Màn hình của bạn sẽ được thiết lập như bên dưới.
Trong đó:
(1): Khung tạo giao diện người dùng. Nơi bạn có thể bố trí các đối tượng tương tác, hiện thị từ hộp công cụ Toolbox (2)
(2): Các đối tượng để tạo giao diện như Label (nhãn đặt tên), TextBox (ô nhập liệu), ListBox (danh sách) …
Bước 3: Chèn các control được liệt kê trong bảng bên dưới. Khi điều này được hoàn thành, kết quả sẽ phù hợp với hình ảnh của Userform được hiển thị trước đó.
Ví dụ: Để tạo điều khiển hộp văn bản bằng cách kích vào TextBox từ Toolbox. Tiếp theo, bạn có thể kéo một hộp văn bản trên Userform. Khi bạn đến khung Car, hãy nhớ vẽ khung này trước khi bạn đặt hai nút tùy chọn vào đó.
Bước 4: Thay đổi tên và chú thích của các control theo bảng dưới đây. Tên (Name) được sử dụng trong mã VBA Excel. Phụ đề (Captions) là những thứ xuất hiện trên màn hình của bạn. Bạn nên thay đổi tên của các control. Điều này sẽ làm cho mã của bạn dễ đọc hơn. Để thay đổi tên và chú thích của các control, truy cập vào menu View > Properties Window và kích vào từng control riêng lẻ một.
Lưu ý: Hộp tổ hợp (combo box) là một danh sách thả xuống từ đó người dùng có thể chọn một mục hoặc điền vào lựa chọn của riêng mình. Nhưng chỉ có thể chọn một trong các nút tùy chọn.
Hiển thị Userform
Để hiển thị Userform, hãy đặt một nút lệnh trên trang tính của bạn và thêm dòng mã sau:
Private Sub CommandButton1_Click()
DinnerPlannerUserForm.Show
End Sub
Bây giờ chúng ta sẽ tạo Sub UserForm_Initialize. Khi bạn sử dụng phương thức Show cho UserForm thì Sub này sẽ tự động được thực thi.
Bước 1: Mở trình soạn thảo Visual Basic Editor bằng cách, truy cập thẻ Developer, bấm nút Visual Basic hoặc nhấn tổ hợp phím Alt+F11.
Bước 2: Kích chọn Worksheet ở phía dưới mục Project Explorer của cột bên trái, kích chuột phải vào DinnerPlannerUserForm và chọn View Code.
Bước 3: Chọn Userform từ danh sách thả xuống bên trái. Tiếp theo chọn Initialize từ danh sách thả xuống bên phải.
Bước 4: Nhập vào các dòng mã sau:
Private Sub UserForm_Initialize()
'Empty NameTextBox
NameTextBox.Value = ""
'Empty PhoneTextBox
PhoneTextBox.Value = ""
'Empty CityListBox
CityListBox.Clear
'Fill CityListBox
With CityListBox
.AddItem "San Francisco"
.AddItem "Oakland"
.AddItem "Richmond"
End With
'Empty DinnerComboBox
DinnerComboBox.Clear
'Fill DinnerComboBox
With DinnerComboBox
.AddItem "Italian"
.AddItem "Chinese"
.AddItem "Frites and Meat"
End With
'Uncheck DataCheckBoxes
DateCheckBox1.Value = False
DateCheckBox2.Value = False
DateCheckBox3.Value = False
'Set no car as default
CarOptionButton2.Value = True
'Empty MoneyTextBox
MoneyTextBox.Value = ""
'Set Focus on NameTextBox
NameTextBox.SetFocus
End Sub
Giải thích: Hộp văn bản được làm trống, hộp danh sách và hộp tổ hợp được lấp đầy, hộp kiểm không được chọn … , v.v.
Gán các Macro
Như vậy chúng ta đã tạo được phần đầu của UserForm. Mặc dù có vẻ đã sẵn sàng, nhưng khi chúng ta bấm vào các nút lệnh trên UserForm lại không có gì xảy ra.
Bước 1: Mở Trình soạn thảo Visual Basic.
Bước 2: Trong khung Project Explorer bên trái, kích đúp vào mục DinnerPlannerUserForm.
Bước 3: Kích đúp vào nút Money spin.
Bước 4: Nhập vào các dòng mã sau:
Private Sub MoneySpinButton_Change()
MoneyTextBox.Text = MoneySpinButton.Value
End Sub
Giải thích: Dòng mã này cập nhật hộp văn bản khi bạn sử dụng nút Spin.
Bước 5: Kích đúp vào nút OK.
Bước 6: Tiếp tục nhập vào các dòng mã sau:
Private Sub OKButton_Click()
Dim emptyRow As Long
'Make Sheet1 active
Sheet1.Activate
'Determine emptyRow
emptyRow = WorksheetFunction.CountA(Range("A:A")) + 1
'Transfer information
Cells(emptyRow, 1).Value = NameTextBox.Value
Cells(emptyRow, 2).Value = PhoneTextBox.Value
Cells(emptyRow, 3).Value = CityListBox.Value
Cells(emptyRow, 4).Value = DinnerComboBox.Value
If DateCheckBox1.Value = True Then Cells(emptyRow, 5).Value = DateCheckBox1.Caption
If DateCheckBox2.Value = True Then Cells(emptyRow, 5).Value = Cells(emptyRow, 5).Value & " " & DateCheckBox2.Caption
If DateCheckBox3.Value = True Then Cells(emptyRow, 5).Value = Cells(emptyRow, 5).Value & " " & DateCheckBox3.Caption
If CarOptionButton1.Value = True Then
Cells(emptyRow, 6).Value = "Yes"
Else
Cells(emptyRow, 6).Value = "No"
End If
Cells(emptyRow, 7).Value = MoneyTextBox.Value
End Sub
Giải thích: đầu tiên, chúng tôi kích hoạt Sheet1. Tiếp theo, xác định emptyRow. Các biến emptyRow là hàng trống đầu tiên và tăng lên mỗi khi một bản ghi được thêm vào. Cuối cùng, chúng tôi chuyển thông tin từ Userform sang các cột cụ thể của emptyRow.
Bước 7: Kích đúp vào nút Clear.
Bước 8: Tiếp tục thêm vào các dòng mã sau:
Private Sub ClearButton_Click()
Call UserForm_Initialize
End Sub
Giải thích: Dòng mã này gọi Sub UserForm_Initialize khi bạn bấm vào nút Clear.
Bước 9: Kích đúp vào nút Cancel.
Bước 10: Nhập vào dòng mã sau:
Private Sub CancelButton_Click()
Unload Me
End Sub
Giải thích: Dòng mã này sẽ đóng Userform khi bạn nhấp vào nút Cancel.
Kiểm tra UserForm
Đóng cửa sổ Visual Basic Editor và nhập các nhãn được hiển thị bên dưới vào hàng 1 và kiểm tra các UserForm.
Kết quả sẽ hiển thị như hình dưới đây:
Nếu bạn đã đọc tới đây thì cảm ơn bạn rất nhiều. Chắc hẳn bài viết này đã giúp ích cho bạn giải quyết vấn đề trong công việc của mình. Hãy tiếp tục theo dõi chúng tôi trong các bài viết tiếp theo nhé!