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 在动态目录路径中生成新工作簿的主要内容,如果未能解决你的问题,请参考以下文章