VBA循环正常运行,但最终出现运行时错误

时间:2019-04-26 15:28:49

标签: excel vba loops

我正在运行一个For Each循环,以根据每个工作表中的一部分字符串重命名工作簿中的每个工作表。 “ works”下面的代码,意味着每个工作表都被重命名,但是随后出现运行时错误1004“应用程序定义或对象定义的错误”。

我已经尝试了多种修复方法,例如使用'ws'而不是'sht',尝试使用单元格引用而不是'Range'以及在If语句中设置Else。

    For Each sht In ThisWorkbook.Worksheets
        If sht.Name <> "Control" Then
            sht.Name = Replace(sht.Range("A10"), "Using Restrictions of: Category Filter (Product) - ", "")
        End If
    Next

对于带有字符串“使用限制:类别过滤器(产品)-旅行和运输”的工作表: 1-我希望工作表将重命名为“旅行和运输” 2-对于每个工作表(名为“ Control”的表除外),要相对于单元格A10中该表的字符串值重命名 3-子到终点无错误。 实际:1和2成功,但3没有成功

2 个答案:

答案 0 :(得分:1)

已经执行了代码,如果工作表的新名称最终为空白或最终超过了它可以容纳的最大字符数,我将得到Runtime Error 1004 “Application-defined or Object-defined error

例如,如果在某些工作表A10中为空,则可能会发生这种情况。在这种情况下,新名称最终将为空白。

可能发生的另一种情况是,如果您搜索以替换的字符串与A10中找到的字符串不同。例如,您正在搜索

"Using Restrictions of: Category Filter (Product) - "

但是例如A10缺少空格字符:

"Using Restrictions of: Category Filter (Product)- Travel & Transport"

在这种情况下,新名称最终将等于A10值,超过了最大字符数。

另一种可能性是Control工作表的名称与If-statement中的拼写方式不同。在这种情况下,所有工作表都将被重命名,并且如果Control中的A10为空,那么您将得到Runtime Error 1004

所以我的建议:

  1. 确保没有隐藏的工作表(右键单击工作表的选项卡,然后单击“取消隐藏”)
  2. 确保要从循环中排除的工作表是 拼写与您的If statement
  3. 完全相同
  4. 确保"Control"是唯一应从循环中排除的工作表
  5. 确保在您所使用的任何工作表中,此"Using Restrictions of: Category Filter (Product) - "的拼写都没有错误 要重命名。
  6. 请确保"Using Restrictions of: Category Filter (Product) - "之后的内容不超过工作表名称可以容纳的最大字符数。

答案 1 :(得分:0)

为了进行测试,请查看您是否不能这样做:

dim sht as worksheet, z as string, arr as variant, x as long
arr = Array("/", "\", "'", ",", "!", "@", "(", ")", "&", "-", "Using Restrictions of: Category Filter (Product) - ")
For Each sht In ThisWorkbook.Worksheets
    If sht.Name <> "Control" Then 
        z = sht.cells(10,1).value
        For x = LBound(arr) To UBound(arr)
            z = Replace(z, arr(x), "")
        Next x
        if len(z) > 0 then sht.Name = z
    End if
Next

我怀疑您的姓名没有出现其他符号。

当工作表名称旨在包含的字符串中没有多余的符号时,出现以下错误:

enter image description here


编辑1:

在z = 0的情况下添加到catch中,以便保持名称不变