Vba 在文件夹中的所有文件上运行宏时出现问题;选择“;

Vba 在文件夹中的所有文件上运行宏时出现问题;选择“;,vba,ms-word,Vba,Ms Word,我有这个MS Word宏来运行文件夹中的所有文件docx(因为Visible=false,所以不打开它们),并为每个文件调用另一个宏 调用的第二个宏是“Sub ApplyFormat()”,正如您所看到的,我在选择中使用了,因此当宏调用第二个宏时,它不会生成 任何更改,我想是因为我的第二个宏使用了“选择”,而使用选择,我认为只有在文件打开且可见时才有效 我尝试使用Visible:=False打开每个文档,以提高性能 我怎样才能解决这个问题?也许在我的第二个宏中使用一些变量而不是“选择”,但我不知

我有这个MS Word宏来运行文件夹中的所有文件docx(因为Visible=false,所以不打开它们),并为每个文件调用另一个宏

调用的第二个宏是“Sub ApplyFormat()”,正如您所看到的,我在选择中使用了
,因此当宏调用第二个宏时,它不会生成
任何更改,我想是因为我的第二个宏使用了“选择”,而使用选择,我认为只有在文件打开且可见时才有效

我尝试使用Visible:=False打开每个文档,以提高性能

我怎样才能解决这个问题?也许在我的第二个宏中使用一些变量而不是“选择”,但我不知道如何使用

谢谢你的帮助

Sub FormatAllDocxInFolder()
Dim sFolder As String, sFile As String, wdDoc As Document
sFolder = "C:\PATH\TO\FILES"

