声明变量工作簿/工作表vba

Mad*_*sen 18 variables excel vba

我知道这可能是一个微不足道的问题,但我似乎无法宣称一个workbookworksheet一个变量VBA.我有以下代码,但我无法弄清楚我做错了什么,应该是直截了当的.通常我没有任何问题声明变量等问题Dim i As Integer.

sub kl() 

    Dim wb As Workbook
    Dim ws As Worksheet

    Set wb = ActiveWorkbook
    Set ws = Sheet("name")

    wb.ws.Select

End Sub
Run Code Online (Sandbox Code Playgroud)

当我运行上面的代码时,我收到一个type missmatch错误.

Gar*_*ent 17

使用Sheets而不是Sheet并按顺序激活它们:

Sub kl()
    Dim wb As Workbook
    Dim ws As Worksheet
    Set wb = ActiveWorkbook
    Set ws = Sheets("Sheet1")
    wb.Activate
    ws.Select
End Sub
Run Code Online (Sandbox Code Playgroud)

  • 这是对的.但是`wb.activate`可能是多余的.如果`wb`被分配给上面两行的`activeworkbook`,那么它已被激活. (3认同)
  • @JNevill**好点**我使用了两个语句,以防用户想要修改**Set**以指向其他一些工作簿. (3认同)
  • 请注意,“ Sheets”集合包含“ Worksheet”对象,还包含“ Chart”,以及一堆旧的图纸类型。如果要检索实际的“工作表”对象,请使用“工作表”集合。 (2认同)

Mat*_*don 8

如果要检索的工作表在编译时存在ThisWorkbook(即包含您正在查看的VBA代码的工作簿),那么引用该Worksheet对象的最简单且最一致的可靠方法是使用其代码名称:

Debug.Print Sheet1.Range("A1").Value
Run Code Online (Sandbox Code Playgroud)

您可以通过更改属性工具窗口(F4)中的属性,将代码名称设置为您需要的任何内容(只要它是有效的VBA标识符),与其"选项卡名称"(用户可以随时修改)无关.:(Name)

Sheet1属性

Name属性指的是用户可以随意改变的"选项卡名称"; 该(Name)属性引用工作表的代码名称,用户无法在不访问Visual Basic编辑器的情况下进行更改.

VBA使用此代码名称自动声明一个全局范围的Worksheet对象变量,您的代码可以在任何地方使用它来免费引用该表.

换句话说,如果工作表ThisWorkbook在编译时存在,则永远不需要为它声明变量 - 变量已经存在!


如果工作表是在运行时创建的(内部ThisWorkbook或非内部),需要声明并为其分配Worksheet变量.

使用对象的Worksheets属性Workbook来检索它:

Dim wb As Workbook
Set wb = Application.Workbooks.Open(path)

Dim ws As Worksheet
Set ws = wb.Worksheets(nameOrIndex)
Run Code Online (Sandbox Code Playgroud)

重要笔记...

  • 除非工作簿结构受到保护,否则用户可以轻松修改工作表的名称和索引(无论是否意外).如果工作簿不受保护,您根本无法假设名称或索引单独为您提供您所需的特定工作表 - 验证工作表的格式总是一个好主意(例如,验证单元格A1是否包含某些特定文本,或者有一个具有特定名称的表,其中包含一些特定的列标题).

  • 使用该Sheets集合包含Worksheet对象,但也可以包含Chart实例,以及六个不是工作表的传统工作表类型.Worksheet从任何Sheets(nameOrIndex)返回值中分配引用,都会因此导致类型不匹配运行时错误.

  • 出线Worksheets集合是一个隐含的ActiveWorkbook参考 -这意味着Worksheets集合无论从任何工作簿是活跃在指令执行的瞬间拉动.这样的隐式引用会使代码变得脆弱且容易出错,特别是如果用户可以在代码运行时导航并与Excel UI交互.

  • 除非您的意思是激活特定工作表,否则您永远不需要打电话ws.Activate来完成工作表的99%.只需使用您的ws变量.


Dan*_*and 0

尝试更改变量的名称,因为有时它与其他模块/子模块发生冲突

 Dim Workbk As Workbook
 Dim Worksh As Worksheet
Run Code Online (Sandbox Code Playgroud)

但也尝试一下

 Set ws = wb.Sheets("name")
Run Code Online (Sandbox Code Playgroud)

我不记得它是否适用于Sheet