Vba 使用多个子系统还是将所有代码放在一个子系统中更好

Vba 使用多个子系统还是将所有代码放在一个子系统中更好,vba,ms-word,Vba,Ms Word,我一直在通过论坛和YouTube自学VBA。我编写了一些使用If语句的代码。如果这句话是真的,我可以选择调用另一个子系统,或者只是在同一个子系统中编写代码。我的问题是,如果我调用一个子系统,它使用MS Word,如果代码使用循环,这是否等同于启动MS Word,然后退出,然后一次又一次地重新启动它?我对属于第二个子系统的部分进行了评论,但没有包括在下面 选项显式 子CreateWordDocEarlyBinding() '为子对象声明的变量。 将sourceDoc设置为字符串 最后一排一样长 像

我一直在通过论坛和YouTube自学VBA。我编写了一些使用
If
语句的代码。如果这句话是真的,我可以选择调用另一个子系统,或者只是在同一个子系统中编写代码。我的问题是,如果我调用一个子系统,它使用MS Word,如果代码使用循环,这是否等同于启动MS Word,然后退出,然后一次又一次地重新启动它?我对属于第二个子系统的部分进行了评论,但没有包括在下面

选项显式
子CreateWordDocEarlyBinding()
'为子对象声明的变量。
将sourceDoc设置为字符串
最后一排一样长
像长的一样暗的圈
'在此处添加MS Word的代码
Dim WdApp作为应用程序
Set WdApp=新单词。应用程序
“我不确定我为什么需要这个。
暗柱状环与长柱状环相同
“找到最后一行。
lastRow=Sheet1.单元格(Sheet1.Rows.Count,1).结束(xlUp).行
"在纵列中循环。
对于rowLoop=2到lastRow
'我不确定此时是否需要代码。
'columnLoop=Sheet1.范围(行循环,1)
“检查电池的状况。
如果Sheet1.Cells(rowLoop,1).Value=“测试字符串1”,则
如果Sheet1.单元格(rowLoop,1).Offset(0,1).Value>=0.1,则
如果Sheet1.单元格(rowLoop,1).Offset(0,1).Value<1,则
sourceDoc=“Test1.docx”
调用CreateNewSourceDoc(sourceDoc,WdApp)
其他的
sourceDoc=“Test2.docx”
调用CreateNewSourceDoc(sourceDoc,WdApp)
如果结束
如果结束
'正在检查电池的B状态。
ElseIf Sheet1.Cells(rowLoop,1).Value=“测试字符串2”然后
如果Sheet1.单元格(rowLoop,1).Offset(0,1).Value>=0.5,则
如果Sheet1.单元格(rowLoop,1).偏移量(0,1).值小于5,则
sourceDoc=“Test3.docx”
调用CreateNewSourceDoc(sourceDoc,WdApp)
其他的
sourceDoc=“Test4.docx”
调用CreateNewSourceDoc(sourceDoc,WdApp)
如果结束
如果结束
如果结束
“检查下一排。
下一个
WdApp,退出
设置WdApp=Nothing
端接头
我在这里添加了我为第二个子代码,以便于澄清。这段代码是否每次循环都会创建一个新的word实例?如果是这样的话,我是否最好删除下面的子

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

问题中的代码是正确的

Word.Application
WdApp
)在“main”子
createWordDoceEarlyBinding
中启动,并在那里退出并清理

WdApp
,以及所使用的文档,然后被传递到第二个子系统进行处理

我注意到还有一件事可以在第二个过程(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

问题中的代码是正确的

Word.Application
WdApp
)在“main”子
createWordDoceEarlyBinding
中启动,并在那里退出并清理

WdApp
,以及所使用的文档,然后被传递到第二个子系统进行处理

我注意到还有一件事可以在第二个过程(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

如果您将
WdApp
传递给sub,它就可以使用它。否则它将不得不启动一个新实例,是的。@GSerg,不知道你的意思。我在合并了两个sub的帖子中添加了代码。当它们分开时,第一个子节点将“sourceDoc”传递给第二个子节点,第二个子节点打开并保存单词doc。我在哪里传递“wdApp”以避免出现新实例。很抱歉,我是新手。
new Word.Application
每次执行Word时都会启动一个新的Word实例,就像读取代码所表明的那样。如果要重用一个实例,则除了要传递的
sourceDoc
之外,还必须将
WdApp
传递到第二个
SUB
;它将作为附加参数传递给第二个
SUB
。。不过,我不知道
WdApp
来自哪里;您在第一个子代码中使用它,但除了单行代码外,它不在该代码中的任何位置。退出@KenWhite,我编辑了第一个子代码,并认为我将WdApp和sourceDoc传递给了第二个子代码。现在看起来怎么样?@KenWhite,我只看到word的一个实例,它在sub的末尾消失了。谢谢。如果你将你的
WdApp
传递给sub,它可以使用它。否则它将不得不启动一个新实例,是的。@GSerg,不知道你的意思。我在合并了两个sub的帖子中添加了代码。当它们分开时,第一个子节点将“sourceDoc”传递给第二个子节点,第二个子节点打开并保存单词doc。我在哪里传递“wdApp”以避免出现新实例。很抱歉,我是新手。
new Word.Application
每次执行Word时都会启动一个新的Word实例,就像读取代码所表明的那样。如果要重用一个实例,则除了要传递的
sourceDoc
之外,还必须将
WdApp
传递到第二个
SUB
;它将作为附加参数传递给第二个
SUB
。。不过,我不知道
WdApp
来自哪里;您可以在第一个子代码中使用它,但除了单行代码外,它不在该代码的任何地方。退出@