Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 为什么子例程的第一个参数必须通过VAL传递_Excel_Vba - Fatal编程技术网

Excel 为什么子例程的第一个参数必须通过VAL传递

Excel 为什么子例程的第一个参数必须通过VAL传递,excel,vba,Excel,Vba,我有以下代码: Sub AddValidation() Dim ws, wsDefinitions As Worksheet Set ws = ThisWorkbook.Worksheets("TData") Set wsDefinitions = ThisWorkbook.Worksheets("Definitions") Call AddValidator(ws, wsDefinitions, "FaultType", FaultTypeColumn) End Su

我有以下代码:

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

在编译过程中,我得到AddValidator-ws的第一个参数的ByRef参数类型missmatch。 将ByVal添加到定义中时:

Sub AddValidator(ByVal targetWs As Worksheet, definitionsWs As Worksheet, definitionTableName As String, targetColumnNumber)
一切都很好。AddValidator宏的两个第一个参数是工作表类型,但只需要通过值传递第一个参数


有人能告诉我为什么吗?

问题在于变量的声明

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

尝试声明这两种变量类型:Dim ws作为工作表,wsDefinitions作为工作表。非常感谢。这就是答案。我认为Dim var1、var2作为工作表将两个变量都声明为工作表,但显然不是。我的过错和误解。
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