我知道这可能是一个微不足道的问题,但我似乎无法在workbook
中声明worksheet
或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
当我运行上面的代码时,收到type missmatch
错误。
答案 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):
(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设置为当前工作簿以外的任何内容,它将正确执行