为什么子程序的第一个参数必须通过 ByVal

问题描述 投票:0回答:1

我有以下代码。

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传递的。

谁能告诉我为什么?

excel vba
1个回答
4
投票

问题在于变量的声明。

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
© www.soinside.com 2019 - 2024. All rights reserved.