HƯỚNG DẪN VBA CƠ BẢN CHO NGƯỜI MỚI BẮT ĐẦU

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.

Các thuật ngữ cơ bản sử dụng trong bài viết 

  • Macro Excel: chuỗi các lệnh mà bạn có thể sử dụng để tự động hóa các tác vụ. 
  • VBA: là ngôn ngữ lập trình sử dụng để tạo macro. Đây là viết tắt của Visual Basic for Application. 
  • Line of code (dòng mã): Đây là các lệnh trong VBA.
  • SUB: một sub được tạo thành từ nhiều line of code (dòng mã). Khi sub chạy VBA sẽ đi qua các dòng mã và thực hiện các thao tác thích hợp. Macro và Sub về cơ bản giống nhau.
  • Module: module chỉ đơn giản là vùng chứa các Sub. Các sub chứa dòng mã. Không có giới hạn về số lượng đối với module trong workbook hoặc số lượng sub trong một module.
  • VBA Editor: Đây là vị trí viết mã. Nhấn Alt+F11 sẽ chuyển đổi giữa Excel và Visual Basic Editor. Nếu Visual Basic không thì nhấn Alt+F11 sẽ tự động mở.

Ả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:

Thủ thuật khi hoạt động VBA

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.

Tạo module

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.

Hoạt động 1:

  1. Mở một workbook làm việc mới trong Excel.
  2. Mở Visual Basic(Alt+F11).
  3. Chuyển đến cửa sổ Project – VBAProject ở bên trái (hoặc nhấn Ctrl+R).
  4. Bấm chuột phải vào workbook và bấm Insert, sau đó nhấp vào Module.
  5. Nhấp vào Module 1 trong cửa sổ Project- VBAProject.
  6. Trong cửa sổ Property ở dưới cùng bên trái (F4 nếu không hiển thị) thay đổi tên module1 thành Myfirstmodule.

Kết thúc hoạt động 1

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.

Hoạt động 2

  1. Mở workbook mới và tạo một module giống hệt như đã làm trong hoạt động trước.
  2. Bấm đúp vào module mới trong cửa sổ Project-VBAProject.
  3. Cửa sổ mã cho module này mở ra. Bạn thấy tên thanh tiêu đề của Visual Basic.

Kết thúc hoạt động 2

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.

Cách 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.

Hoạt động 3

  1. Tạo module như hướng dẫn đầu tiên.
  2. Chọn module mở cửa sổ Project-VBAproject nhấp vào module cần chọn. Đảm bảo tên hiển thị trên thanh tiêu đề.
  3. Nhập dòng sau vào cửa sổ mã và nhấn Enter.
  1. VBA sẽ tự động thêm dòng thứ 2 End Sub. Chúng ta đặt mã giữa hai dòn g này.
  2. Giữa 2 dòng này nhập dòng

Bạn đã tạo được một phụ:

  1. Nhấp vào sub để đảm bảo con trỏ được đặt ở đó. Chọn RunRun Sub/UserForm từ menu  (hoặc nhấn F5).

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ị.

  1. Mở Excel (Alt+F11). Bạn sẽ thấy giá trị 5 trong ô A1.
  2. Thêm từng dòng dưới đây vào sub, chạy sub và kiểm tra kết quả.

Bạn sẽ thấy “some text” trong ô B1 ; 5,55 trong ô C3 đến E5 và Now hiển thị trong ô F1.

Kết thúc hoạt động 3.

Điền giá trị vào ô

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

  1. Tạo một workbook mới.
  2. Thêm các giá trị vào các ô trong Sheet1 bằng cách thủ công như sau: 20 với C1 và 80 với C2.
  3. Tạo một sub mới có tên là Act4.
  4. Viết mã để đặt giá trị từ C1 vào A1.
  5. Viết mã để đặt kết quả của C2+50 vào ô A2.
  6. Viết mã để nhân các giá trị trong ô C1 vào C2. Đặt kết quả vào ô A3.
  7. Chạy mã. Các ô phải có giá trị A1 20. A2 130 và A3 là 1600.

Các ô trong các trang tính khác nhau

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.

  1. Thêm một trang tính mới vào workbook làm việc. Bây giờ có 2 trang tính là sheet1 và sheet 2.
  2. Tạo một sub mới có tên là Act5.
  3. Thêm mã để sao chép giá trị từ C1 trên Sheet1 sang ô A1 trên Sheet2 .
  4. Thêm mã để đặt kết quả từ C1 + C2 trên Sheet1 đến ô A2 trên Sheet2 .
  5. Thêm mã để đặt kết quả từ C1 * C2 trên Sheet1 đến ô A3 trên Sheet2 .
  6. Chạy mã trong sub (F5). Các ô trên Sheet2 phải có các giá trị như sau: A1 20 , A2 100 và A3 1600

Tên mã của trang tính

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.

  • Sheet1 bên trái là tên mã của trang tính.
  • Sheet1 bên phải (trong ngoặc đơn) là tên trang tính. Đây là tên bạn thấy trên tab trong Excel.

