VBA: Как получить (более) динамическое имя файла? - PullRequest
0 голосов
/ 21 марта 2019

Итак, у меня есть работающий скрипт VBA. Я просто хочу изменить имя, под которым цикл сохраняет файлы.

Я дам краткое описание того, что он в настоящее время делает. По сути, он выполняет цикл действий для определенного диапазона строк, здесь A2:A72. Это «основная» рабочая книга, где выполняется этот цикл, где собраны все входные данные. Каждая строка представляет собой входные данные отдельной темы и копируется / вставляется в шаблон в другой книге. Затем запускается Солвер, чтобы настроить шаблон для заданных входных данных. Затем он сохраняет и называет файл как текст в первой ячейке строки, в которую была вставлена ​​копия. (т. е. 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$20", MaxMinVal:=3, ValueOf:=1.2, ByChange:="$F$35", 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

Большое спасибо за все и любую помощь !!

Ответы [ 2 ]

0 голосов
/ 21 марта 2019

Вы не должны использовать wb.Path wb назначено рабочей книге, где fPath - это путь к вашей папке, поэтому используйте:

Filename:=fPath & "\" & fName & ".xlsx" 

или ".xlsm", как требуется.

Для назначения fName используйте:

fName = c.Offset(, 2).Value & " - " & c.Value
0 голосов
/ 21 марта 2019

Код присваивает переменную c каждой ячейке в диапазоне A2: A72 по очереди - поэтому в данный момент код сохраняется 71 раз. Код

  fName = Range("C" & c.Row) & Range("A" & c.Row)

выдаст c2 & A2 в первый раз, а затем C3 & A3 во второй (и т. Д. Я подозреваю, что вы хотите, чтобы он всегда использовал c2, а затем добавлял значение в A - в этом случае вы нужно 1004 *

 Fname = Range("C2") & "- "  & c
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...