Renierには、Resources1からResources10という名前の10個のワークシートが含まれるワークブックがあります。これらのワークシートの1つ(たとえば、Resources 3)を削除すると、残りのワークシートの名前が自動的に変更され、「ギャップが埋められます。 、” いわば。したがって、リソース4からリソース10は自動的に名前が変更され、リソース3からリソース9になります。

このタスクを実行するには、すべてマクロを使用する方法がいくつかあります。 1つのアプローチは、おそらくRenierが好むものよりも自動化されていませんが、うまく機能します:

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

このマクロは、すべてのワークシートをステップスルーし、Renierが好んだ規則を使用して名前を変更します。ワークシートの名前を変更したいときはいつでも、マクロをオンデマンドで実行できます。

コードは実際にはワークシートを介して2つの命名パスを作成することに注意してください。 1つ目は、ワークシートの名前を一時的な名前に設定することであり、2つ目は、ワークシートを最終的な名前に設定することです。 2つのパスは、ワークシートをブックに追加するときに発生する可能性のある問題を回避するのに役立ちます。たとえば、リソース4の直前に新しいワークシートを追加した場合、シングルパスの名前変更では、新しいワークシートの名前をリソース4に変更しようとします。ワークシート5は、その時点でリソース4とも呼ばれるため、エラーが発生します。2つのパスを実行することにより、すべての名前をまったく新しいものに変更してから、最終的な名前の設定を行います。

より自動化されたアプローチとして、WorkbookオブジェクトにSheetBeforeDeleteイベントを使用することを検討することをお勧めします。このイベントは、ワークシートが削除される直前に(その名前が示すように)トリガーされます。イベントハンドラーアプローチの例を次に示します。

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

イベントハンドラは、削除されるワークシートが指定されたプレフィックス( “リソース”)で始まるかどうかを確認します。含まれている場合は、削除するワークシートの名前を一時的な名前( “TempSheet 9999″)に変更します。

次に、ワークブック内の各ワークシートをステップスルーし、適切なプレフィックスと削除されるワークシートよりも大きいサフィックス番号を持つワークシートの名前を変更します。

このアプローチには2つの大きな注意点があります。まず、ワークシートを追加すると処理されません。次に、単一のワークシートの削除のみを確実に処理します。一度に複数のワークシートを削除すると、番号が正しくなくなり、実際、Excelが削除を処理する方法が原因で、マクロがクラッシュする可能性があります。

複数のワークシートを頻繁に削除することが予想される場合は、別のアプローチを使用して問題を回避できます。これは、WorkbookオブジェクトのSheetActivateイベントとSheetDeactivateイベントの使用に依存しています。

' 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

SheetDeactivateイベントは、ワークシートが残されたとき(たとえば、別のワークシートをアクティブ化したとき)またはワークシートが削除されたときに自動的にトリガーされるため、これらのイベントハンドラーは機能します。次に、SheetActivateイベントがトリガーされ、基本的に、以前に非アクティブ化されたシートに到達できるかどうかを確認します。到達できない場合は、削除されたことがわかり、すべてのワークシートの名前変更をトリガーできます。

名前の変更に使用するアプローチは、ワークシートをどのように操作するかを決定することに基づいて、完全にあなた次第です。

注:

このページ(または_ExcelTips_サイトの他のページ)で説明されているマクロの使用方法を知りたい場合は、役立つ情報を含む特別なページを用意しました。

_ExcelTips_は、費用効果の高いMicrosoftExcelトレーニングのソースです。

このヒント(13572)は、Microsoft Excel 2007、2010、2013、2016、2019、およびOffice365のExcelに適用されます。