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

时间:2014-09-25 13:28:46

标签: excel vba variables

我知道这可能是一个微不足道的问题,但我似乎无法在workbook中声明worksheetVBA作为变量。我有以下代码,但我无法弄清楚我做错了什么,应该是直截了当的。通常,我在声明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

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

8 个答案:

答案 0 :(得分:15)

使用表格而不是表格并按顺序激活它们:

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

答案 1 :(得分:8)

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

Worksheet

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

Sheet1 properties

(Name)属性是指用户可以随心所欲地更改的“标签名称”; Name属性引用工作表的代码名称,用户无法在不访问Visual Basic编辑器的情况下进行更改。

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

换句话说,如果工作表在编译时存在于Worksheet中,则根本不需要为它声明变量 - 变量已经存在!

如果工作表是在运行时创建的(在ThisWorkbook内部),那么然后你需要声明&为它分配一个ThisWorkbook变量。

使用Worksheet对象的Worksheets属性进行检索:

Workbook

重要说明......

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

  • 使用Dim wb As Workbook Set wb = Application.Workbooks.Open(path) Dim ws As Worksheet Set ws = wb.Worksheets(nameOrIndex) 集合包含Sheets个对象,但也可以包含Worksheet个实例,还有六个不是工作表的传统工作表类型< / strong>即可。从Chart返回的任何内容中分配Worksheet引用,可能会因此导致类型不匹配运行时错误。

  • 限定 Sheets(nameOrIndex)集合是一个隐式ActiveWorkbook引用 - 意味着Worksheets集合正在从任何活动工作簿中提取在指令执行的那一刻。这样的隐式引用会使代码变得脆弱且容易出错,尤其是当用户可以在代码运行时导航并与Excel UI交互时。

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

答案 2 :(得分:2)

第三种解决方案: 我会将ws设置为一张工作簿wb,因为Sheet("name")的使用始终引用活动工作簿,这可能会随着代码的开发而改变。

sub kl() 

    Dim wb As Workbook
    Dim ws As Worksheet

    Set wb = ActiveWorkbook
    'be aware as this might produce an error, if Shet "name" does not exist
    Set ws = wb.Sheets("name")
    ' if wb is other than the active workbook
    wb.activate
    ws.Select

End Sub

答案 3 :(得分:0)

尝试更改变量的名称,因为它有时会与其他模块/ subs

冲突
 Dim Workbk As Workbook
 Dim Worksh As Worksheet

但是,试试

 Set ws = wb.Sheets("name")

我不记得它是否适用于Sheet

答案 4 :(得分:0)

令您惊讶的是,您需要在excel 2007或更高版本中为工作簿和工作表声明变量。只需添加单行表达式。

Sub kl()

    Set ws = ThisWorkbook.Sheets("name")
    ws.select
End Sub

删除其他所有内容并享受。 但为什么选择一张纸?现在,对于计算和操作来说,选择纸张是老式的。 只需添加这样的公式

Sub kl()

    Set ws = ThisWorkbook.Sheets("name")
    ws.range("cell reference").formula = "your formula"
'OR in case you are using copy paste formula, just use 'insert or formula method instead of ActiveSheet.paste e.g.:
   ws.range("your cell").formula
'or
   ws.colums("your col: one col e.g. "A:A").insert
'if you need to clear the previous value, just add the following above insert line
   ws.columns("your column").delete

End Sub

答案 5 :(得分:-1)

我有同样的问题。我使用了Worksheet代替Worksheets并且已经解决了。不确定它们之间有什么区别。

答案 6 :(得分:-1)

Dim ws as Object

Set ws = Worksheets("name")

当将工作表声明为工作表而不是ojbect时,我在本工作表中遇到了使用OptionButtons(Active X)的问题(我猜这与任何Active-X元素相同。当声明为对象时,一切正常。

答案 7 :(得分:-1)

上面有很多答案!这是我的看法:

Sub kl()

    Dim wb As Workbook
    Dim ws As Worksheet

    Set ws = Sheets("name")
    Set wb = ThisWorkbook

With ws
    .Select
End With

End Sub

你的第一个(也许是偶然的)错误,因为我们已经提到的是&#34; Sheet&#34; ...应该是&#34;表格&#34;

with块非常有用,因为如果将wb设置为当前工作簿以外的任何内容,它将正确执行