VBA: 如何获取(更多)动态文件名?
VBA: How to get a (more) dynamic file name?
所以我有一个当前可用的 VBA 脚本。我只想编辑循环保存文件的名称。
我将简要描述一下它目前正在做什么。基本上它为定义的行范围循环一组操作,这里 A2:A72
。这是一个完成此循环的 'main' 工作簿,也是收集所有输入数据的地方。每行都是一个单独的主题的输入数据,并且 copy/pasted 到不同工作簿中的模板中。然后求解器 运行 调整给定输入数据的模板。然后它将文件保存并命名为复制粘贴行的第一个单元格中的文本。 (即 A2
、A3
、A4
等。)然后它会为每一行循环此操作,每一行都会设置并单独保存自己的模板。
这几乎就是我理想中希望它工作的方式。
我只想将文件名保存为 A2
,而是 =C2&" - "&A2
我尝试使用某人推荐的这个
fName = Range("C" & c.Row) & Range("A" & c.Row)
但是当我尝试时,我会收到方法 SaveAs 错误。在手表视图中,我可以看到这是因为它没有读取 fName,所以它只是脚本值中的文件路径。我将其改回 c.Value 然后通过将文件命名为 A 列单元格开始工作。不可否认,我真的不明白 c.Value 是如何返回 A 列的,这让我更难弄清楚如何修改它以获得我想要的内容。
无论如何,这是我目前拥有的脚本:
Sub RunModels()
Dim fPath As String
Dim strTemplate As String
Dim fName As String
Dim wb As Workbook
Dim c As Range
Dim rngLoop As Range
'Where will files get stored?
fPath = "H:\ACQUISITIONS\Personal (D-AP)\Gmo\ALL MF"
'Where is the template file?
strTemplate = "H:\ACQUISITIONS\Personal (D-AP)\Gmo\ALL MF\Garden Grove - 11121 Chapman Ave.xlsm"
'Error check
If Right(fPath, 1) <Application.PathSeparator Then
fPath = fPath & Application.PathSeparator
End If
Application.ScreenUpdating = False
'Set Loop
Set rngLoop = ThisWorkbook.Worksheets("Sheet1").Range("A2:A72")
'Set Looped Actions
For Each c In rngLoop.Cells
'Open the template file
Set wb = Workbooks.Open(strTemplate)
'Add some data to the template file
c.EntireRow.Copy Destination:=wb.Worksheets("Insert
Sheet").Range("A2")
SolverOk SetCell:="$H", MaxMinVal:=3, ValueOf:=1.2, ByChange:="$F", Engine:=1, EngineDesc:="GRG Nonlinear"
SolverSolve
'Dynamic File Naming
fName = c.Value
'Save the file and close
wb.SaveAs Filename:=wb.Path & Application.PathSeparator & fName
wb.Close
Next c
Application.ScreenUpdating = True
End Sub
非常感谢大家的帮助!!
代码将变量 c 依次分配给范围 A2:A72 中的每个单元格 - 因此目前它正在保存代码 71 次。代码
fName = Range("C" & c.Row) & Range("A" & c.Row)
会在第一次通过时产生 c2 & A2,然后在第二次产生 C3 & A3(依此类推。我怀疑你希望它始终使用 c2,然后在 A 中添加值 - 其中如果你需要
Fname = Range("C2") & "- " & c
你不应该使用 wb.Path
wb
分配给工作簿,其中 fPath
是你的文件夹路径,所以使用:
Filename:=fPath & "\" & fName & ".xlsx"
或根据需要“.xlsm”。
要分配 fName
使用:
fName = c.Offset(, 2).Value & " - " & c.Value
所以我有一个当前可用的 VBA 脚本。我只想编辑循环保存文件的名称。
我将简要描述一下它目前正在做什么。基本上它为定义的行范围循环一组操作,这里 A2:A72
。这是一个完成此循环的 'main' 工作簿,也是收集所有输入数据的地方。每行都是一个单独的主题的输入数据,并且 copy/pasted 到不同工作簿中的模板中。然后求解器 运行 调整给定输入数据的模板。然后它将文件保存并命名为复制粘贴行的第一个单元格中的文本。 (即 A2
、A3
、A4
等。)然后它会为每一行循环此操作,每一行都会设置并单独保存自己的模板。
这几乎就是我理想中希望它工作的方式。
我只想将文件名保存为 A2
,而是 =C2&" - "&A2
我尝试使用某人推荐的这个
fName = Range("C" & c.Row) & Range("A" & c.Row)
但是当我尝试时,我会收到方法 SaveAs 错误。在手表视图中,我可以看到这是因为它没有读取 fName,所以它只是脚本值中的文件路径。我将其改回 c.Value 然后通过将文件命名为 A 列单元格开始工作。不可否认,我真的不明白 c.Value 是如何返回 A 列的,这让我更难弄清楚如何修改它以获得我想要的内容。
无论如何,这是我目前拥有的脚本:
Sub RunModels()
Dim fPath As String
Dim strTemplate As String
Dim fName As String
Dim wb As Workbook
Dim c As Range
Dim rngLoop As Range
'Where will files get stored?
fPath = "H:\ACQUISITIONS\Personal (D-AP)\Gmo\ALL MF"
'Where is the template file?
strTemplate = "H:\ACQUISITIONS\Personal (D-AP)\Gmo\ALL MF\Garden Grove - 11121 Chapman Ave.xlsm"
'Error check
If Right(fPath, 1) <Application.PathSeparator Then
fPath = fPath & Application.PathSeparator
End If
Application.ScreenUpdating = False
'Set Loop
Set rngLoop = ThisWorkbook.Worksheets("Sheet1").Range("A2:A72")
'Set Looped Actions
For Each c In rngLoop.Cells
'Open the template file
Set wb = Workbooks.Open(strTemplate)
'Add some data to the template file
c.EntireRow.Copy Destination:=wb.Worksheets("Insert
Sheet").Range("A2")
SolverOk SetCell:="$H", MaxMinVal:=3, ValueOf:=1.2, ByChange:="$F", Engine:=1, EngineDesc:="GRG Nonlinear"
SolverSolve
'Dynamic File Naming
fName = c.Value
'Save the file and close
wb.SaveAs Filename:=wb.Path & Application.PathSeparator & fName
wb.Close
Next c
Application.ScreenUpdating = True
End Sub
非常感谢大家的帮助!!
代码将变量 c 依次分配给范围 A2:A72 中的每个单元格 - 因此目前它正在保存代码 71 次。代码
fName = Range("C" & c.Row) & Range("A" & c.Row)
会在第一次通过时产生 c2 & A2,然后在第二次产生 C3 & A3(依此类推。我怀疑你希望它始终使用 c2,然后在 A 中添加值 - 其中如果你需要
Fname = Range("C2") & "- " & c
你不应该使用 wb.Path
wb
分配给工作簿,其中 fPath
是你的文件夹路径,所以使用:
Filename:=fPath & "\" & fName & ".xlsx"
或根据需要“.xlsm”。
要分配 fName
使用:
fName = c.Offset(, 2).Value & " - " & c.Value