Excel 在动态目录路径中生成新工作簿

Posted

技术标签:

【中文标题】Excel 在动态目录路径中生成新工作簿【英文标题】:Excel Generate New Workbook in a dynamic directory Path 【发布时间】:2015-12-18 11:16:48 【问题描述】:

我正在使用根据所选国家/地区生成报告的工作簿。每个国家都使用特定的路径目录。

当涉及到从他们的根文件夹导入信息时,没问题。

我的问题是当我生成带有报告的新工作簿时。我尝试将其保存在随国家/地区变化的特定位置:

'Generate a new workbook refering to the first Worksheet
 Set WkReport = Workbooks.Add(xlWBATWorksheet)
 With WkReport
 // Skip selecting the sheet, just reference it explicitly and copy it      after//
 // the blank sheet in the new wb.
ThisWorkbook.Worksheets("REPORT").Copy after:=.Worksheets(.Worksheets.Count)
End With
// Kill alerts, delete the blank sheet in the new wb and turn alerts back on//
Application.DisplayAlerts = False

With WkReport

.SaveAs Filename:="L:\Fold1\Fold2\Fold3\" & rngFolder & "\" & rngYear & "\" & rngMonth &"\"& rngName & "_Report_" & rngDate & ".xlsx"

End With

Application.DisplayAlerts = True'`enter code here`
L:\Fold1\Fold2\Fold3:固定路径 rngFolder 是国家的路径 rngYear 是 Country 中子文件夹的路径 rngMonth 是年中子文件夹的路径

(rngSmthing 是指工作簿中单元格的范围)

所有这些都是根据用户介绍的信息而变化的动态范围。

因此,当我创建工作簿时,必须根据此信息将其保存在不同的位置。

文件名包含另一个动态范围“rngName”,后跟 Report 和“rngDate”: 文件名 = rngName_Report_rngDate.xlsx

我的代码所做的是将文件名 Report.xlsx

保存在 L:\Fold1\Fold2\Fold3 中

用户选择的路径目录示例... 德国: L:Folder1\Folder2\Folder3\Germany\2015\06-2015\GE_Report_31-06-15.xlsx 匈牙利: L:Folder1\Folder2\Folder3\Hungary\2015\06_2015\HU_Report_31-06-15.xlsx

!问题解决了!我只是忘了设置 rngSmthng 变量...(Clap Clap)无论如何,如果您想根据您的范围设置不同的保存路径,有人可能会发现它很有用:

'cellRef is a named cell within the workbook where user selects data
rngName = ws.Range("cellRef").Value

这样你就有了一个动态路径查找器。

【问题讨论】:

文件名中使用的所有变量是否都返回有效值?例如rngDate 是否包含文件名的任何非法字符?正如@Kathara 所说 - 您需要即时创建文件夹吗? 嗨,Darren,所有变量都可以正常工作(我使用相同的变量打开文件夹路径并找到要导入数据的文件)。我虽然相同的代码将打开相同的文件,而不是打开文件可以保存它。文件路径示例:L;Folder1\Folder2\Folder3\Germany\2015\06-2015\GE_Report_31-03-15.xlsx 不应该是:L:\Folder1\Folder2\Folder3\Germany\2015\06-2015\GE_Report_31-03-15.xlsx 还是 ; 是错字? 快速回复错字:很抱歉 【参考方案1】:

很高兴您找到了答案。作为旁注 - 这就是我编写程序的方式。

Sub Test()

    Dim wkReport As Workbook
    Dim sFolder As String
    Dim sPath As String
    Dim rngFolder As Range
    Dim rngName As Range

    With ThisWorkbook.Worksheets("Sheet1")
        Set rngFolder = .Range("A1")
        Set rngName = .Range("A2")
    End With

    sFolder = "L:\Fold1\Fold2\Fold3\" & rngFolder & "\" & Format(Date, "yyyy\\mm mmm\\")
    CreateFolder sFolder

    sPath = sFolder & rngName & "_Report_" & Format(Date, "dd-mm-yy") & ".xlsx"

    Set wkReport = Workbooks.Add(xlWBATWorksheet)
    With wkReport
        ThisWorkbook.Worksheets("REPORT").Copy after:=.Worksheets(.Worksheets.Count)
        .Worksheets(1).Delete
        .SaveAs sPath, ThisWorkbook.FileFormat
    End With

End Sub

' Purpose   : Will Recursively Build A Directory Tree
Sub CreateFolder(Folder)
On Error Resume Next
Dim objFSO As Object: Set objFSO = CreateObject("Scripting.FileSystemObject")
    If Folder <> "" Then
        If Not objFSO.FileExists(objFSO.GetParentFolderName(Folder)) Then
            Call CreateFolder(objFSO.GetParentFolderName(Folder))
        End If
        objFSO.CreateFolder (Folder)
    End If
End Sub

注意:Format(Date, "yyyy\\mm mmm\\") 将返回 2015\12 Dec\Format(Date, "yyyy\mm mmm\") 将返回 2015m12 Dec

【讨论】:

非常感谢 Darren 在适当的编码中引入了您的知识 :) 我从中学到了一些东西!真的很感激!【参考方案2】:

真的对不起各位... 非常感谢您的帮助...您绝对猜不到。

问题是我将这些变量设置在不同的宏中,我完全忘记了......所以它当然不能识别变量..因为我没有在这个宏中创建它们!!

再次道歉,我应该在发布之前检查我的代码两次

【讨论】:

以上是关于Excel 在动态目录路径中生成新工作簿的主要内容,如果未能解决你的问题,请参考以下文章

如何获取当前打开的excel工作簿的本地路径?

python 创建 Excel 工作簿和工作表

python 创建 Excel 工作簿和工作表

插上翅膀,让Excel飞起来——xlwings

如何使用 VB.NET 将 Excel 工作簿保存到一般路径中

Excel多个文件合并到一个工作簿里