![]() |
谈吐大方的刺猬 · 语法范畴:性,数,格,时,体,级……· 6 月前 · |
![]() |
眉毛粗的草稿纸 · 法兰克福财经管理大学国际竞争力提升项目招生简 ...· 8 月前 · |
![]() |
眼睛小的鞭炮 · 斗罗大陆237集 ...· 1 年前 · |
![]() |
痴情的铁板烧 · 【帝豪L Hi·P参数配置】吉利汽车帝豪L ...· 2 年前 · |
我写了以下代码:
Function find_results_idle()
Public iRaw As Integer
Public iColumn As Integer
iRaw = 1
iColumn = 1
然后我得到了错误消息:
“子或函数中的无效属性”
你知道我做错了什么吗?
我试着用
Global
代替
Public
,但是遇到了同样的问题。
我试图将函数本身声明为‘`Public’,但这也没有用。
我需要做什么来创建全局变量?
您需要在函数外部声明变量:
Public iRaw As Integer
Public iColumn As Integer
Function find_results_idle()
iRaw = 1
iColumn = 1
要使用全局变量,请从VBA Project UI插入新模块,并使用
Global
声明变量
Global iRaw As Integer
Global iColumn As Integer
这是一个关于的问题。
如果只希望变量在函数的生命周期内持续,请在函数或sub中使用
Dim
(Dimension的缩写)来声明变量:
Function AddSomeNumbers() As Integer
Dim intA As Integer
Dim intB As Integer
intA = 2
intB = 3
AddSomeNumbers = intA + intB
End Function
'intA and intB are no longer available since the function ended
使用
Public
关键字在函数外部声明全局变量(如SLaks所指出的)。此变量将在运行应用程序的生命周期内可用。对于Excel,这意味着只要特定的Excel工作簿处于打开状态,变量就可用。
Public intA As Integer
Private intB As Integer
Function AddSomeNumbers() As Integer
intA = 2
intB = 3
AddSomeNumbers = intA + intB
End Function
'intA and intB are still both available. However, because intA is public, '
'it can also be referenced from code in other modules. Because intB is private,'
'it will be hidden from other modules.
您还可以通过使用
Private
关键字声明变量,使其只能在特定模块(或类)中访问。
如果您正在构建一个大型应用程序,并且觉得需要使用全局变量,我建议您为全局变量创建一个单独的模块。这应该可以帮助您在一个地方跟踪它们。
如果这个函数在一个模块/类中,你可以在函数外部编写它们,这样它就有了
Global Scope
。全局作用域表示变量可以被同一模块/类中的另一个函数
访问(如果您使用
dim
作为声明语句,如果希望所有模块中的所有函数都可以访问变量,请使用
public
):
Dim iRaw As Integer
Dim iColumn As Integer
Function find_results_idle()
iRaw = 1
iColumn = 1
End Function
Function this_can_access_global()
iRaw = 2
iColumn = 2
End Function
在General声明中创建一个公共整数。
然后在你的函数中,你可以每次增加它的值。参见示例(将电子邮件附件保存为CSV的功能)。
Public Numerator As Integer
Public Sub saveAttachtoDisk(itm As Outlook.MailItem)
Dim objAtt As Outlook.Attachment
Dim saveFolder As String
Dim FileName As String
saveFolder = "c:\temp\"
For Each objAtt In itm.Attachments
FileName = objAtt.DisplayName & "_" & Numerator & "_" & Format(Now, "yyyy-mm-dd H-mm-ss") & ".CSV"
objAtt.SaveAsFile saveFolder & "\" & FileName
Numerator = Numerator + 1
Set objAtt = Nothing
End Sub
正如另一个人所说,这个问题实际上是关于范围的。
简而言之,考虑这个“模块”:
Public Var1 As variant 'Var1 can be used in all
'modules, class modules and userforms of
'thisworkbook and will preserve any values
'assigned to it until either the workbook
'is closed or the project is reset.
Dim Var2 As Variant 'Var2 and Var3 can be used anywhere on the
Private Var3 As Variant ''current module and will preserve any values
''they're assigned until either the workbook
''is closed or the project is reset.
Sub MySub() 'Var4 can only be used within the procedure MySub
Dim Var4 as Variant ''and will only store values until the procedure
End Sub ''ends.
Sub MyOtherSub() 'You can even declare another Var4 within a
Dim Var4 as Variant ''different procedure without generating an
End Sub ''error (only possible confusion).
有关变量声明的更多信息,请查看此 MSDN reference ,有关变量如何超出作用域的更多信息,请查看其他 Stack Overflow Question 。
另外两件快速的事情:
在使用工作簿级别变量时,请组织好
创建公共/全局变量的一个好方法是将表单视为类对象,声明属性并使用公共属性获取变量来访问属性/方法。此外,您可能需要引用或传递对实例化的表单模块的引用。如果对已关闭的窗体/报表调用方法,则会出现错误。
示例:将Me.Form.Module.Parent传递到子/函数中,而不是在表单中。
Option Compare Database
Option Explicit
''***********************************''
' Name: Date: Created Date Author: Name
' Current Version: 1.0
' Called by:
''***********************************''
' Notes: Explain Who what when why...
' This code Example requires properties to be filled in
''***********************************''
' Global Variables
Public GlobalData As Variant
''***********************************''
' Private Variables
Private ObjectReference As Object
Private ExampleVariable As Variant
Private ExampleData As Variant
''***********************************''
' Public properties
Public Property Get ObjectVariable() As Object
Set ObjectVariable = ObjectReference
End Property
Public Property Get Variable1() As Variant
'Recommend using variants to avoid data errors
Variable1 = ExampleVariable
End property
''***********************************''
' Public Functions that return values
Public Function DataReturn (Input As Variant) As Variant
DataReturn = ExampleData + Input
End Function
''***********************************''
' Public Sub Routines
Public Sub GlobalMethod()
'call local Functions/Subs outside of form
Me.Form.Refresh
End Sub
''***********************************''
' Private Functions/Subs used not visible outside
''***********************************''
End Code
因此,在另一个模块中,您将能够访问:
Public Sub Method1(objForm as Object)
'read/write data value
objForm.GlobalData
'Get object reference (need to add Public Property Set to change reference object)
objForm.ObjectVariable
'read only (needs Public property Let to change value)
objForm.Variable1
'Gets result of function with input
objForm.DataReturn([Input])
'runs sub/function from outside of normal scope
objForm.GlobalMethod
End Sub
如果您像我一样使用后期绑定,那么在尝试进行任何处理之前,总是会检查Null值和对象是否为空。
![]() |
谈吐大方的刺猬 · 语法范畴:性,数,格,时,体,级…… 6 月前 |