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

时间:2016-01-29 19:27:12

标签: excel vba excel-vba arguments

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

现在,我正在使用一个小的子Refresh_Activesheet()来查看WorkSheets的名称,并根据该名称运行相应的子。大多数潜艇与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

1 个答案:

答案 0 :(得分:1)

问题在于这一行:

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子例程中使用传递的工作表变量。在这种情况下,您可以从声明中删除ws变量要求:

Sub Emission_Total()

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