Excel VBA ByRef参数类型不匹配是否不一致?

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)

我正在用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)
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
      ?谢谢你的写作,它确实为我澄清了一些事情