2016-01-31 61 views
1

我正在学习Visual Basic for Applications,并且我有点不确定何时使用过程。例如,每次创建对象变量时都需要一个过程?或者可以创建一个对象变量而不作为一个过程来执行?了解VBA对象变量

我可能只是

Dim wkbInventory As Workbook 
Set wkbInventory = Application.Workbooks("name.xlsm") 

谢谢!

+0

如果有一个工作簿打开,名为** name.xlsm **,则它位于当前应用程序实例的[Workbooks Collection]中(https://msdn.microsoft.com/en-us/library/office/aa224505% 28v = office.11​​%29.aspx),你可以用这种方式声明一个变量和'Set'。如果它不是**打开,那么你需要首先打开它(或者同时像'Set wkbInventory = Workbooks.Open(“name.xlsm”)')。 – Jeeped

+0

非常感谢大家。所有这些线程都帮助我理解VBA对象变量。 – Rosario

回答

2

一个对象变量可以声明外程序。所以

Dim wkbInventory As Workbook

可以在Declarations(见https://msdn.microsoft.com/en-us/library/dd897495%28v=office.12%29.aspx#odc_ac2007_bk_BeginningAccess2007VBA_Chapt2_CreatingModules)。

该变量的scope取决于声明发生的位置。见http://www.cpearson.com/Excel/Scope.aspx

但是一个变量不能在过程或函数之外实例化。所以

Set wkbInventory = Application.Workbooks("name.xlsm")

必须Procedures内的子过程或函数中。

0

我要做的第一个建议是将Option Explicit放在代码的顶部(高于所有子和函数)。这会帮助你知道什么时候不正确。

Dim wkbInventory As Workbook Set wkbInventory = Application.Workbooks("name.xlsm") 

不起作用。您将必须做

Dim wkbInventory As Workbook 
Set wkbInventory = Application.Workbooks("name.xlsm") 

仅供参考,有迟绑定与早绑定,可能会帮助你。这是值得学习无关的程序,所以我只是提供作为,如果你已经din't知道...

https://support.microsoft.com/en-us/kb/245115

可以早期绑定

' Set reference to 'Microsoft Excel 8.0 Object Library' in 
' the Project|References dialog (or Tools|References for VB4 or VBA). 

' Declare the object as an early-bound object 
    Dim oExcel As Excel.Application 

    Set oExcel = CreateObject("Excel.Application") 

' The Visible property is called via the v-table 
    oExcel.Visible = True 

或早期绑定

' No reference to a type library is needed to use late binding. 
' As long as the object supports IDispatch, the method can 
' be dynamically located and invoked at run-time. 

' Declare the object as a late-bound object 
    Dim oExcel As Object 

    Set oExcel = CreateObject("Excel.Application") 

' The Visible property is called via IDispatch 
    oExcel.Visible = True 
+0

您对早期结合与晚期结合的解释不正确。你称之为“后期绑定”是早期绑定,你称之为“早期绑定”是自动实例化。请参阅https://support.microsoft.com/en-us/kb/245115和http://www.cpearson.com/excel/declaringvariables.aspx - >“不要使用自动实例化对象变量” –

+0

感谢信息阿克塞尔。我改变了这个例子。 – MatthewD

1

几乎VBA中的所有工作都发生在宏内部。您可以在宏之外声明变量(虽然这会更改变量的范围,而不是在宏内声明它),并指定一些编译器选项,但这是关于它的。

这是OK:

Option Explicit 

' Declaration 
Dim c As Collection 

Sub foo() 

Set c = New Collection 
c.Add "hello", "world" 
MsgBox c.Count 

End Sub 

,而这将产生一个编译错误 - “无效的外部程序”:

Option Explicit 

' Declaration 
Dim c As Collection 
' This causes an error 
Set c = New Collection 

Sub foo() 

c.Add "hello", "world" 
MsgBox c.Count 

End Sub 

如果您使用隐式建立与您变量声明(DIM X作为新y)那么它在宏观之外工作。不是所有的对象都可以这样创建。此代码的工作:

Option Explicit 

' Declaration with implicit creation 
Dim c As New Collection 

Sub foo() 

c.Add "hello", "world" 
MsgBox c.Count 

End Sub 

,而该代码不起作用(你会得到错误429 - ActiveX组件不能创建对象):

Option Explicit 

' Declaration with implicit creation 
Dim w As New Workbook 

Sub foo() 

MsgBox w.FullName 

End Sub