我正在学习Visual Basic for Applications,并且我有点不确定何时使用过程。例如,每次创建对象变量时都需要一个过程?或者可以创建一个对象变量而不作为一个过程来执行?了解VBA对象变量
我可能只是
Dim wkbInventory As Workbook
Set wkbInventory = Application.Workbooks("name.xlsm")
谢谢!
我正在学习Visual Basic for Applications,并且我有点不确定何时使用过程。例如,每次创建对象变量时都需要一个过程?或者可以创建一个对象变量而不作为一个过程来执行?了解VBA对象变量
我可能只是
Dim wkbInventory As Workbook
Set wkbInventory = Application.Workbooks("name.xlsm")
谢谢!
一个对象变量可以声明外程序。所以
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
内的子过程或函数中。
我要做的第一个建议是将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
您对早期结合与晚期结合的解释不正确。你称之为“后期绑定”是早期绑定,你称之为“早期绑定”是自动实例化。请参阅https://support.microsoft.com/en-us/kb/245115和http://www.cpearson.com/excel/declaringvariables.aspx - >“不要使用自动实例化对象变量” –
感谢信息阿克塞尔。我改变了这个例子。 – MatthewD
几乎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
如果有一个工作簿打开,名为** 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
非常感谢大家。所有这些线程都帮助我理解VBA对象变量。 – Rosario