gpt4 book ai didi

excel - 范围和变量范围之间的差异

转载 作者:行者123 更新时间:2023-12-02 10:21:24 27 4
gpt4 key购买 nike

我已经构建了一个类,需要将数据记录到单元格中。因此我编写了一个函数来执行此操作。代码如下:

Option Explicit

Private sName As String

Public Property Let Name(ByVal strValue As String)
sName = strValue
End Property
Public Property Get Name() As String
Name = sName
End Property

Public Function ItemToCell(ByRef tgtCell As Range)
tgtCell = sName
End Function

我还设置了一个按钮来触发此过程:

Private Sub CommandButton1_Click()
Dim tmpData As New MyClass
tmpData.Name = "Tom"

Dim tgtCell As Range
Set tgtCell = Worksheets("Sheet1").Range("A1")

'Method 1, this failed with error 424
tmpData.ItemToCell (tgtCell)

'Method 2, it works
tmpData.ItemToCell (Worksheets("Sheet1").Range("B1"))
End Sub

我以为这两种方法是一样的,但显然不是。为什么?变量 tgtCell 不是一个对象吗?

最佳答案

请注意,删除括号后的下面的方法 1A 确实可以按预期工作:

Public Sub CommandButton1_Click()
On Error GoTo EH
Dim tmpData As New MyClass
tmpData.Name = "Tom"

Dim tgtCell As Range
Set tgtCell = Worksheets("Sheet1").Range("A1")

'Method 1, this failed with error 424
tmpData.ItemToCell (tgtCell)

'Method 1A, this works
tmpData.ItemToCell tgtCell

'Method 2, it works
tmpData.ItemToCell (Worksheets("Sheet1").Range("B1"))
XT: Exit Sub
EH: MsgBox Err.Description, vbOKOnly, Err.Source
Resume Next
End Sub

出现困难是因为对 tmpData.ItemToCell调用需要左值(即它是 ByRef 参数),但调用语句不是函数调用,因此括号不是调用的括号,而是分组的括号。这在 VBA 中可能是一个令人困惑的问题。

分组括号的作用是返回变量tgtCell而不是它的存储位置 strong>,并隐式评估 Range 对象的默认成员 Value。然而,当您偶然发现方法 2 时,在某些情况下,VBA 不会隐式评估默认成员。是的,这让每个人都感到困惑;不要感到孤独。

减少这种烦恼发生的一种方法是显式地将 Functions 和 Subs(以及 Set/Let 属性)的参数指定为 ByVal,除非您确实希望将更改后的值传递回调用者。这获胜的原因是:

  • 消除了这种烦人功能的许多实例;
  • 当您将参数视为局部变量并更改其值时,消除了许多微妙的错误,希望这些更改在范围内是局部的,而实际上它们是非局部的。

但是,您的情况是极少数,这没有帮助。在这些情况下,最好不要在方法调用中添加括号,直到 VBA 提示缺少括号,这通常仅适用于函数而不是子函数和属性 setter /字母。

enter image description here

总结:
- 参数应显式指定为 ByVal(而不是默认的 ByRef),除非您确实要传回计算值(在这种情况下,Function 是更好的实现,通常就足够了)或者当语言要求您传递 ByRef 参数时.
- 仅当 VBA 提示缺少括号时,才应在方法调用中使用括号。

关于excel - 范围和变量范围之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46026553/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com