• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:エクセルのシート名変更で重複した時のvbaの処理)

エクセルのシート名変更で重複した時のvbaの処理

このQ&Aのポイント
  • エクセルのVBAを使用してシート名を変更する方法について質問です。セルA1の値を新しいシート名として使用し、名前が既に存在する場合は末尾に(2)を付けたいですが、処理方法がわかりません。
  • VBAを使用してエクセルのシート名を変更する方法について質問です。セルA1の値を新しいシート名として使用し、名前が既に存在する場合は末尾に(2)を付けたいですが、具体的な処理方法がわかりません。
  • エクセルのVBAを使用してシート名を変更する方法について教えてください。セルA1の値を新しいシート名として使用し、重複がある場合は末尾に(2)をつけたいですが、具体的な処理方法がわかりません。

質問者が選んだベストアンサー

  • ベストアンサー
  • jcctaira
  • ベストアンサー率58% (119/204)
回答No.3

capybaruさん シート名が重複したら、(2),(3)…と番号を増やすようにしました。 また、capybaruさんのプログラムをベースにしています。    Sub test()  Dim aSheet As Worksheet  Dim NO   As Integer  For Each aSheet In Worksheets   aSheet.Select   NO = 1   On Error Resume Next   Do    Err.Clear    aSheet.Name = Range("A1") & IIf(NO = 1, "", Format(NO, "(#)"))    If Err.Number = 0 Then Exit Do    NO = NO + 1   Loop   On Error GoTo 0  Next aSheet End Sub

capybaru
質問者

お礼

本当にありがとうございます。 助かりました。 (2),(3)・・・と増やせるようになっているのもうれしいです。

その他の回答 (4)

  • MARU4812
  • ベストアンサー率43% (196/452)
回答No.5

>'**本当ならここでA1の値がシート名として適切かのチェックを入れる こういうことが原因のエラーもあるから、あまりエラーを握りつぶしすぎると 延々とカウントアップする無限ループになったりして怖いけどね。 まぁ、質問者の自己責任だけど。

capybaru
質問者

お礼

ありがとうございます。

  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.4

作って見ました。 ブックに含まれているシートが全部Worksheetである事が前提(グラフシート等は無い事)です。 全部のシート名を一時的に適当な名前に変えた上で目的の名前に変更しています。 コレにより、変更前のブックに付けたい名前のシートが存在している場合の問題を回避しています。 Sub sample()   Dim sName() As String   Dim aSheet As Worksheet   Dim i, j, k, nCount As Long        ReDim sName(ThisWorkbook.Sheets.Count)   For Each aSheet In Worksheets     i = i + 1     sName(i) = aSheet.Range("A1") '各シートのA1を配列に     aSheet.Name = Format(Now(), "hhmmss") & CStr(i) 'シート名を一時的に適当な名前に変更   Next aSheet      '**本当ならここでA1の値がシート名として適切かのチェックを入れる      For j = 1 To ThisWorkbook.Sheets.Count     nCount = 0     For k = 1 To j       If sName(j) = sName(k) Then         nCount = nCount + 1       End If     Next k     '同じシート名が複数出来る時は(n)を後ろに付ける     If nCount > 1 Then       sName(j) = sName(j) & "(" & CStr(nCount) & ")"     End If     Sheets(j).Name = sName(j)   Next j End Sub

capybaru
質問者

お礼

どうも、ありがとうございます。

  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.2

次のようにしてはどうでしょう。 Sub test() Dim aSheet As Worksheet For Each aSheet In Worksheets aSheet.Select On Error GoTo エラー処理 aSheet.Name = Range("A1") Next aSheet エラー処理: aSheet.Name = Range("A1") & "(2)" Resume Next End Sub

capybaru
質問者

お礼

どうも、ありがとうございます。

  • MARU4812
  • ベストアンサー率43% (196/452)
回答No.1

> セルのA1を参照してシート名を変更するとき > 名前が重複したら、A1に入力されている文字列の後に(2)とつけたいのですが、 説明がよく分からないんだけど、A1しか参照しないなら必ず重複するのでは? 「重複したら」ってするかしないかの判断なんて要らないんじゃないの? 無条件に、数字の変数でカウントした連番つければいいだけでは? まぁ、すでにA1に入っている文字列を使ったシートが存在したら そういうチェックも必要だけど、シートに使われていない文字列で1回 書き換えてからA1を書き換えて、本来変えたかったシート名に変える とか運用で逃げればいいと思っちゃう。 でないと色々と考慮しないといけないパターンが増えるからね。 変更したいシート名 Test1, Test1(2), Test1(3), Test1(4) 変更前のシート名 Sheet1, Sheet2, Test1, Test1(4) だった場合、 Sheet1 → Test1 Test1 → Test1(3) Test1(4) → Test1(4) とかなったりしてね。どうするつもりなのです?