sFile = Dir(sFolder & "\*.docx", vbNormal)
While sFile <> ""
  Set wdDoc = Documents.Open(FileName:=sFolder & "\" & sFile, AddToRecentFiles:=False, Visible:=False)
  With wdDoc

    Call ApplyFormat

    .Close SaveChanges:=True

  End With
  strFile = Dir()
Wend
Set wdDoc = Nothing
End Sub

Sub ApplyFormat()
    Selection.HomeKey wdStory
    With Selection.Find
        .ClearFormatting
        .Replacement.ClearFormatting
        .Text = "abc"
        .Replacement.Text = " def"
        .Wrap = wdFindContinue
        .Execute Replace:=wdReplaceAll
    End With
End Sub
子格式AllDocXinFolder()
Dim S文件夹作为字符串,sFile作为字符串,wdDoc作为文档
sFolder=“C:\PATH\TO\FILES”
sFile=Dir(sFolder&“\*.docx”,vbNormal)
而sFile“”
设置wdDoc=Documents.Open(文件名:=sFolder&“\”&sFile,AddToRecentFiles:=False,可见:=False)
使用wdDoc
调用ApplyFormat
.Close SaveChanges:=True
以
strFile=Dir()
温德
设置wdDoc=Nothing
端接头
子应用程序格式()
Selection.HomeKey wdStory
选择。查找
.ClearFormatting
.Replacement.ClearFormatting
.Text=“abc”
.Replacement.Text=“def”
.Wrap=wdFindContinue
.Execute Replace:=wdReplaceAll
以
端接头

发现代码存在问题

  • strFile=Dir()
    代替
    sFile=Dir()
  • WdDoc
    文档对象作为参数传递给
    Sub ApplyFormat
    ,或者将代码块直接用于文件循环
  • 它是这样工作的

    Sub FormatAllDocxInFolder()
    Dim sFolder As String, sFile As String, wdDoc As Document
    sFolder = "C:\Users\user\desktop\folder1\"
    
    sFile = Dir(sFolder & "\*.docx", vbNormal)
    While sFile <> ""
      Set wdDoc = Documents.Open(FileName:=sFolder & "\" & sFile, AddToRecentFiles:=False, Visible:=False)
      With wdDoc
        Call ApplyFormat(wdDoc)
        .Close SaveChanges:=True
      End With
      sFile = Dir
    Wend
    Set wdDoc = Nothing
    End Sub
    Sub ApplyFormat(Xdoc As Document)
        With Xdoc.Content.Find
            .ClearFormatting
            .Replacement.ClearFormatting
            .Text = "abc"
            .Replacement.Text = " def"
            .Wrap = wdFindContinue
            .Execute Replace:=wdReplaceAll
        End With
    End Sub
    
    子格式AllDocXinFolder()
    Dim S文件夹作为字符串,sFile作为字符串,wdDoc作为文档
    sFolder=“C:\Users\user\desktop\folder1”
    sFile=Dir(sFolder&“\*.docx”,vbNormal)
    而sFile“”
    设置wdDoc=Documents.Open(文件名:=sFolder&“\”&sFile,AddToRecentFiles:=False,可见:=False)
    使用wdDoc
    调用ApplyFormat(wdDoc)
    .Close SaveChanges:=True
    以
    sFile=Dir
    温德
    设置wdDoc=Nothing
    端接头
    子应用程序格式(Xdoc作为文档)
    使用Xdoc.Content.Find
    .ClearFormatting
    .Replacement.ClearFormatting
    .Text=“abc”
    .Replacement.Text=“def”
    .Wrap=wdFindContinue
    .Execute Replace:=wdReplaceAll
    以
    端接头
    
    发现代码存在问题

  • strFile=Dir()
    代替
    sFile=Dir()
  • WdDoc
    文档对象作为参数传递给
    Sub ApplyFormat
    ,或者将代码块直接用于文件循环
  • 它是这样工作的

    Sub FormatAllDocxInFolder()
    Dim sFolder As String, sFile As String, wdDoc As Document
    sFolder = "C:\Users\user\desktop\folder1\"
    
    sFile = Dir(sFolder & "\*.docx", vbNormal)
    While sFile <> ""
      Set wdDoc = Documents.Open(FileName:=sFolder & "\" & sFile, AddToRecentFiles:=False, Visible:=False)
      With wdDoc
        Call ApplyFormat(wdDoc)
        .Close SaveChanges:=True
      End With
      sFile = Dir
    Wend
    Set wdDoc = Nothing
    End Sub
    Sub ApplyFormat(Xdoc As Document)
        With Xdoc.Content.Find
            .ClearFormatting
            .Replacement.ClearFormatting
            .Text = "abc"
            .Replacement.Text = " def"
            .Wrap = wdFindContinue
            .Execute Replace:=wdReplaceAll
        End With
    End Sub
    
    子格式AllDocXinFolder()
    Dim S文件夹作为字符串,sFile作为字符串,wdDoc作为文档
    sFolder=“C:\Users\user\desktop\folder1”
    sFile=Dir(sFolder&“\*.docx”,vbNormal)
    而sFile“”
    设置wdDoc=Documents.Open(文件名:=sFolder&“\”&sFile,AddToRecentFiles:=False,可见:=False)
    使用wdDoc
    调用ApplyFormat(wdDoc)
    .Close SaveChanges:=True
    以
    sFile=Dir
    温德
    设置wdDoc=Nothing
    端接头
    子应用程序格式(Xdoc作为文档)
    使用Xdoc.Content.Find
    .ClearFormatting
    .Replacement.ClearFormatting
    .Text=“abc”
    .Replacement.Text=“def”
    .Wrap=wdFindContinue
    .Execute Replace:=wdReplaceAll
    以
    端接头
    
    您的“(由于可见而未打开它们=false)”假设不正确-文件正在打开。但是,由于Visible=False,因此未选择任何内容。因此,您需要(而且无论如何都应该)直接使用文档,如:

    Sub FormatAllDocxInFolder()
    Dim sFolder As String, sFile As String, wdDoc As Document
    sFolder = "C:\PATH\TO\FILES"
    
    sFile = Dir(sFolder & "\*.docx", vbNormal)
    While sFile <> ""
      Set wdDoc = Documents.Open(FileName:=sFolder & "\" & sFile, AddToRecentFiles:=False, Visible:=False)
      Call ApplyFormat(wdDoc)
      wdDoc.Close SaveChanges:=True
      sFile = Dir()
    Wend
    Set wdDoc = Nothing
    End Sub
    
    Sub ApplyFormat(wdDoc As Document)
    With wdDoc.Range.Find
      .ClearFormatting
      .Replacement.ClearFormatting
      .Text = "abc"
      .Replacement.Text = " def"
      .Wrap = wdFindContinue
      .Execute Replace:=wdReplaceAll
    End With
    End Sub
    
    子格式AllDocXinFolder()
    Dim S文件夹作为字符串,sFile作为字符串,wdDoc作为文档
    sFolder=“C:\PATH\TO\FILES”
    sFile=Dir(sFolder&“\*.docx”,vbNormal)
    而sFile“”
    设置wdDoc=Documents.Open(文件名:=sFolder&“\”&sFile,AddToRecentFiles:=False,可见:=False)
    调用ApplyFormat(wdDoc)
    wdDoc.Close SaveChanges:=True
    sFile=Dir()
    温德
    设置wdDoc=Nothing
    端接头
    子应用程序格式(wdDoc作为文档)
    使用wdDoc.Range.Find
    .ClearFormatting
    .Replacement.ClearFormatting
    .Text=“abc”
    .Replacement.Text=“def”
    .Wrap=wdFindContinue
    .Execute Replace:=wdReplaceAll
    以
    端接头
    
    在任何情况下,您的代码都可以缩减为:

    Sub FormatAllDocxInFolder()
    Dim sFolder As String, sFile As String, wdDoc As Document
    sFolder = "C:\PATH\TO\FILES"
    
    sFile = Dir(sFolder & "\*.docx", vbNormal)
    While sFile <> ""
      Set wdDoc = Documents.Open(FileName:=sFolder & "\" & sFile, AddToRecentFiles:=False, Visible:=False)
      With wdDoc
        With .Range.Find
            .ClearFormatting
            .Replacement.ClearFormatting
            .Text = "abc"
            .Replacement.Text = " def"
            .Wrap = wdFindContinue
            .Execute Replace:=wdReplaceAll
        End With
        .Close SaveChanges:=True
      End With
      sFile = Dir()
    Wend
    Set wdDoc = Nothing
    End Sub
    
    子格式AllDocXinFolder()
    Dim S文件夹作为字符串,sFile作为字符串,wdDoc作为文档
    sFolder=“C:\PATH\TO\FILES”
    sFile=Dir(sFolder&“\*.docx”,vbNormal)
    而sFile“”
    设置wdDoc=Documents.Open(文件名:=sFolder&“\”&sFile,AddToRecentFiles:=False,可见:=False)
    使用wdDoc
    使用.Range.Find
    .ClearFormatting
    .Replacement.ClearFormatting
    .Text=“abc”
    .Replacement.Text=“def”
    .Wrap=wdFindContinue
    .Execute Replace:=wdReplaceAll
    以
    .Close SaveChanges:=True
    以
    sFile=Dir()
    温德
    设置wdDoc=Nothing
    端接头
    
    您的“(由于可见而未打开它们=false)”假设不正确-文件正在打开。但是,由于Visible=False,因此未选择任何内容。因此,您需要(而且无论如何都应该)直接使用文档,如:

    Sub FormatAllDocxInFolder()
    Dim sFolder As String, sFile As String, wdDoc As Document
    sFolder = "C:\PATH\TO\FILES"
    
    sFile = Dir(sFolder & "\*.docx", vbNormal)
    While sFile <> ""
      Set wdDoc = Documents.Open(FileName:=sFolder & "\" & sFile, AddToRecentFiles:=False, Visible:=False)
      Call ApplyFormat(wdDoc)
      wdDoc.Close SaveChanges:=True
      sFile = Dir()
    Wend
    Set wdDoc = Nothing
    End Sub
    
    Sub ApplyFormat(wdDoc As Document)
    With wdDoc.Range.Find
      .ClearFormatting
      .Replacement.ClearFormatting
      .Text = "abc"
      .Replacement.Text = " def"
      .Wrap = wdFindContinue
      .Execute Replace:=wdReplaceAll
    End With
    End Sub
    
    子格式AllDocXinFolder()
    Dim S文件夹作为字符串,sFile作为字符串,wdDoc作为文档
    sFolder=“C:\PATH\TO\FILES”
    sFile=Dir(sFolder&“\*.docx”,vbNormal)
    而sFile“”
    设置wdDoc=Documents.Open(文件名:=sFolder&“\”&sFile,AddToRecentFiles:=False,可见:=False)
    调用ApplyFormat(wdDoc)
    wdDoc.Close SaveChanges:=True
    sFile=Dir()
    温德
    设置wdDoc=Nothing
    端接头
    子应用程序格式(wdDoc作为文档)
    使用wdDoc.Range.Find
    .ClearFormatting
    .Replacement.ClearFormatting
    .Text=“abc”
    .Replacement.Text=“def”
    .Wrap=wdFindContinue
    .Execute Replace:=wdReplaceAll
    以
    端接头
    
    在任何情况下,您的代码都可以缩减为:

    Sub FormatAllDocxInFolder()
    Dim sFolder As String, sFile As String, wdDoc As Document
    sFolder = "C:\PATH\TO\FILES"
    
    sFile = Dir(sFolder & "\*.docx", vbNormal)
    While sFile <> ""
      Set wdDoc = Documents.Open(FileName:=sFolder & "\" & sFile, AddToRecentFiles:=False, Visible:=False)
      With wdDoc
        With .Range.Find
            .ClearFormatting
            .Replacement.ClearFormatting
            .Text = "abc"
            .Replacement.Text = " def"
            .Wrap = wdFindContinue
            .Execute Replace:=wdReplaceAll
        End With
        .Close SaveChanges:=True
      End With
      sFile = Dir()
    Wend
    Set wdDoc = Nothing
    End Sub
    
    子格式AllDocXinFolder()
    作为字符串的Dim-sFolder