- ベストアンサー
エクセルのシート名変更で重複した時のvbaの処理
- エクセルのVBAを使用してシート名を変更する方法について質問です。セルA1の値を新しいシート名として使用し、名前が既に存在する場合は末尾に(2)を付けたいですが、処理方法がわかりません。
- VBAを使用してエクセルのシート名を変更する方法について質問です。セルA1の値を新しいシート名として使用し、名前が既に存在する場合は末尾に(2)を付けたいですが、具体的な処理方法がわかりません。
- エクセルのVBAを使用してシート名を変更する方法について教えてください。セルA1の値を新しいシート名として使用し、重複がある場合は末尾に(2)をつけたいですが、具体的な処理方法がわかりません。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
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
その他の回答 (4)
- MARU4812
- ベストアンサー率43% (196/452)
>'**本当ならここでA1の値がシート名として適切かのチェックを入れる こういうことが原因のエラーもあるから、あまりエラーを握りつぶしすぎると 延々とカウントアップする無限ループになったりして怖いけどね。 まぁ、質問者の自己責任だけど。
お礼
ありがとうございます。
- mt2008
- ベストアンサー率52% (885/1701)
作って見ました。 ブックに含まれているシートが全部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
お礼
どうも、ありがとうございます。
- KURUMITO
- ベストアンサー率42% (1835/4283)
次のようにしてはどうでしょう。 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
お礼
どうも、ありがとうございます。
- MARU4812
- ベストアンサー率43% (196/452)
> セルの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) とかなったりしてね。どうするつもりなのです?
お礼
本当にありがとうございます。 助かりました。 (2),(3)・・・と増やせるようになっているのもうれしいです。