Renier có một sổ làm việc có mười trang tính trong đó, được đặt tên là Tài nguyên 1 đến Tài nguyên 10. Nếu anh ta xóa một trong những trang tính này (giả sử Tài nguyên 3), Renier muốn các trang tính còn lại được đổi tên, tự động, để “thu hẹp khoảng cách , “có thể nói. Do đó, Tài nguyên 4 đến Tài nguyên 10 sẽ tự động đổi tên thành Tài nguyên 3 đến Tài nguyên 9.

Có một số cách mà bạn có thể thực hiện nhiệm vụ này, tất cả đều thông qua việc sử dụng macro. Một cách tiếp cận có lẽ ít tự động hơn những gì Renier muốn, nhưng nó hoạt động rất tốt:

Sub ReNameSheets()

Dim J As Integer     Dim wks As Worksheet

J = 0     For Each wks In ActiveWorkbook.Worksheets         J = J + 1         wks.Name = "TempSheet " & J     Next wks

J = 0     For Each wks In ActiveWorkbook.Worksheets         J = J + 1         wks.Name = "Resources " & J     Next wks End Sub

Macro này chỉ cần bước qua tất cả các trang tính, đổi tên chúng bằng cách sử dụng quy ước mà Renier ưa thích. Macro có thể được chạy theo yêu cầu, bất cứ lúc nào bạn muốn đổi tên trang tính.

Lưu ý rằng mã thực sự thực hiện hai cách đặt tên đi qua các trang tính. Cách đầu tiên là đặt tên của các trang tính thành tên tạm thời và cách thứ hai là đặt chúng thành tên cuối cùng. Hai lần vượt qua giúp tránh sự cố tiềm ẩn khi bạn thêm trang tính vào sổ làm việc — ví dụ: nếu bạn thêm một trang tính mới ngay trước Tài nguyên 4, thì việc đổi tên một lần sẽ cố gắng đổi tên trang tính mới thành Tài nguyên 4, điều này sẽ tạo ra lỗi vì worksheet 5, tại thời điểm đó, cũng được đặt tên là Resources 4. Bằng cách thực hiện hai lần, bạn đổi tên mọi thứ thành một thứ hoàn toàn mới và sau đó thực hiện thiết lập tên cuối cùng.

Để có cách tiếp cận tự động hơn, bạn có thể muốn xem xét sử dụng sự kiện SheetBeforeDelete cho đối tượng Workbook. Sự kiện này được kích hoạt (như tên gọi của nó) ngay trước khi trang tính bị xóa. Đây là ví dụ về phương pháp xử lý sự kiện:

Private Sub Workbook_SheetBeforeDelete(ByVal Sh As Object)

Dim sPrefix As String     Dim iNum1 As Integer     Dim iNum2 As Integer     Dim wks As Worksheet

sPrefix = "Resources "

If Left(Sh.Name, Len(sPrefix)) = sPrefix Then         iNum1 = CInt(Right(Sh.Name, Len(Sh.Name) - Len(sPrefix)))

Sh.Name = "TempSheet 9999"

For Each wks In Sheets             If Left(wks.Name, Len(sPrefix)) = sPrefix Then                 iNum2 = CInt(Right(wks.Name, Len(wks.Name) - Len(Prefix)))

If iNum2 > iNum1 Then                     wks.Name = sPrefix & (iNum2 - 1)

End If             End If         Next     End If End Sub

Trình xử lý sự kiện kiểm tra xem trang tính bị xóa có bắt đầu bằng tiền tố được chỉ định (“Tài nguyên”) hay không. Nếu có, thì nó sẽ đổi tên trang tính đang bị xóa thành tên tạm thời (“TempSheet 9999”).

Sau đó, nó bước qua từng trang tính trong sổ làm việc và đổi tên bất kỳ trang tính nào có tiền tố thích hợp và số hậu tố cao hơn trang tính đang bị xóa.

Có hai lưu ý lớn với cách tiếp cận này. Đầu tiên, nó sẽ không xử lý nếu bạn thêm trang tính. Thứ hai, nó sẽ chỉ xử lý một cách đáng tin cậy việc xóa các trang tính đơn lẻ. Nếu bạn xóa nhiều trang tính cùng một lúc, việc đánh số sẽ không chính xác và trên thực tế, macro có thể bị hỏng do cách Excel xử lý việc xóa.

Nếu bạn dự đoán xóa nhiều trang tính khá thường xuyên, thì bạn có thể tránh vấn đề bằng cách sử dụng một cách tiếp cận khác. Điều này dựa trên việc sử dụng các sự kiện SheetActivate và SheetDeactivate của đối tượng Workbook.

' These variables are declared OUTSIDE of the events, ' so they are available globally.



Dim shName As String     Dim Avail As Variant

Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)

' When the worksheet is deactivated, the name of     ' that worksheet is stored in the shName variable.



shName = Sh.Name End Sub
Private Sub Workbook_SheetActivate(ByVal Sh As Object)

Dim wks As Worksheet     Dim J As Integer

On Error Resume Next     ' The following line will generate an error if the     ' the worksheet shName was deleted. If the error     ' occurrs, then we can trigger the renaming.

Avail = Sheets(shName).Range("A1")

If Err Then         J = 0         For Each wks In ActiveWorkbook.Worksheets             J = J + 1             wks.Name = "Resources " & J         Next wks     End If     On Error GoTo 0 End Sub

Các trình xử lý sự kiện này hoạt động vì sự kiện SheetDeactivate được tự động kích hoạt bất cứ khi nào trang tính còn lại (ví dụ: khi bạn kích hoạt một trang tính khác) hoặc bất cứ khi nào một trang tính bị xóa. Sau đó, sự kiện SheetActivate được kích hoạt và về cơ bản, nó sẽ kiểm tra xem có thể truy cập được sheet đã hủy kích hoạt trước đó hay không. Nếu không thể truy cập được, thì chúng tôi biết nó đã bị xóa và chúng tôi có thể kích hoạt đổi tên tất cả các trang tính.

Phương pháp bạn sử dụng để đổi tên hoàn toàn tùy thuộc vào bạn dựa trên việc xác định cách bạn muốn làm việc với các trang tính của mình.

_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 (13572) áp dụng cho Microsoft Excel 2007, 2010, 2013, 2016, 2019 và Excel trong Office 365.