从VBA子系统中调用函数值

从VBA子系统中调用函数值,vba,excel,Vba,Excel,要求用户确定要保存某些文件的文件夹,然后将新工作簿保存到该文件夹。Sub调用将此文件夹路径设置为JobFolder的函数。从sub调用JobFolder文件夹路径时,sub会再次运行该函数。只需要JobFolder的值。多谢各位 Sub ExportJobFiles() 'Ask user to set job folder Dim JobFolder As String JobFolder = GetFolder() 'Ask user to set suffix f

要求用户确定要保存某些文件的文件夹,然后将新工作簿保存到该文件夹。Sub调用将此文件夹路径设置为JobFolder的函数。从sub调用JobFolder文件夹路径时,sub会再次运行该函数。只需要JobFolder的值。多谢各位

Sub ExportJobFiles()


'Ask user to set job folder

    Dim JobFolder As String
    JobFolder = GetFolder()


'Ask user to set suffix for file names

    Dim FileNameSuffix As Variant
    Dim Default As String

    Default = Worksheets("Summary").Range("E2").Value
    FileNameSuffix = InputBox("Input suffix for job files", , Default)


'Creates job files in job folder

    Dim SummaryFileName As String
    Dim AFileName As String
    Dim BFileName As String
    Dim CFileName As String

    SummaryFileName = JobFolder & "/Summary_" & FileNameSuffix & ".xls"
    AFileName = JobFolder & "/A_" & FileNameSuffix & ".xls"
    BFileName = JobFolder & "/B_" & FileNameSuffix & ".xls"
    CFileName = JobFolder & "/C_" & FileNameSuffix & ".xls"

    Workbooks.Add.SaveAs FileName:=SummaryFileName
    Workbooks.Add.SaveAs FileName:=AFileName
    Workbooks.Add.SaveAs FileName:=BFileName
    Workbooks.Add.SaveAs FileName:=CFileName

End Sub


Function GetFolder() As String

    With Application.FileDialog(msoFileDialogFolderPicker)
        .Title = "Select a Folder"
        .AllowMultiSelect = False
        .InitialFileName = ""
        .Show
        GetFolder = .SelectedItems(1)
    End With

End Function
这就是使用过时的显式调用语法调用函数并丢弃其返回值

基本上,这条线没有任何用处

相反,请声明一个局部变量:

Dim folder As String
并为其分配函数的返回值:

folder = JobFolder
同样,你也应该避免跳入或跳出方块

如果With块是这样写的:

With Application.FileDialog(msoFileDialogFolderPicker)
    '...
End With

然后跳出它将使With块持有的对象引用处于不确定状态。代码中没有出现这种情况的唯一原因是,您已经在with块之外引用了with块变量,并且正在手动销毁它。。。如果让With块处理引用,则不必使用该选项。

将返回值存储到变量中并使用该变量。不应使用GoTo跳出With块。只需调用JobFolder一次并将其存储在变量中。
With Application.FileDialog(msoFileDialogFolderPicker)
    '...
End With