我遇到了问题:
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不匹配错误?
答案 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