Лучше использовать несколько SUB или иметь весь код в одной SUB - PullRequest
1 голос
/ 05 октября 2019

Я учу себя VBA через форумы и YouTube. Я написал некоторый код, который использует If операторов. Если утверждение верно, у меня есть выбор: позвонить другому SUB или просто написать код в том же SUB. Мой вопрос: если я вызываю SUB, и он использует MS Word, если код использует цикл, будет ли это эквивалентно запуску MS Word, затем его выходу и повторному запуску снова и снова? Я прокомментировал части, которые принадлежат второму SUB, и не включил его ниже.

Option Explicit

Sub CreateWordDocEarlyBinding()
    'Declared Variables for Sub.
    Dim sourceDoc As String
    Dim lastRow As Long
    Dim rowLoop As Long

    'Adding code for MS Word here
    Dim WdApp As Application
    Set WdApp = New Word.Application

'Not sure I need this for any reason.    
Dim columnLoop As Long

    'Find last row.
    lastRow = Sheet1.Cells(Sheet1.Rows.Count, 1).End(xlUp).Row

    'Looping through column.
    For rowLoop = 2 To lastRow

         'Not sure I  need at this point for code.
         'columnLoop = Sheet1.Range(rowLoop, 1)

        'Checking cells for A Conditon.
        If Sheet1.Cells(rowLoop, 1).Value = "Test String 1" Then
            If Sheet1.Cells(rowLoop, 1).Offset(0, 1).Value >= 0.1 Then
                If Sheet1.Cells(rowLoop, 1).Offset(0, 1).Value < 1 Then
                    sourceDoc = "Test1.docx"
                    Call CreateNewSourceDoc(sourceDoc, WdApp)
                Else
                    sourceDoc = "Test2.docx"
                    Call CreateNewSourceDoc(sourceDoc, WdApp)
                End If

            End If

        'Checking cells for B condition.
        ElseIf Sheet1.Cells(rowLoop, 1).Value = "Test String 2" Then
            If Sheet1.Cells(rowLoop, 1).Offset(0, 1).Value >= 0.5 Then
                If Sheet1.Cells(rowLoop, 1).Offset(0, 1).Value < 5 Then
                    sourceDoc = "Test3.docx"
                    Call CreateNewSourceDoc(sourceDoc, WdApp)
                Else
                    sourceDoc = "Test4.docx"
                    Call CreateNewSourceDoc(sourceDoc, WdApp)
                End If
            End If



        End If

    'Checking next row.
    Next

    WdApp.Quit
    Set WdApp = Nothing
End Sub

Я добавляю код, который у меня был для второго SUB, для пояснения. Создает ли этот код новый экземпляр слова при каждом цикле? Если это произойдет, я бы лучше устранить ниже SUB.

Sub CreateNewSourceDoc(sourceDoc As String, WdApp As Application)

    'Declaring variables
    Dim newFolderName As String
    Dim newFilePath As String
    'Source folder
     filePath = ThisWorkbook.Path & "\"

     'New Folder
      newFolderName = Sheet1.Cells(rowLoop, 1) & " " & Sheet1.Cells(rowLoop, 2)
      MkDir filePath & newFolderName

      'New file path
            newFilePath = filePath & newFolderName & "\"

     'I commented the below code out to see if it is correct.
    'Set WdApp = New Word.Application

    With WdApp

              .Visible = False

              '.Activate

              .Documents.Open filePath & sourceDoc

              .ActiveDocument.SaveAs2 Filename:=newFilePath & Sheet1.Cells(rowLoop, 1) & " " & Sheet1.Cells(rowLoop, 2) & ".docx"


          End With

          sourceDoc = vbNullString

End Sub

1 Ответ

0 голосов
/ 06 октября 2019

Код в том виде, в котором он указан в вопросе, является правильным.

Word.Application (WdApp) запускается в «основной» суб CreateWordDocEarlyBinding, а также завершается и очищается там.

WdApp вместе с используемым документом затем передается на второй Sub для обработки.

Есть еще одна вещь, которую я заметил, которую можно оптимизировать во второй процедуре (Sub):

Я бы объявил и создал экземпляр объекта Word.Document для документа, который был открыт, затем сохранен, вместо того, чтобы открывать документ «анонимно» и полагаться на ActiveDocument, чтобы он был правильным документом. Итак ...

Sub CreateNewSourceDoc(sourceDoc As String, WdApp As Application)

    'Declaring variables
    Dim newFolderName As String
    Dim newFilePath As String
    Dim wdDoc as Word.Document

     'New Folder
      newFolderName = Sheet1.Cells(rowLoop, 1) & " " & Sheet1.Cells(rowLoop, 2)
      MkDir filePath & newFolderName

     'New file path
     newFilePath = filePath & newFolderName & "\"

     With WdApp   
          .Visible = False
          Set wdDoc = .Documents.Open(filePath & sourceDoc)
          wdDoc.SaveAs2 Filename:=newFilePath & Sheet1.Cells(rowLoop, 1) & _
                        " " & Sheet1.Cells(rowLoop, 2) & ".docx"  
     End With

     sourceDoc = vbNullString
     Set wdDoc = Nothing
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...