2017-10-16 34 views
0

當我嘗試運行一個子(下)時,我得到編譯錯誤:參數不是可選的,在行Set wb = getDensityTemplate()。任何人都可以向我解釋這個嗎?感謝Thomas Inzina爲我提供此代碼。「參數不可選」錯誤運行時

Public Sub MultipleParts() 
Dim vFiles As Variant, FileFullName As Variant 
Dim NextRow As Range, wb As Workbook 
Dim CalculationMode As XlCalculation 
CalculationMode = ToggleEvents(False, xlCalculationManual) 

vFiles = getFileList("C:\Users\OneDrive-CoorsTek\temp", "*.xls*") 
If UBound(vFiles) = -1 Then 
    MsgBox "No files found", vbInformation, "" 
    Exit Sub 
End If 

Set wb = getDensityTemplate() 

For Each FileFullName In vFiles 
    With wb.Worksheets(1) 
     'Add Header 
     .Range("A1:H1").Value = Array("FileName", "Description", "WaterTemp(C)", "WaterDensity(g/cc)", "PartID", "DryMass(g)", "SuspendedMass(g)", "Density(g/cc)") 
     'Target the next empty row 
     Set NextRow = .Range("A" & .Rows.Count).End(xlUp).Offset(1) 
     AddBatchCard CStr(FileFullName), NextRow 
    End With 
Next 

ToggleEvents True, CalculationMode 
End Sub 

還顯示了getDensityTemplate子。

Private Function getDensityTemplate(FilePath As String) As Workbook 
Dim SheetsInNewWorkbook As Integer 
Dim wb As Workbook 
SheetsInNewWorkbook = Application.SheetsInNewWorkbook 
Application.SheetsInNewWorkbook = 1 

Set wb = Workbooks.Add(xlWBATWorksheet) 
wb.Worksheets(1).Name = "Density" 
wb.SaveAs FileName:=FilePath & "DensitySummary" & Format(Now, "yyyy_mm_dd_hh.mm") 
Set getDensityTemplate = wb 

端功能

+0

看起來像它缺少變量...你可以更新列出的getDensityTemplate子你的問題 – ShanayL

+1

你可以發佈getDensityTemplate的代碼嗎? – jcarroll

+1

根據這個頁面,你似乎需要爲它的文件路徑傳遞一個字符串。 https://stackoverflow.com/questions/46718110/create-separate-row-for-each-item-when-merging-multiple-workbooks – newacc2240

回答

2

如果這是你的方法的簽名:

Private Function getDensityTemplate(FilePath As String) As Workbook 

然後FilePath說法是不可選的,因此必須在調用點的代碼編譯提供。

Set wb = getDensityTemplate("c:\dev\excel\...\somefile.xlsx") 

或無論FilePath需要。

當你調用一個參數化的過程中,無論是SubFunction,或Property,必須在調用位置按順序指定呼叫所有非可選參數是有效的。

Sub Test() 
    DoSomething 42 'illegal: arg2 is missing 
End Sub 

Sub DoSomething(ByVal arg1 As Long, ByVal arg2 As String) 
    'do something 
End Sub 

可以跳過指定參數的唯一時間是當參數是可選,例如:

Sub DoSomething(ByVal arg1 As Long, Optional ByVal arg2 As String = "SomeDefault") 
    'do something 
End Sub 

在這種情況下,與可選的參數的過程會以這樣的方式來實現該它可以處理未指定的參數。如果您正在實施帶有可選參數的過程,可以驗證是否使用IsMissing功能是提供一個Variant參數:

Sub DoSomething(ByVal arg1 As Long, Optional ByVal arg2 As Variant) 
    If IsMissing(arg2) Then 
     'arg2 was not supplied and has no value 
    Else 
     'arg2 was supplied 
    End If 
End Sub