Trong bài hướng dẫn VBA dưới đây, Học Excel Online sẽ giới thiệu bạn khóa học VBA cơ bản cho người mới bắt đầu, cụ thể là tập trung vào việc tạo macro Excel. Để hiểu rõ hơn bạn có thể xem qua một vài ví dụ trong bài viết và thực hiện theo.
Xem nhanh
Ảnh chụp màn hình bên dưới hiển thị các phần chính của Visual Basic Editor:
Khi thực hiện các hoạt động trong bài hướng dẫn này hãy đóng tất cả các workbook khác đang làm việc trong Excel.
Trong excel chúng ta sử dụng ngôn ngữ VBA để tạo macro. VBA là viết tắt của Visual Basic For Applications. Khi sử dụng thuật ngữ Excel Macro có nghĩa là đang đề cập đến VBA. Thuật ngữ macro về cơ bản là một tên gọi khác của sub.
Trong VBA chúng ta tạo các dòng chỉ dẫn để VBA xử lý. Chúng ta đặt các dòng mã trong một sub. Các sub này được lưu trữ trong mô-đun.
Module chỉ đơn giản là nơi bạn chứa mã. Module giống như là các kệ sách trong hiệu sách. Mục đích chính là lưu trữ sách theo sự phân chia cụ thể để tổng thể có tổ chức và cấu trúc hơn.
Cửa sổ chính hay là cửa sổ mã là vị trí để viết mã. Để xem mã cho bất kỳ module nào bạn chỉ cần đúp vào mục Project-VBAProject.
Việc có bao nhiêu module trong workbook và bao nhiêu mục Sub trong một module là tùy vào mục đích tác vụ. Ngoài ra cách đặt tên cho module và cách tổ chức các Sub cũng sẽ tùy thuộc vào bạn.
Trong phần tiếp theo sẽ hướng dẫn sử dụng Sub.
Mỗi dòng mã là một lệnh để VBA xử lý. Và các dòng mã đó được nhóm lại gọi là sub và đặt các sub này trong module.
Chúng ta tạo sub để VBA xử lý các lệnh trong mỗi dòng mã mà chúng ta đưa ra. Khi chúng ta chọn Run Sub từ menu thì VBA sẽ quét qua các dòng mã trong Sub và xử lý lần lượt.
Bạn đã tạo được một phụ:
Lưu ý: nếu bạn không đặt con trỏ vào sub VBA sẽ chạy các tab đang hiển thị.
Bạn sẽ thấy “some text” trong ô B1 ; 5,55 trong ô C3 đến E5 và Now hiển thị trong ô F1.
Hãy xem dòng mã trong phần trước
Chúng ta cũng có thể viết dòng này như thế này
Tuy nhiên bạn không cần sử dụng Value vì đây là thuộc tính mặc đinh. Chúng ta sử dụng các dòng mã như vậy để gán giá trị (ví dụ như sao chép) giữa các ô và các biến.
VBA đánh giá bên phải của dấu”=” và đặt kết quả vào biến /cell/ phạm vi nằm bên trái dầu bằng.
Phần mã bên trái dấu bằng
Trong mã này, Sheet 1 đề cập đến tên mã của trang tính. Chúng ta sử dụng tên mã để tham chiếu đến các trang tính trong workbook. Khi tham chiếu đến một trang tính thì ta có thể sử dụng thuộc tính Range (Phạm vi) của trang tính để giới hạn một ô hoặc nhiều ô.
Bằng cách này chúng ta có thể sao chép giá trị từ ô này sang ô khác.
Dưới đây là ví dụ:
Hoạt động 4
Chúng ta có thể dễ dàng sao chép giữa các ô trên các trang tính khác nhau. Nó cũng tương tự với sao chép các ô trên cùng một trang tính. Sự khác biệt duy nhất là tên trang tính sử dụng trong mã.
Trong hoạt động dưới đây sẽ hướng dẫn chúng ta thực hiện.
Hoạt động 5.
Tất cả hướng dẫn trên đây chúng ta sử dụng tên mặc định cho các trang tính như Sheet1 và Sheet 2. Để đặt tên khác chúng ta thay đổi tên mã của trang tính. Trong cửa sổ Project-VBAProject bạn sẽ thấy sheet1 cả bên trong và bên ngoài dấu ngoặc đơn.
Tên mã có các thuộc tính sau:
Lưu ý: chúng ta chỉ có thể sử dụng tên mã nếu trang tính nằm trong cũng workbook với mã.
Tên trang tính có các thuộc tính sau:
Chúng ta chỉ có thể thay đổi tên mã trong cửa sổ Property.
Chúng ta có thể thay đổi tên trang tính từ tab và cả cửa sổ Property.
Hoạt động 6:
Có một điều dễ nhận thấy đó là chúng ta cần sử dụng tên trang tính nhiều mỗi khi muốn tham chiếu phạm vi trong mã. Một cách đơn giản hơn là chúng ta sử dụng câu lệnh With.
Chúng ta chỉ cần đề cập tên trang tính một lần và VBA sẽ áp dụng cho bất kỳ phạm vi nào chúng ta sử dụng.
Trong VBA chúng ta lấy bất kỳ mục nào trước khi dừng mã và sử dụng câu lệnh With.
Cập nhật với câu lệnh With
Chúng ta sử dụng With để bắt đầu trong ví dụ trên. Bất cứ khi nào VBA dừng hoàn toàn nó sẽ sử dụng trang tính trước đó.
Chúng ta sử dụng lệnh With với các đối tượng trong VBA bao gồm workbook, range, biểu đồ…
Biểu thị kết thúc lệnh with bằng Endwith.
Bạn chú ý là các dòng dòng mã giữa ở giữa đều thụt sang phải. Điều này gọi là thụt lề mã.
Chúng ta luôn luôn thụt lề mã giữa các mục trong VBA như Sub, câu lệnh IF, with For loop…
Bạn có thể sắp xếp các dòng mã ở bên phải bằng cách chọn các dòng mã thích hợp và nhấn phím Tab. Nhấn Shift và Tab sẽ chuyển sang trái.
Hoạt động 7
Lời giải:
Bạn có thể sao chép các giá trị từ dải ô này sang dải ô khác
Điều cần lưu ý là chúng ta sử dụng thuộc tính Value của vùng dữ liệu nguồn. Nếu bỏ qua nó để trống vào vùng dữ liệu đích .
Đoạn mã trên là một cách rất hiệu quả để sao chép giá trị giữa các ô. Bạn không cần phải chọn, sao chép và dán một cách thủ công.
Khi thao tác nên nhớ vùng dữ liệu nguồn và dữ liệu đích phải có cùng kích thước.
Hoạt động 8:
Lời giải
Nếu bạn cần chuyển đổi từ hàng sang cột và ngược lại có thể sử dụng WorksheetFunction Transpose. Đặt các giá trị từ 1 đến 4 vào các ô A1 đến A4. Đoạn mã sau sẽ ghi các giá trị từ E1 đến H1
Đoạn mã sau sẽ đọc từ E1: H1 đến L1: L4
Chúng ta có thể chia một dòng trên nhiều dòng bằng cách sử dụng dấu gạch dưới (_), ví dụ:
Biến là một phần trong ngôn ngữ lập trình. Các biến giống như các ô nhỏ trong bộ nhớ. Chúng ta sử dụng để lưu các giá trị tạm thời trong khi mã đang chạy.
Chúng ta thực hiện với biến như sau:
Các kiểu biến chúng ta sử dụng cũng tương tự các kiểu dữ liệu chúng ta sử dụng trong Excel.
Bảng dưới đây cho thấy các biến phổ biến. . Trên thực tế, bạn có thể sẽ sử dụng Long và String cho 90% các biến của mình.
Type | Chi tiết |
Boolean | Chỉ có thể đúng hoặc sai |
Currency | Giống như số thập phân nhưng chỉ có 4 số thập phân |
Date | Sử dụng cho ngày/giờ |
Double | Sử dụng cho số thập phân |
Long | Sử dụng cho số nguyên |
String | Sử dụng cho văn bản |
Variant | VBA sẽ quyết định loại biến trong thời gian chạy |
VBA không bắt buộc khai báo biến tuy nhiên chúng ta nên thực hiện thao tác này để các thao tác sau sẽ dễ dàng hơn. Để “Require Variable Declaration” (yêu cầu khai báo biến) chúng ta thêm dòng sau vào module:
Để VBA tự động thêm dòng này, hãy chọn Tools-> Options từ menu và chọn Require Variable Declaration . Bất cứ khi nào bạn tạo một module mới, VBA sẽ thêm dòng này vào đầu.
Khai báo một biến rất đơn giản, chỉ cần sử dụng định dạng sau:
Bạn có thể tùy ý đặt tên biến. Dưới đây là ví dụ về khai báo:
Để đặt giá trị trong một biến, chúng ta sử dụng cùng kiểu câu lệnh có dấu bằng.
Hoạt động 9:
Lời giải:
VBA có một công cụ tiện lợi thực sự cho phép chúng tôi kiểm tra đầu ra Công cụ này là Immediate window. Bằng cách sử dụng Debug.Print, chúng ta có thể ghi các giá trị, văn bản và kết quả của các phép tính vào immediate window.
Để xem cửa sổ này, bạn có thể chọn View-> Immediate window từ menu hoặc nhấn Ctrl + G. Các giá trị sẽ được ghi ngay cả khi Immediate window không hiển thị.
Chúng ta có thể sử dụng Immediate window để viết ra các biến để kiểm tra các giá trị nó chứa. Nếu cập nhật mã từ hoạt động cuối cùng, chúng ta có thể ghi ra các giá trị của mỗi biến. Chạy mã bên dưới và kiểm tra kết quả trong Immediate window.
Chúng ta có thể ghi và đọc giá trị giữa ô và ô, ô và biến, biến và biến bằng cách sử dụng dòng gán .
Ví dụ:
Hoạt động 10:
VBA có thể chuyển đổi biến. Nếu chúng ta gán 99,55 cho biến Long thì VBA sẽ chuyển thành số nguyên. Ví dụ trong đoạn mã dưới đây sẽ làm tròn thành 100.
VBA có thể chuyển đổi khá nhiều số như sau:
Tuy nhiên, ngay cả VBA cũng có giới hạn của nó. Đoạn mã sau sẽ dẫn đến lỗi Loại không khớp vì VBA không thể chuyển đổi văn bản thành số
Mẹo: Các lỗi không khớp thường xảy ra do người dùng vô tình đặt văn bản vào một ô mà chứa dữ liệu số.
Hoạt động 11:
Chuỗi nội dung trong Power Query