【发布时间】:2019-07-13 08:10:05
【问题描述】:
在我用 VBA 制作的子程序中,每次工作表更改时都会执行该子程序,子程序调用一个函数来确定用户是否删除或更改了他们不应该拥有的东西。该函数返回一个布尔值来告诉 sub 是否已删除/编辑了这样的临界值。这样子就知道不继续执行代码了。
但是,无论何时执行代码,VBA 都会为调用 criticalDataIntact() 函数返回一个 Compile Error: Expected array 错误,尽管没有使用任何数组。
这是我的相关代码,
Private Sub Worksheet_Change(ByVal target As Range)
Worksheets(CONFIG).usedRange 'Refresh UsedRange
Dim criticalDataIntact As Boolean: criticalDataIntact = criticalDataIntact()
If Not criticalDataIntact Then
Exit Sub
End If
'Irrelevant code
End Sub
Private Function criticalDataIntact() As Boolean
Dim criticalDataIntact As Boolean: criticalDataIntact = True
Set warnWorkloadCell = ThisWorkbook.cell(CONFIG, WARNING_WORKLOAD, 0, 0)
Set dangerWorkloadCell = ThisWorkbook.cell(CONFIG, DANGER_WORKLOAD, 0, 0)
Dim table3Exists As Boolean: table3Exists = tableExists("Table3")
If warnWorkloadCell = Null Or dangerWorkloadCell = Null Or table3Exists = False Then
criticalDataIntact = False
End If
End Function
cell 函数通过MsgBox 输出错误消息,如果在特定工作表中找不到具有特定值的单元格,则返回Null。
有什么想法吗?
【问题讨论】:
-
为什么要声明一个与它所在的函数同名的变量?
-
@K.Davis 在 VBA 中返回值不是这样吗?我尝试使用
Return关键字,但出现Expected: end of statement错误。根据stackoverflow.com/questions/2781689/… 上的 Dan 所说,我的做法是正确的。 -
没有。您已经将带有签名criticalDataIntact() 的返回类型声明为布尔值。如果您希望函数内部的局部布尔变量使用不同的名称,那么最后有criticalDataIntact = localBoolean ...。但我认为您可以简单地将上面的内容转换为criticalDataIntact = not(c1 = Null Or c2 = Null Or c3 = False)并且不需要 loca 变量
-
补充 QHarr 的评论:VBA 不使用
return将函数结果传递回调用过程。这是一种 .NET 框架做事的方式 (VB.NET)。相反,您将函数的名称设置为要在函数代码末尾传回(返回)的结果。与 QHarr 的最后一句话相反,我更喜欢/推荐一个局部变量并在最后传回。这更清晰,更不容易出错(在我看来)。