首页 > 解决方案 > 使用 VBA 中同一工作表中的单元格值重命名 Excel 中的多个工作表

问题描述

我目前正在做一个 VBA 项目。我有一个工作簿,其中包含来自不同工作簿的多个选项卡。所有选项卡的名称都是相同的,但是由于它们来自不同的文件,我想根据提取它们的文件名来命名它们。文件名存在于每个选项卡的单元格 EC1 中。我想根据每个工作表的单元格 EC1 中存在的值来命名工作簿中的所有工作表。

我有以下代码:

Sub RenameSheet()
    Dim rs As Worksheet
    For Each rs In Sheets
    rs.Name = rs.Range("EC1")
    Next rs
End Sub

我从上面的代码中得到了 1004 错误。

我也试过这段代码:

Sub RenameSheet()
    Dim xWs As Worksheet
    Dim xRngAddress As String
    Dim xName As String
    Dim xSSh As Worksheet
    Dim xInt As Integer
    xRngAddress = Application.ActiveCell.Address
    On Error Resume Next
    Application.ScreenUpdating = False
    For Each xWs In Application.ActiveWorkbook.Sheets
        xName = xWs.Range(xRngAddress).Value
        If xName <> "" Then
            xInt = 0
            Set xSSh = Nothing
            Set xSSh = Worksheets(xName)
            While Not (xSSh Is Nothing)
                Set xSSh = Nothing
                Set xSSh = Worksheets(xName & "(" & xInt & ")")
                xInt = xInt + 1
            Wend
            If xInt = 0 Then
                xWs.Name = xName
            Else
                If xWs.Name <> xName Then
                    xWs.Name = xName & "(" & xInt & ")"
                End If
            End If
        End If
    Next
    Application.ScreenUpdating = True
End Sub

有些工作表确实被重命名,但有些则没有。我检查了重复的工作表名称,但没有。我还检查了文件名是否在正确的范围(单元格)内,并且它存在。

标签: excelvba

解决方案


如果该值包含一些特殊字符,则可能存在问题。excel表格的名称可能有一些限制,如果这是问题,我的代码可能是解决方案。它将字符串剪切到最大长度为 31 个字符,并删除名称中不允许的所有特殊字符。

Sub RenameSheet()

Dim rs As Worksheet

For Each rs In Sheets
sheetName = without_special_chars(rs.Range("EC1").Value)
If Len(sheetName) > 31 Then
    sheetName = Left(sheetName, 31)
End If
rs.Name = sheetName
Next rs

End Sub

Function without_special_chars(text As String) As String
Dim i As Integer
Const special_chars As String = "-.,:;#+ß'*?=)(/&%$§!~\}][{"
For i = 1 To Len(special_chars)
text = Replace(text, Mid(special_chars, i, 1), "")
Next i
without_special_chars = text
End Function

推荐阅读