Lawrence cần một cách để xác định số lượng của một trang tính ngay cả khi trang tính đó đã được đổi tên. Ví dụ, nếu một trang tính được đặt tên là Sheet11 thì rất dễ dàng để biết rằng đó là trang 11. Nếu anh ta đổi tên trang tính thành January, Lawrence vẫn cần một cách để biết đây là trang 11.

Giải pháp cho vấn đề này được thực hiện tốt nhất với một chức năng do người dùng xác định (một macro). Trên thực tế, có hai con số mà macro có thể trả về cho mỗi trang tính. Đầu tiên là số chỉ mục cho trang tính. Số này đại diện cho chỉ số của đối tượng Trang tính của trang tính trong bộ sưu tập Trang tính. Giá trị này có thể được trả về bằng một macro tương tự như sau:

Function SheetNumber1(shtname As String)

Dim sht As Worksheet

Application.Volatile     For Each sht In ThisWorkbook.Worksheets          If LCase(sht.Name) = LCase(shtname) Then               SheetNumber1 = sht.Index               Exit Function          End If     Next     SheetNumber1 = -1 End Function

Hàm này, khi được sử dụng trong trang tính, sẽ trả về số chỉ mục của bất kỳ trang tính nào có tên được chuyển cho hàm. Nếu tên được chuyển cho hàm không tồn tại trong bộ sưu tập trang tính, thì giá trị -1 sẽ được hàm trả về. Ví dụ: phần sau được sử dụng trong một ô sẽ trả về giá trị chỉ mục cho trang tính có tên “January” trong bộ sưu tập:

=SheetNumber("January")

Vấn đề với cách tiếp cận này là thứ tự của các đối tượng Trang tính trong bộ sưu tập Trang tính có thể thay đổi theo thời gian. Do đó, bạn không thể luôn luôn cho rằng trang thứ mười một trong bộ sưu tập là trang tính ban đầu là Trang11.

Một cách nhất quán hơn để tìm ra tên ban đầu cho trang tính (bất kể nó được đổi tên như thế nào) là sử dụng những gì Visual Basic đề cập đến là “CodeName” của trang tính. Đây là một thuộc tính của trang tính và có thể được xác định theo cách sau:

Function SheetNumber2(shtname As String)

Dim sht As Worksheet     Dim sTemp As String

Application.Volatile     For Each sht In ThisWorkbook.Worksheets          If LCase(sht.Name) = LCase(shtname) Then               sTemp = sht.CodeName               SheetNumber2 = Val(Mid(sTemp, 6, 4))

Exit Function          End If     Next     SheetNumber2 = -1 End Function

Thuộc tính CodeName là chỉ đọc trong macro. Nó được chỉ định tại thời điểm trang tính được tạo, nhưng nó có thể được thay đổi theo cách thủ công trong trình soạn thảo Visual Basic. CodeName luôn là một chuỗi, đại diện cho tên đầu tiên được áp dụng cho trang tính, vì vậy nó sẽ giống như “Sheet11”. Sau khi CodeName được đặt, ngay cả khi trang tính được đổi tên (chẳng hạn như thành “January”), nó sẽ vẫn ổn định (“Sheet11”).

Trong ví dụ macro (SheetNumber2) thuộc tính CodeName được gán cho biến sTemp. Điều này, hầu hết thời gian, sẽ là một cái gì đó giống như “Sheet3” hoặc “Sheet11”. Vì vậy, macro sau đó lấy giá trị số của bất kỳ thứ gì bắt đầu bằng ký tự thứ sáu (ngay sau “Trang tính”). Đây là giá trị được trả về bởi hàm.

_Lưu ý: _

Nếu bạn muốn biết cách sử dụng các macro được mô tả trên trang này (hoặc trên bất kỳ trang nào khác trên trang ExcelTips), tôi đã chuẩn bị một trang đặc biệt bao gồm thông tin hữu ích.

ExcelTips là nguồn của bạn để đào tạo Microsoft Excel hiệu quả về chi phí.

Mẹo này (3398) áp dụng cho Microsoft Excel 97, 2000, 2002 và 2003. Bạn có thể tìm thấy phiên bản của mẹo này cho giao diện ribbon của Excel (Excel 2007 trở lên) tại đây: