Может ли цикл выполняться для запуска через набор определенных переменных? - PullRequest
0 голосов
/ 26 июня 2019

Я работаю над некоторым кодом и задаюсь вопросом, возможен ли цикл.На самом деле я пишу этот код для Word, а не для Excel, что я обычно делаю, но я не думаю, что это имеет значение.Я бы сказал, что мой уровень мастерства в VBA - начальный-средний.Код предназначен для использования функции слияния в Word, которая изменяет несколько функций в документе, а затем выполняет сохранение файла, а затем переходит к следующему файлу.

Sub Finsh_Merge_Save_302()


Dim date1 As String
Dim date2 As String
Dim filepath As String
Dim mainfile As String



Dim fund1 As String, fund2 As String, fund3 As String, fund4 As String 'etc.

Dim fundabbv1 As String, fundabbv2 As String, fundabbv3 As String, fundabbv4 As String ' etc.

mainfile = ActiveDocument.Name

fund1 = "blah blah blah 1"
fund2 = "blah blah blah 2"
fund3 = "blah blah blah x"
fund4 = "blah blah blah y"
'etc.

fundabbv1 = " stuff here 1"
fundabbv2 = " stuff here 2"
fundabbv3 = " stuff here x"
fundabbv4 = " stuff here y"
'etc.




    date1 = InputBox("Enter year of filing: 20xx")
    date2 = InputBox("Enter full date of filing: mm-dd-yyyy")
    filepath = "\\Bp211\sys\FAD\FA\TRES (March 2015)\Financial Reporting\Certifications\SOX Compliance and Certifications\N-CSR Certifications\NCSR Filings\" & date1 & "\" & date2

Application.ScreenUpdating = False


    With ActiveDocument.MailMerge
        .Destination = wdSendToNewDocument
        .SuppressBlankLines = True
        With .DataSource
            .FirstRecord = ActiveDocument.MailMerge.DataSource.ActiveRecord
            .LastRecord = ActiveDocument.MailMerge.DataSource.ActiveRecord
        End With
        .Execute Pause:=False
    End With
    ActiveDocument.SaveAs2 FileName:=filepath & "\" & fund1 & "\NCSR 302 Certifications" & fundabbv1 & ".docx"
    ActiveDocument.Close

    Windows(mainfile).Activate
    ActiveDocument.MailMerge.DataSource.ActiveRecord = wdNextRecord



    With ActiveDocument.MailMerge
        .Destination = wdSendToNewDocument
        .SuppressBlankLines = True
        With .DataSource
            .FirstRecord = ActiveDocument.MailMerge.DataSource.ActiveRecord
            .LastRecord = ActiveDocument.MailMerge.DataSource.ActiveRecord
        End With
        .Execute Pause:=False
    End With
    ActiveDocument.SaveAs2 FileName:=filepath & "\" & fund2 & "\NCSR 302 Certifications" & fundabbv2 & ".docx"
    ActiveDocument.Close

    Windows(mainfile).Activate
    ActiveDocument.MailMerge.DataSource.ActiveRecord = wdNextRecord

Вы можете видеть, где я использую определенные переменные, чтобы сохранить файл в правильном месте с правильным именем файла.В настоящее время это работает без проблем.Проблема в том, что у меня много определенных переменных, 70+, поэтому мне было интересно, смогу ли я создать цикл вместо того, чтобы писать этот раздел кода более 70 раз.

Ответы [ 2 ]

0 голосов
/ 26 июня 2019

Спасибо, Ниростар - ваш ответ был тем, что мне было нужно.Это быстро перебирает все файлы!

For i = LBound(fund) To UBound(fund)

    With ActiveDocument.MailMerge
        .Destination = wdSendToNewDocument
        .SuppressBlankLines = True
        With .DataSource
            .FirstRecord = ActiveDocument.MailMerge.DataSource.ActiveRecord
            .LastRecord = ActiveDocument.MailMerge.DataSource.ActiveRecord
        End With
        .Execute Pause:=False
    End With
    ActiveDocument.SaveAs2 FileName:=filepath & "\" & fund(i) & "\NCSR 302 Certifications" & fundabbv(i) & ".docx"
    ActiveDocument.Close

    Windows(mainfile).Activate
    ActiveDocument.MailMerge.DataSource.ActiveRecord = wdNextRecord

Next i
0 голосов
/ 26 июня 2019

Я бы порекомендовал использовать массивы.Вы можете использовать Dim fund(1 To 4) As String для объявления массива и fund(1) для получения значения в позиции 1, fund(2) для получения значения в позиции 2 и т. Д.

Вы можете перебирать их, используясчетчик индекса

For i = LBound(fund) To UBound(fund)
   MsgBox fund(i)
Next i

или с a для каждого

For Each element In fund
   MsgBox element
Next element
...