Hướng dẫn active sheet vba - trang hoạt động vba
Khi lập trình trong VBA liên quan tới nhiều Worksheet trong 1 Workbook (1 file Excel), có thể bạn sẽ thấy có 2 phương thức khá giống nhau là Select và Activate. Nhưng sự giống nhau này đôi khi gây nhầm lẫn cho chúng ta. Trong bài viết này, Học Excel Online sẽ giúp các bạn phân biệt phương thức Select với Activate của đối tượng Worksheet trong VBA. Show
Cú pháp gọi phương thức của đối tượng WorksheetPhân biệt phương thức Select với Activate Trong bài viết Hướng dẫn cách viết code với đối tượng Worksheet trong VBA Excel chúng ta đã tìm hiểu về cú pháp gọi phương thức của đối tượng Worksheet như sau:.Select Worksheets(“ABC”).Select.Activate Worksheets(“ABC”).Activate
Phân biệt phương thức Select với ActivateTrong bài viết Hướng dẫn cách viết code với đối tượng Worksheet trong VBA Excel chúng ta đã tìm hiểu về cú pháp gọi phương thức của đối tượng Worksheet như sau: Worksheets(“ABC”).Select Worksheets(“ABC”).Activate Trong đó:
Select là việc bạn chọn tới 1 Sheet. Activate là việc bạn kích hoạt tới 1 sheet. Nếu chỉ làm việc với duy nhất 1 Sheet thì Sheet được chọn chính là Sheet được kích hoạt. Sự khác nhau cơ bản là: Bạn có thể chọn cùng 1 lúc nhiều Sheet, nhưng trong các Sheet đó chỉ có 1 Sheet được kích hoạt. Sheet được chọn đầu tiên trong thao tác chọn nhiều Sheet chính là Sheet được kích hoạt Khi đó đối tượng ActiveSheet sẽ khác với nhóm đối tượng Sheet được Select. Ví dụ: Trong 1 Workbook có 3 Sheet gồm: Sheet1, Sheet2, Sheet3 Chọn cùng 1 lúc Sheet2 và Sheet3, trong đó Sheet3 được viết trược, ta sử dụng cú pháp sau:
Khi viết trong cùng 1 Sub ta có: Khi chạy Sub Test_Select_MultiSheet, kết quả thu được là chỉ có duy nhất giá trị abc được điền vào ô A1 trong Sheet3, còn Sheet2 thì không có nội dung gì. File ví dụ các bạn có thể tải về tại đây: http://bit.ly/2TgwCt8
Sheet3 và Sheet2 cùng được chọn, nhưng Sheet3 viết trước nên Sheet3 là Sheet được Activate Khi đó ActiveSheet chính là Sheet3. Giá trị abc được gán vào ô A1 trong Sheet3 Do đó khi làm việc với nhiều Worksheet trong VBA, chúng ta hết sức lưu ý phân biệt giữa 2 phương thức này để đảm bảo kết quả lập trình đúng theo ý muốn. * Chú ý: Tác giả: duongquan211287· · · · · Bài viết dưới đây, Học Excel Online hướng dẫn đầy đủ cách sử dụng Excel worksheet VBA. Nếu muốn biết cách thực hiện nhanh chóng thì có thể xem bảng hướng dẫn tóm gọn dưới đây. Học Excel Online hướng dẫn đầy đủ cách sử dụng Excel worksheet VBA. Nếu muốn biết cách thực hiện nhanh chóng thì có thể xem bảng hướng dẫn tóm gọn dưới đây.
Hướng dẫn nhanh về worksheet VBAGiới thiệu
Giới thiệuBa yếu tố quan trọng nhất của VBA là workbook, worksheet và cells. Trong tất cả các mã chúng ta viết, 90% sẽ liên quan đến 1 hoặc cả 3 yếu tố trên. Sử dụng worksheet để truy cập vào các ô của nó rất phổ biến trong VBA. Chúng ta có thể sử dụng để ẩn, thêm, di chuyển hoặc sao chép worksheet khác. Tuy nhiên chúng ta sẽ sử dụng chủ yếu để thực hiện các hành động trên một hoặc nhiều ô. Sử dụng worksheet đơn giản hơn workbook. Với workbook bạn phải mở chúng sau đó tìm thư mục nằm trong đó và kiểm tra xem có đang được sử dụng hay không. Với worksheet, nó có hiển thị trong workbook hay không. Truy cập worksheetTrong VBA, mỗi workbook sẽ có tập hợp nhiều worksheet. Mỗi worksheet trong workbook sẽ có mục để nhập vào một bộ sưu tập, bộ sưu tập được gọi là worksheets và hiểu đơn giản là nó chứa các worksheet trong workbook. Bạn phải đặt tên thì mới có thể truy cập vào worksheet. Đoạn mã dưới đây viết “Hello World” trong Ô A1 của Sheet1, Sheet2 và Sheet3 của workbook hiện tại: 1-Truy cập worksheetBộ sưu tập worksheets luôn luôn nằm trong workbook. Nếu chúng ta không chỉ định workbook thì workbook được sử dụng theo mặc định. 2-Truy cập worksheetẨn worksheetCác ví dụ sau đây cho thấy cách ẩn và cách hiện một worksheet: 3-Ẩn worksheetNếu bạn không muốn người dùng truy cập vào worksheet thì có thể đặt ở chế độ “hide” (ẩn). Có nghĩa nó chỉ có thể được hiển thị bằng mã. 4-Ẩn worksheetBảo vệ WorksheetMột ví dụ khác nếu bạn muốn bảo vệ Worksheet: 5-bảo mật wooksheetSubscript nằm ngoài phạm viKhi bạn sử dụng worksheet có thể gặp lỗi. Điều này có nghĩa bạn đang cố gắng truy cập một worksheet không tồn tại. Lý do có thể:
Nếu gặp sự cố này hãy sử dụng Loop Through the worksheets để hiển thị tên của tất cả các worksheet trong bộ sưu tập. Sử dụng Index (chỉ mục) để truy cập worksheetNgoài cách sử dụng tên để truy cập worksheet thì có thể sử dụng Index. Index đề cập đến vị trí tab worksheet trong workbook. Ví dụ đoạn mã sau đây: 6- sử dụng index để cấp quyền wooksheetTrong ví dụ trên sử dụng Debug.Print để xuất ra Immediate window. Để xem cửa sổ này chọn View→ Immediate window (hoặc ctrl + G). Sử dụng code name của worksheetPhương pháp tốt nhất để truy cập worksheet là sử dụng code name (tên mã). Thay đổi tên worksheet không làm thay đổi code name có nghĩa là vẫn có thể tham chiếu worksheet theo tên mã. Trong hình ảnh, bạn có thể thấy rằng code name là tên ngoài ngoặc và tên worksheet nằm trong ngoặc. Bạn có thể thay đổi cả tên worksheet và code name trong cửa sổ thuộc tính của worksheet (xem hình ảnh bên dưới). 8-code-name-properties1Nếu mã của bạn tham chiếu đến code name thì người dùng có thể thay đổi tên của worksheet và nó sẽ không ảnh hưởng đến mã của bạn. Trong ví dụ dưới đây, chúng tôi tham chiếu trực tiếp worksheet bằng cách sử dụng code name. 9-code-nameĐiều này làm cho mã dễ đọc và an toan toàn ngay cả thay đổi tên workbook. Code name trong các workbook khácCó một nhược điểm khi sử dụng code name là nó chỉ tham chiếu đến các worksheet trong workbook mà chứa mã như Thisworkbook. Tuy nhiên chúng ta có thể sử dụng một hàm đơn giản để tìm code name của một worksheet trong workbook khác. Ví dụ trên có nghĩa khi người dùng thay đổi code name của worksheet thì mã cũng không bị ảnh hưởng. Ngoài ra chúng ta có thể sử dụng VBAProject của workbook để làm điều tương tự. Ví dụ: 11-code-nameTóm tắt code name 1.Code name của worksheet có thể được sử dụng trực tiếp trong mã, ví dụ: Sheet1.Range.Sheet1.Range.
Sử dụng ActivesheetĐối tượng Activesheet ám chỉ worksheet đang hoạt động. Sử dụng Activesheet nếu xác định chắc chắn bạn muốn sử dụng worksheet đang hoạt động hiện tại. Nếu không phải thì xác định worksheet mà bạn muốn sử dụng. 12-activeNếu muốn sử dụng phương pháp Range mà không đề cập đến worksheet thì activesheet sẽ mặc định. Khai báo đối tượng worksheetKhai báo đối tượng worksheet rất hữu ích giúp mã của bạn gọn gàng và dễ đọc hơn. Ví dụ dưới đây sẽ hiển thị mã cập nhật các vùng dữ liệu. Sub đầu tiên không khai báo đối tượng worksheet, các sub còn lại khai báo đối tượng worksheet nên mã nhìn rõ ràng hơn. 14-object Chúng ta cũng có thể sử dụng lệnh With với đối tượng worksheet. Truy cập worksheet trong NutshellĐể không gặp rắc rối trong việc truy cập worksheet, phần này sẽ tóm gọn một cách dễ hiểu. 1.Nếu muốn sử dụng bất kỳ worksheet nào hiện đang hoạt động thì sử dụng Activesheet. ActiveSheet.Range("A1") = 55
Sheet1.Range("A1") = 55 3.Nếu worksheet nằm trong một workbook làm việc khác thì đầu tiên mở workbook và sau đó truy cập worksheet. ' Get workbook Dim wk As Workbook Set wk = Workbooks.Open("C:\Docs\Accounts.xlsx", ReadOnly:=True) ' Then get worksheet Dim sh As Worksheet Set sh = wk.Worksheets("Sheet1") Nếu muốn tránh người dùng thay đổi code name của worksheet thì sử dụng chức năng SheetFromCodename từ code name. ' Get workbook Dim wk As Workbook Set wk = Workbooks.Open("C:\Docs\Accounts.xlsx", ReadOnly:=True) ' Then get worksheet Dim sh As Worksheet Set sh = SheetFromCodeName("sheetcodename",wk) Thêm worksheetCác ví dụ dưới đây sẽ hướng dẫn cách thêm một worksheet mới vào workbook . Nếu không cung cấp bất kỳ đối số nào cho hàm Add thì worksheet mới sẽ được đặt trước activesheet. Khi thêm một worksheet nó sẽ được tạo với tên mặc định như “ Worksheet4”. Nếu bạn muốn thay đổi tên thì thực hiện bằng cách sử dụng thuộc tính Name. Ví dụ sau thêm một worksheet mới và đổi tên thành “Accounts”. Nếu một worksheet có tên “Accounts” đã tồn tại thì sẽ xuất hiện lỗi. Public Sub AddSheet() Dim sht As Worksheet ' Adds new sheet before active sheet Set sht = ThisWorkbook.Worksheets.Add ' Set the name of sheet sht.Name = "Accounts" ' Adds 3 new sheets before active sheet ThisWorkbook.Worksheets.Add Count:=3 End Sub Trong ví dụ trước, chúng ta thêm worksheet liên quan đến worksheet đang hoạt động (activesheet) . Chúng ta cũng có thể chỉ định vị trí đặt worksheet mới . Để làm điều này bạn chỉ định worksheet nào chèn trước, worksheet nào chèn sau, ví dụ: Public Sub AddSheetFirstLast() Dim shtNew As Worksheet Dim shtFirst As Worksheet, shtLast As Worksheet With ThisWorkbook Set shtFirst = .Worksheets(1) Set shtLast = .Worksheets(.Worksheets.Count) ' Adds new sheet to first position in the workbook Set shtNew = Worksheets.Add(Before:=shtFirst) shtNew.Name = "FirstSheet" ' Adds new sheet to last position in the workbook Set shtNew = Worksheets.Add(After:=shtLast) shtNew.Name = "LastSheet" End With Xóa worksheetĐể xóa một worksheet chỉ cần sử dụng lệnh gọi Delete Dim sh As Worksheet Set sh = ThisWorkbook.Worksheets("Sheet12") sh.Delete Excel sẽ hiển thị thông báo cảnh báo khi bạn xóa worksheet. Nếu muốn ẩn thông báo sử dụng mã bên dưới: Application.DisplayAlerts = False sh.Delete Application.DisplayAlerts = True Có hai vấn đề chú ý khi xóa worksheet. Nếu bạn cố gắng truy cập worksheet sau khi xóa sẽ xuất hiện lỗi “Subscript out of Range” mà chúng ta đã thấy trong phần trên. Dim sh As Worksheet Set sh = ThisWorkbook.Worksheets("Sheet2") sh.Delete ' Dòng này sẽ phát sinh lỗi "Subscript out of Range" vì "Sheet2" không tồn tại Set sh = ThisWorkbook.Worksheets("Sheet2") Vấn đề thứ 2 là khi bán một biến cho đối tượng worksheet, nếu cố gắng sử dụng biến này sau khi worksheet bị xóa thì sẽ gặp lỗi Automation. Run-Time error -21147221080 (800401a8′) Automation Error Nếu sử dụng code name thay cho tên của worksheet thì điều này sẽ khiến excel gặp sự cố chứ không phải lỗi Automation. Ví dụ: sh.Delete ' Dòng này sẽ ra lỗi Automation error Debug.Assert sh.Name Nếu bạn gán biến cho worksheet thì sẽ hoạt động ổn hơn: Sheet1.Range("A1") = 55 3.Nếu worksheet nằm trong một workbook làm việc khác thì đầu tiên mở workbook và sau đó truy cập worksheet.0 Lặp qua các worksheetWorkbook bao gồm các worksheet, chúng ta có thể xem từng worksheet trong bộ sưu tập worksheets bằng cách sử dụng For each Loop hoặc For Loop. Ví dụ sau đây sử dụng For Loop: Sheet1.Range("A1") = 55 3.Nếu worksheet nằm trong một workbook làm việc khác thì đầu tiên mở workbook và sau đó truy cập worksheet.1 Ví dụ tiếp theo sử dụng For Loop: Sheet1.Range("A1") = 55 3.Nếu worksheet nằm trong một workbook làm việc khác thì đầu tiên mở workbook và sau đó truy cập worksheet.2 Đây là cách truy cập tất cả các workbook đang mở và truy cập tất cả các worksheet trong Thisworkbook. Tiếp theo truy cập tất cả các worksheet trong tất cả các workbook đang mở. Lưu ý: nếu sử dụng mã này để ghi vào worksheet thì lưu mọi thứ trước vì có thể dữ liệu không chính xác có thể ghi vào worksheet. Sheet1.Range("A1") = 55 3.Nếu worksheet nằm trong một workbook làm việc khác thì đầu tiên mở workbook và sau đó truy cập worksheet.3 Sử dụng bộ sưu tập SheetsWorkbook có một bộ sưu tập khác tương tự như worksheets gọi là sheets. Điều này đôi khi gây ra sự nhầm lẫn cho người dùng. Để phân biệt trước tiên cần biết về một sheet biểu đồ như sau: 1.Tạo biểu đồ trên bất kỳ sheet nào.
Có hai ví dụ mã bên dưới. Đầu tiên đi qua tất cả các sheets trong workbook, xuất tên và loại của sheet. Ví dụ thứ hai làm tương tự với bộ sưu tập Worksheets. Để thử ví dụ cần thêm sheet biểu đồ vào workbook để thấy sự khác biệt : Sheet1.Range("A1") = 55 3.Nếu worksheet nằm trong một workbook làm việc khác thì đầu tiên mở workbook và sau đó truy cập worksheet.3 Nếu không có sheet biểu đồ thì việc sử dụng bộ sưu tập sheets cũng giống như sử dụng bộ sưu tập worksheets.worksheets. |