Excel VBA ByRef参数类型不匹配是否不一致?
我正在用VBA编写一个简短的脚本,它可以打印和比较不同单元格中的时间戳。代码运行良好,但我对“ByRef arugement类型不匹配”的不一致性感到困惑。我的代码如下Excel VBA ByRef参数类型不匹配是否不一致?,excel,vba,byref,Excel,Vba,Byref,我正在用VBA编写一个简短的脚本,它可以打印和比较不同单元格中的时间戳。代码运行良好,但我对“ByRef arugement类型不匹配”的不一致性感到困惑。我的代码如下 Function nextrow() With ActiveSheet nextrow = .Cells(.Rows.Count, "A").End(xlUp).Row + 1 End With End Function ____ Private Sub buttonclick(nr As Integer)
Function nextrow()
With ActiveSheet
nextrow = .Cells(.Rows.Count, "A").End(xlUp).Row + 1
End With
End Function
____
Private Sub buttonclick(nr As Integer)
With ActiveSheet
.Cells(nr, 2) = Now
If nr = 2 Then Exit Sub
dur = .Cells(nr, 2) - .Cells(nr - 1, 2)
.Cells(nr - 1, 3) = dur
End With
End Sub
____
Private Sub distract2()
nr = nextrow
If nr = 2 Then Exit Sub
buttonclick nr - 1
End Sub
如果您查看2
,您会注意到我没有将nr定义为整数,但即使如此,它也会毫无问题地传递到按钮单击
但是,当我从after nr中删除-1
时,VBA会抛出ByRef错误
两个问题:
- 有人知道为什么会这样吗
- 将nr设置为整数是否更好
由于您处理的是行,因此建议使用
Long
而不是Integer
。您得到该错误是因为在私有子按钮单击(nr为整数)
时,它需要一个整数
,而您正在传递一个变量
将私有子按钮单击(nr为整数)
更改为私有子按钮单击(nr为长)
用这个
Private Sub distract2()
Dim nr As Long
Dim nVal As Long
nr = nextrow
If nr = 2 Then Exit Sub
nVal = nr - 1
buttonclick nVal
End Sub
但是,当我从after nr中删除-1时,VBA会抛出ByRef错误。
两个问题:
有人知道为什么会这样吗?
将nr设置为整数是否更好
当您保持-1
时,它将值减去1
,结果为整数类型,因此不会出现错误。如果nr
为104857
,则会给出一个错误
是的,最好将变量设置为相关数据类型。但是,在您的情况下,它应该是Long
,而不是上面提到的Integer
您的完整代码可以写成
Option Explicit
Private Sub distract2()
Dim nr As Long
Dim nVal As Long
nr = nextrow
If nr = 2 Then Exit Sub
nVal = nr - 1
buttonclick nVal
End Sub
Function nextrow() As Long
With ActiveSheet
nextrow = .Cells(.Rows.Count, "A").End(xlUp).Row + 1
End With
End Function
Private Sub buttonclick(nr As Long)
With ActiveSheet
.Cells(nr, 2) = Now
If nr = 2 Then Exit Sub
.Cells(nr - 1, 3) = .Cells(nr, 2) - .Cells(nr - 1, 2)
End With
End Sub
您应该始终将选项Explicit
放在每个代码模块的顶部。您应该始终Dim
使用的每个变量。除此之外,在*将任何内容传递给
button单击之前,请尝试单击(nr-1)执行计算*,并查看这是否有帮助。如果没有,请在按钮单击行之前输入一行
nr=nr-1`。您的函数nextrow
不会返回一个值,即函数的定义。所以它实际上是一个sub.nr
永远不会等于任何东西。@Cindy,谢谢你的提示@猫猫,这是一个很好的观点。如果我改变了它,你认为我还需要调暗nr
?谢谢你的写作,它确实为我澄清了一些事情