我有以下代码。
Sub AddValidation()
Dim ws, wsDefinitions As Worksheet
Set ws = ThisWorkbook.Worksheets("TData")
Set wsDefinitions = ThisWorkbook.Worksheets("Definitions")
Call AddValidator(ws, wsDefinitions, "FaultType", FaultTypeColumn)
End Sub
然后...
Sub AddValidator(targetWs As Worksheet, definitionsWs As Worksheet, definitionTableName As String, targetColumnNumber)
Dim definitionsRange As Range, targetRange As Range
Set definitionsRange = definitionsWs.ListObjects(definitionTableName).ListColumns(1).DataBodyRange
Set targetRange = targetWs.ListObjects("Table1").ListColumns(targetColumnNumber).DataBodyRange
With targetRange.Validation
.Delete 'delete previous validation
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
Formula1:="='" & definitionsWs.Name & "'!" & definitionsRange.Address
End With
End Sub
在编译过程中,AddValidator的第一个参数--"ws "得到 "ByRef参数类型不匹配"。
Sub AddValidator(ByVal targetWs As Worksheet, definitionsWs As Worksheet, definitionTableName As String, targetColumnNumber)
一切都能正常编译 AddValidator "宏的两个第一个参数都是工作表类型,但只有第一个参数是必须由Value传递的。
谁能告诉我为什么?
问题在于变量的声明。
Dim ws, wsDefinitions As Worksheet
这里是 ws
被宣布为 variant
而不像 sheet
对象,因此Excel会提示你更新参数。如果你解决了这个问题,那么Excel就不会出现错误。以下子项可以无误地工作。
Sub Test()
Dim ws1 As Worksheet, ws2 As Worksheet
Set ws1 = ThisWorkbook.Sheets("Sheet1")
Set ws2 = ThisWorkbook.Sheets("Sheet2")
mySub ws1, ws2
End Sub
Sub mySub(targetWS As Worksheet, sourceWS As Worksheet)
MsgBox targetWS.Name
MsgBox sourceWS.Name
End Sub