编译错误:调用sub时参数不可选

所以,虽然我在这里读了一些关于类似错误的很多问题,到目前为止我还没有find一个帮助我理解我的问题。 如果他们是一个类似的问题,并有适当的答案,请链接,我将删除这一个。

现在,我使用一个小的子Refresh_Activesheet()来查看WorkSheet的名称,并根据该名称运行相应的子。 大部分的Refresh_Activesheet()Refresh_Activesheet()在同一个模块中。 不过,目前有两个单独的模块。 现在的问题是,当我运行Refresh_Activesheet vba返回参数不是可选错误,我不明白为什么。

Refresh_Activesheet

 Sub Refresh_Activesheet() If IsNumeric(Left(ActiveSheet.Name, 1)) Then Emissions_Calculation ElseIf ActiveSheet.Name = "Voyages List" Then Refresh_Table ElseIf ActiveSheet.Name = "Émission Total" Then Call Refresh_Emissions.Emission_Total ElseIf ActiveSheet.Name = "Consommation Total" Then Exit Sub End If End Sub 

Refresh_Emissions是包含Emission_Total的模块

 Option Explicit Option Base 1 Public j, i, k, n, m, p, l, info, mation, Total As Variant Public AverageEmission, TotalEmission As String Sub Emission_Total(ByVal ws As Worksheet) Application.ScreenUpdating = False On Error Resume Next Dim SoxRevenue, SoxGross, MilesTotal, MilesLaden, CargoMT As Double ThisWorkbook.Sheets("Émission total").Range("A7 : M200").Clear j = 7 k = 1 For Each ws In ActiveWorkbook.Sheets If IsNumeric(Left(ws.Name, 1)) Then ws.Unprotect ("12345") ThisWorkbook.Sheets("Émission Total").Range("A" & j).Value = ws.Range("C5").Value ThisWorkbook.Sheets("Émission Total").Range("B" & j).Value = ws.Range("T2").Value ThisWorkbook.Sheets("Émission Total").Range("C" & j).Value = ws.Range("T3").Value ThisWorkbook.Sheets("Émission Total").Range("D" & j).Value = ws.Range("G2").Value ThisWorkbook.Sheets("Émission Total").Range("E" & j).Value = ws.Range("J2").Value info = ThisWorkbook.Sheets("Émission total").Range("F7 : M200").Address mation = ws.Range("D6:D8").Address SoxRevenue = WorksheetFunction.Sum(ws.Range("V28:V30").Value) SoxGross = ws.Range("V43").Value MilesLaden = ws.Range("M4").Value MilesTotal = ws.Range("M6").Value CargoMT = ws.Range("O5").Value With ThisWorkbook.Sheets("Émission total").Range(info) If (ws.Range(mation).Cells(1, 1).Value) = "" Then .Cells(k, 1).Value = ws.Range("W49").Value .Cells(k, 2).Value = ws.Range("W50").Value .Cells(k, 3).Value = ws.Range("W54").Value .Cells(k, 4).Value = ws.Range("W56").Value .Cells(k, 5).Value = ws.Range("V43").Value .Cells(k, 6).Value = SoxRevenue .Cells(k, 7).Value = SoxGross * 1.852 * 1000 * 1000 / (CargoMT * MilesTotal) .Cells(k, 8).Value = SoxRevenue * 1.852 * 1000 * 1000 / (CargoMT * MilesLaden) .Cells(k, 1).NumberFormat = "?0.00" .Cells(k, 2).NumberFormat = "?0.00" .Cells(k, 3).NumberFormat = "?0.00" .Cells(k, 4).NumberFormat = "?0.00" .Cells(k, 5).NumberFormat = "?0.0000" .Cells(k, 6).NumberFormat = "?0.0000" .Cells(k, 7).NumberFormat = "?0.0000" .Cells(k, 8).NumberFormat = "?0.0000" ElseIf (ws.Range(mation).Cells(1, 1).Value) = 0 Then .Cells(k, 1).Value = ws.Range("W49").Value .Cells(k, 2).Value = ws.Range("W50").Value .Cells(k, 3).Value = 0 .Cells(k, 4).Value = 0 .Cells(k, 5).Value = ws.Range("V43").Value .Cells(k, 6).Value = ws.Range("V43").Value .Cells(k, 7).Value = 0 .Cells(k, 8).Value = 0 .Cells(k, 1).NumberFormat = "?0.00" .Cells(k, 2).NumberFormat = "?0.00" .Cells(k, 3).NumberFormat = "?0.00" .Cells(k, 4).NumberFormat = "?0.00" .Cells(k, 5).NumberFormat = "?0.0000" .Cells(k, 6).NumberFormat = "?0.0000" .Cells(k, 7).NumberFormat = "?0.0000" .Cells(k, 8).NumberFormat = "?0.0000" ElseIf (ws.Range(mation).Cells(2, 1).Value) = 0 And (ws.Range(mation).Cells(3, 1).Value) = 0 Then .Cells(k, 1).Value = ws.Range("W49").Value .Cells(k, 2).Value = ws.Range("W50").Value .Cells(k, 3).Value = (ws.Range("W49").Value) / ((ws.Range(mation).Cells(1, 1).Value) * ((ws.Range(mation).Cells(2, 1).Value) + (ws.Range(mation).Cells(3, 1).Value))) * 1000 * 1000 / 1.853 .Cells(k, 4).Value = 0 .Cells(k, 5).Value = ws.Range("V43").Value .Cells(k, 6).Value = ws.Range("V43").Value .Cells(k, 7).Value = (ws.Range("V43").Value) / ((ws.Range(mation).Cells(1, 1).Value) * ((ws.Range(mation).Cells(2, 1).Value) + (ws.Range(mation).Cells(3, 1).Value))) * 1000 * 1000 / 1.853 .Cells(k, 8).Value = 0 .Cells(k, 1).NumberFormat = "?0.00" .Cells(k, 2).NumberFormat = "?0.00" .Cells(k, 3).NumberFormat = "?0.00" .Cells(k, 4).NumberFormat = "?0.00" .Cells(k, 5).NumberFormat = "?0.0000" .Cells(k, 6).NumberFormat = "?0.0000" .Cells(k, 7).NumberFormat = "?0.0000" .Cells(k, 8).NumberFormat = "?0.0000" ElseIf (ws.Range(mation).Cells(2, 1).Value) = "" And (ws.Range(mation).Cells(3, 1).Value) = "" Then .Cells(k, 1).Value = ws.Range("W49").Value .Cells(k, 2).Value = ws.Range("W50").Value .Cells(k, 3).Value = (ws.Range("W49").Value) / ((ws.Range(mation).Cells(1, 1).Value) * ((ws.Range(mation).Cells(2, 1).Value) + (ws.Range(mation).Cells(3, 1).Value))) * 1000 * 1000 / 1.853 .Cells(k, 4).Value = 0 .Cells(k, 5).Value = ws.Range("V43").Value .Cells(k, 6).Value = ws.Range("V43").Value .Cells(k, 7).Value = (ws.Range("V43").Value) / ((ws.Range(mation).Cells(1, 1).Value) * ((ws.Range(mation).Cells(2, 1).Value) + (ws.Range(mation).Cells(3, 1).Value))) * 1000 * 1000 / 1.853 .Cells(k, 8).Value = 0 .Cells(k, 1).NumberFormat = "?0.00" .Cells(k, 2).NumberFormat = "?0.00" .Cells(k, 3).NumberFormat = "?0.00" .Cells(k, 4).NumberFormat = "?0.00" .Cells(k, 5).NumberFormat = "?0.0000" .Cells(k, 6).NumberFormat = "?0.0000" .Cells(k, 7).NumberFormat = "?0.0000" .Cells(k, 8).NumberFormat = "?0.0000" Else .Cells(k, 1).Value = ws.Range("W49").Value .Cells(k, 2).Value = ws.Range("W50").Value .Cells(k, 3).Value = (ws.Range("W49").Value) / ((ws.Range(mation).Cells(1, 1).Value) * ((ws.Range(mation).Cells(2, 1).Value) + (ws.Range(mation).Cells(3, 1).Value))) * 1000 * 1000 / 1.853 .Cells(k, 4).Value = (ws.Range("W50").Value) / ((ws.Range(mation).Cells(1, 1).Value) * ((ws.Range(mation).Cells(2, 1).Value))) * 1000 * 1000 / 1.853 .Cells(k, 5).Value = ws.Range("V43").Value .Cells(k, 6).Value = ws.Range("V43").Value .Cells(k, 7).Value = (ws.Range("V43").Value) / ((ws.Range(mation).Cells(1, 1).Value) * ((ws.Range(mation).Cells(2, 1).Value) + (ws.Range(mation).Cells(3, 1).Value))) * 1000 * 1000 / 1.853 .Cells(k, 8).Value = (ws.Range("V43").Value) / ((ws.Range(mation).Cells(1, 1).Value) * ((ws.Range(mation).Cells(2, 1).Value))) * 1000 * 1000 / 1.853 .Cells(k, 1).NumberFormat = "?0.00" .Cells(k, 2).NumberFormat = "?0.00" .Cells(k, 3).NumberFormat = "?0.00" .Cells(k, 4).NumberFormat = "?0.00" .Cells(k, 5).NumberFormat = "?0.0000" .Cells(k, 6).NumberFormat = "?0.0000" .Cells(k, 7).NumberFormat = "?0.0000" .Cells(k, 8).NumberFormat = "?0.0000" End If End With k = k + 1 j = j + 1 ws.Protect ("12345") ElseIf ws.Name = "Émission total" Then ws.Unprotect ("12345") End If Next ws k = k + 7 p = k - 1 ThisWorkbook.Sheets("Émission total").Range("D" & k).Value = "AverageEmission" ThisWorkbook.Sheets("Émission total").Range("F" & k).Value = Application.Average(ThisWorkbook.Sheets("Émission total").Range("F7 : F" & p)) ThisWorkbook.Sheets("Émission total").Range("G" & k).Value = Application.Average(ThisWorkbook.Sheets("Émission total").Range("G7 : G" & p)) ThisWorkbook.Sheets("Émission total").Range("H" & k).Value = Application.Average(ThisWorkbook.Sheets("Émission total").Range("H7 : H" & p)) ThisWorkbook.Sheets("Émission total").Range("I" & k).Value = Application.Average(ThisWorkbook.Sheets("Émission total").Range("I7 : I" & p)) ThisWorkbook.Sheets("Émission total").Range("J" & k).Value = Application.Average(ThisWorkbook.Sheets("Émission total").Range("J7 : J" & p)) ThisWorkbook.Sheets("Émission total").Range("K" & k).Value = Application.Average(ThisWorkbook.Sheets("Émission total").Range("K7 : K" & p)) ThisWorkbook.Sheets("Émission total").Range("L" & k).Value = Application.Average(ThisWorkbook.Sheets("Émission total").Range("L7 : L" & p)) ThisWorkbook.Sheets("Émission total").Range("M" & k).Value = Application.Average(ThisWorkbook.Sheets("Émission total").Range("M7 : M" & p)) ThisWorkbook.Sheets("Émission total").Range("F" & k).NumberFormat = "?0.00" ThisWorkbook.Sheets("Émission total").Range("G" & k).NumberFormat = "?0.00" ThisWorkbook.Sheets("Émission total").Range("H" & k).NumberFormat = "?0.00" ThisWorkbook.Sheets("Émission total").Range("I" & k).NumberFormat = "?0.00" ThisWorkbook.Sheets("Émission total").Range("J" & k).NumberFormat = "?0.0000" ThisWorkbook.Sheets("Émission total").Range("K" & k).NumberFormat = "?0.0000" ThisWorkbook.Sheets("Émission total").Range("L" & k).NumberFormat = "?0.0000" ThisWorkbook.Sheets("Émission total").Range("M" & k).NumberFormat = "?0.0000" l = k + 2 ThisWorkbook.Sheets("Émission total").Range("D" & l).Value = "TotalEmission" ThisWorkbook.Sheets("Émission total").Range("F" & l).Value = Application.Sum(ThisWorkbook.Sheets("Émission total").Range("F7 : F" & p)) ThisWorkbook.Sheets("Émission total").Range("G" & l).Value = Application.Sum(ThisWorkbook.Sheets("Émission total").Range("G7 : G" & p)) ThisWorkbook.Sheets("Émission total").Range("H" & l).Value = Application.Sum(ThisWorkbook.Sheets("Émission total").Range("H7 : H" & p)) ThisWorkbook.Sheets("Émission total").Range("I" & l).Value = Application.Sum(ThisWorkbook.Sheets("Émission total").Range("I7 : I" & p)) ThisWorkbook.Sheets("Émission total").Range("J" & l).Value = Application.Sum(ThisWorkbook.Sheets("Émission total").Range("J7 : J" & p)) ThisWorkbook.Sheets("Émission total").Range("K" & l).Value = Application.Sum(ThisWorkbook.Sheets("Émission total").Range("K7 : K" & p)) ThisWorkbook.Sheets("Émission total").Range("L" & l).Value = Application.Sum(ThisWorkbook.Sheets("Émission total").Range("L7 : L" & p)) ThisWorkbook.Sheets("Émission total").Range("M" & l).Value = Application.Sum(ThisWorkbook.Sheets("Émission total").Range("M7 : M" & p)) ThisWorkbook.Sheets("Émission total").Range("F" & l).NumberFormat = "?0.00" ThisWorkbook.Sheets("Émission total").Range("G" & l).NumberFormat = "?0.00" ThisWorkbook.Sheets("Émission total").Range("H" & l).NumberFormat = "?0.00" ThisWorkbook.Sheets("Émission total").Range("I" & l).NumberFormat = "?0.00" ThisWorkbook.Sheets("Émission total").Range("J" & l).NumberFormat = "?0.0000" ThisWorkbook.Sheets("Émission total").Range("K" & l).NumberFormat = "?0.0000" ThisWorkbook.Sheets("Émission total").Range("L" & l).NumberFormat = "?0.0000" ThisWorkbook.Sheets("Émission total").Range("M" & l).NumberFormat = "?0.0000" ThisWorkbook.Sheets("Émission Total").Protect ("12345") ThisWorkbook.Protect ("12345") Application.ScreenUpdating = True End Sub 

问题是这一行:

 Call Refresh_Emissions.Emission_Total 

在这一行中,你不提供一个参数。 但Emission_Total子例程要求提供一个工作表对象作为参数,如其声明所示:

 Sub Emission_Total(ByVal ws As Worksheet) 

看起来您正在根据工作表名称调用不同的子例程,所以我猜测您只是想发送与调用相匹配的工作表,在这种情况下:

 Sub Refresh_Activesheet() If IsNumeric(Left(ActiveSheet.Name, 1)) Then Emissions_Calculation ElseIf ActiveSheet.Name = "Voyages List" Then Refresh_Table ElseIf ActiveSheet.Name = "Émission Total" Then Call Refresh_Emissions.Emission_Total(ActiveSheet) 'Note I added the worksheet as an argument here ElseIf ActiveSheet.Name = "Consommation Total" Then Exit Sub End If End Sub 

编辑 ︰看你的发布的代码更多,它看起来像你永远不会在Emission_Total子例程中使用传递的工作表variables。 在这种情况下,您可以从声明中删除wsvariables要求:

 Sub Emission_Total() 

然后留下您最初发布的Refresh_Activesheet代码。