Tên mã có các thuộc tính sau:

  1. Có thể sử dụng nó tham chiếu trực tiếp trang tính như đã làm. Ví dụ:

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ã.

  1. Nếu tên trang tính thay đổi mã sẽ vẫn hoạt động nếu chúng ta sử dụng tên mã để tham chiếu đến trang tính.

Tên trang tính có các thuộc tính sau:

  1. Để tham chiếu trang tính bằng cách sử dụng tên trang tính, chúng ta cần sử dụng cả workbook ví dụ như sau
  1. Nếu tên trang tính thay đổi chúng ta phải thay đổi tên trong mã của mình. Ví dụ: nếu thay đổi tên sheet1 thành Data thì cgungs ta cần thay 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: 

  1. Mở một workbook làm việc mới và tới Visual Basic.
  2. Nhấp vào Sheet1 trong Cửa sổ Project – VBAProject (Ctrl + R nếu không hiển thị).
  3. Chuyển đến cửa sổ Thuộc tính (F4 nếu không hiển thị).
  4. Thay đổi tên mã của trang tính thành shReport .
  5. Tạo một module mới đặt tên modAct6. .
  6. Thêm sub sau và chạy (F5)
  1. Sau đó thêm sub và chạy
  2. Ô A1 bây giờ phải có giá trị 66 và ô B2 phải có giá trị 55 .
  3. Thay đổi tên của trang tính trong Excel thành report  bằng cách nhấp chuột phải vào tab trang tính và đổi tên.
  4. Xóa nội dung của các ô và chạy lại mã UseCodename. Mã sẽ vẫn chạy chính xác.
  5. Chạy lại sub UseWorksheetname . Bạn sẽ gặp lỗi “Subscript out of Range”  có nghĩa là không có trang tính nào được gọi là Sheet1 trong bộ sưu tập trang tính.
  6. Thay đổi mã như sau và chạy lại. Bây giờ mã sẽ chạy chính xác.

Lệnh With

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. 

Thụt lề với các dòng mã

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

  1. Viết lại đoạn mã sau bằng câu lệnh With

Lời giải:

Sao chép giá trị giữa nhiều ô

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.

  • Nếu vùng dữ liệu đích nhỏ thì chỉ ô trong phạm bị mới được lấp đầy. Điều này khác với Copy/Paste ở chỗ chúng ta chỉ cần chỉ định ô đầu tiên và Excel sẽ điền các ô còn lại.
  • Nếu vùng dữ liệu đích lớn hơn thì các ô bị dư sẽ hiển thị #N.A.

Hoạt động 8:

  1. Tạo một workbook.
  2. Thêm một trang tính mới vào workbook bao gồm sheet 1 và sheet 2.
  3. Thêm dữ liệu sau vào vùng dữ liệu C2:E4 trên sheet1.
  1. Viết mã để sao chép dữ liệu từ Sheet1 sang phạm vi B3: D5 trên Sheet2.
  2. Chạy mã (F5).
  3. Xóa kết quả và sau đó thay đổi phạm vi đích nhỏ hơn phạm vi nguồn. Chạy lại và kiểm tra kết quả.
  4. Xóa kết quả và sau đó thay đổi phạm vi đích lớn hơn phạm vi nguồn. Chạy lại và kiểm tra kết quả.

Lời giải

Chuyển đổi vùng dữ liệu ô

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ụ:

Cách sử dụng các biến

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:

  1. Khai báo (tức là tạo biến).
  2. Lưu trữ một giá trị trong biến.
  3. Đọc một giá trị lưu trữ trong biến.

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

Khai báo các biến

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:

  1. Tạo một sub mới và đặt tên là usingVariables .
  2. Khai báo một biến để lưu số đếm và đặt giá trị là 5 .
  3. Khai báo một biến để lưu giá vé (price) và đặt giá trị là 99,99 .
  4. Khai báo một biến để lưu trữ một quốc gia và đặt giá trị thành “Spain” .
  5. Khai báo một biến để lưu trữ ngày kết thúc và đặt giá trị là ngày 21st March 2020.
  6. Khai báo một biến để lưu trữ nếu một cái gì đó được hoàn thành. Đặt giá trị thành Wrong.

Lời giải:

Immediate Window

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.

Điền vào giữa các biến và ô

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:

  1. Tạo một workbook trống với có hai trang tính: Sheet1 và Sheet2.
  2. Đặt văn bản “New York” vào ô A1 trên sheet1. Đặt số 49 vào ô C1 trên Sheet2.
  3. Tạo sub đọc các giá trị thành các biến từ các ô này.
  4. Thêm mã để ghi các giá trị vào Immediate window.

Lỗi không khớp (Type Mismatch)

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:

  1. Khai báo kiểu biến Double gọi là Amount.
  2. Gán một giá trị gây ra lỗi Loại Không khớp (Mismatch type).
  3. Chạy mã và đảm bảo lỗi xảy ra.

Chuỗi nội dung trong Power Query

  1. Giới thiệu
  2. Nhập dữ liệu
  3. Làm mới dữ liệu Power Query
  4. Sự quan trọng của Power Queeery khi đi làm

Tác giả: dtnguyen (Nguyễn Đức Thanh)

· · ·

Khóa học mới xuất bản