返回值时编译错误

时间:2018-04-12 17:29:45

标签: excel vba excel-vba compiler-errors

我遇到了问题:

    Public Sub ChangeRow(Column As String, Value As String, id As Integer)
For i = 4 To 15
    For Each rw In Worksheets(i).Rows
        If Worksheets(i).Range("A" & rw.row).Value = id Then
        Dim row As Integer
        **row = getRow(id, i)**
        MsgBox (row)

            If Worksheets(i).Range(Column & rw.row).Value <> Value Then
                Worksheets(i).Range(Column & rw.row) = Value
            End If
            Exit For
        End If
    Next rw
Next i
End Sub

Function getRow(id As Integer, Sheet As Integer) As Integer
    For Each rw In Worksheets(Sheet).Rows
        If Worksheets(Sheet).Range("A" & rw.row).Value = id Then
            getRow = rw.row
        End If
    Next rw
End Function

更改行工作正常......当我向混合添加'row = getRow(id,i)'时它会抛出一个ByRef不匹配错误?

2 个答案:

答案 0 :(得分:1)

这是一个很好的例子,说明为什么使用Option Explicit是一种很好的做法。

Option Explicit添加到宏外的工作表模块的最顶层

这会强制您声明您的潜艇中使用的所有变量,并且还可以帮助捕获变量名称中的拼写错误。

这会捕获i未声明。因此,默认情况下,VBA / Excel会将i设置为Variant

然后,当您点击row = getRow(id, i)时,您基本上会通过row = getRow([integer], [Variant])。但是该子预期getRow([integer],[integer]) ...因此您的Type Mismatch错误。

因此,如上所述,只需Dim i as Integer子行顶部的ChangeRow

(或者,对于长期运行的VBA使用Long而不是Integer)。

答案 1 :(得分:-1)

在函数中,您需要将“Sheet”声明为Worksheet对象

Function getRow(id As Integer, Sheet As Worksheet) As Integer