Excel 从Userform执行按钮引发下标超出范围错误

Excel 从Userform执行按钮引发下标超出范围错误,excel,vba,Excel,Vba,该代码的按钮以前出现在Excel工作表中,测试并成功执行。现在我已经将该按钮转换为Userform,当执行该按钮时,会出现一个错误 下标超出范围 使用分步调试时 错误发生在第1行 Worksheets("Sheet1").Columns(5).ClearContents 我找不出毛病 Private Sub OUTCLR_Click() Worksheets("Sheet1").Columns(5).ClearContents Worksheets("Sheet1").Colu

该代码的按钮以前出现在Excel工作表中,测试并成功执行。现在我已经将该按钮转换为Userform,当执行该按钮时,会出现一个错误

下标超出范围

使用分步调试时 错误发生在第1行

Worksheets("Sheet1").Columns(5).ClearContents
我找不出毛病

Private Sub OUTCLR_Click()
    Worksheets("Sheet1").Columns(5).ClearContents
    Worksheets("Sheet1").Columns(2).ClearContents
    Sheet1.Cells(1, 5).Value = "RESULT"
    Sheet1.Cells(1, 2).Value = "PROCESSED UNIQUE STRINGS"
End Sub

这里有两个问题

  • 隐式
    工作表
    集合绑定到代码运行时处于活动状态的工作簿,它很可能不是您期望的工作簿。另一个工作簿不一定包含一个工作表,该工作表的名称(从工作表选项卡上的Excel中可以看到)为“Sheet1”

  • 假设预期工作簿处于活动状态,
    工作表(“Sheet1”)
    将失败,如果其工作表中没有Excel中显示的名称为“Sheet1”,则“下标超出范围”。请注意,任何给定的工作表都具有
    Name
    CodeName
    属性<代码>名称如Excel中所示,可能随时更改<代码>代码名可以从Visual Basic编辑器中的(名称)下的工作表属性中看到。这个名字,你可以根据自己的喜好设置,随着时间的推移,它会保持稳定。您可以在代码中直接使用它,就像您在代码的最后两行中所做的那样


  • 如果您打算在执行代码的工作簿中使用代码名Sheet1操作工作表,请在您的4行代码中直接使用Sheet1;不要费心于
    工作表的收集。

    这里有两个问题

  • 隐式
    工作表
    集合绑定到代码运行时处于活动状态的工作簿,它很可能不是您期望的工作簿。另一个工作簿不一定包含一个工作表,该工作表的名称(从工作表选项卡上的Excel中可以看到)为“Sheet1”

  • 假设预期工作簿处于活动状态,
    工作表(“Sheet1”)
    将失败,如果其工作表中没有Excel中显示的名称为“Sheet1”,则“下标超出范围”。请注意,任何给定的工作表都具有
    Name
    CodeName
    属性<代码>名称
  • 如Excel中所示,可能随时更改<代码>代码名可以从Visual Basic编辑器中的(名称)下的工作表属性中看到。这个名字,你可以根据自己的喜好设置,随着时间的推移,它会保持稳定。您可以在代码中直接使用它,就像您在代码的最后两行中所做的那样


    如果您打算在执行代码的工作簿中使用代码名Sheet1操作工作表,请在您的4行代码中直接使用Sheet1;不要费心于
    工作表
    集合。

    当按钮位于工作表的代码隐藏中时,
    活动工作簿
    保证是
    此工作簿

    既然它是在用户表单中,
    ActiveWorkbook
    就是在显示表单时恰好处于活动状态的工作簿,而且它甚至可以在显示表单时更改,具体取决于其中的代码

    非限定的
    工作表
    调用隐式地引用了
    ActiveWorkbook
    :这就像它们隐式地这样做:

    ActiveWorkbook.Worksheets("Sheet1")...
    
    可能有效,但如果活动工作簿不是预期的,或者如果有人去将选项卡/工作表名称从
    Sheet1
    更改为
    Summary 2018-12-21
    ,则会中断:“下标超出范围”意味着无论查询什么工作簿,其中都没有名为“Sheet1”的工作表

    另一方面,这些

    Sheet1.Cells(....)
    
    正在使用工作表的代码名-与用户可修改的选项卡名无关。篡改这些内容的唯一方法是打开VBA编辑器,在项目资源管理器(Ctrl+R)中查找工作表,并在“属性”工具窗口(F4)中更改其
    (名称)
    属性


    如果所有4条指令都要处理同一工作表,并且该工作表在编译时存在于
    本工作簿中(即带有VBA代码的文件),请将它们全部处理完
    工作表1
    -不要从
    本工作簿中提取该对象。工作表
    ,更不用说
    ActiveWorkbook.worksheet

    当按钮位于工作表的代码后面时,
    ActiveWorkbook
    保证是
    thiswoolk

    既然它是在用户表单中,
    ActiveWorkbook
    就是在显示表单时恰好处于活动状态的工作簿,而且它甚至可以在显示表单时更改,具体取决于其中的代码

    非限定的
    工作表
    调用隐式地引用了
    ActiveWorkbook
    :这就像它们隐式地这样做:

    ActiveWorkbook.Worksheets("Sheet1")...
    
    可能有效,但如果活动工作簿不是预期的,或者如果有人去将选项卡/工作表名称从
    Sheet1
    更改为
    Summary 2018-12-21
    ,则会中断:“下标超出范围”意味着无论查询什么工作簿,其中都没有名为“Sheet1”的工作表

    另一方面,这些

    Sheet1.Cells(....)
    
    正在使用工作表的代码名-与用户可修改的选项卡名无关。篡改这些内容的唯一方法是打开VBA编辑器,在项目资源管理器(Ctrl+R)中查找工作表,并在“属性”工具窗口(F4)中更改其
    (名称)
    属性


    如果所有4条指令都要处理同一工作表,并且该工作表在编译时存在于
    本工作簿中(即带有VBA代码的文件),请将它们全部处理完
    工作表1
    -不要从
    本工作簿中提取该对象。工作表
    ,从
    ActiveWorkbook.Worksheets

    您的工作簿中是否有名为“Sheet1”的工作表?*无论活动工作簿是什么,@dwirony<代码>工作表
    在此处隐式引用
    活动工作簿
    。这4行是在同一张工作表上工作的吗?为什么不呢?