Проблемы запуска макроса для всех файлов в папке с «Выбор» - PullRequest
0 голосов
/ 15 июня 2019

У меня есть этот макрос MS Word для запуска всех файлов docx в папке (без их открытия, поскольку Visible = false) и вызова другого макроса для каждого файла.

Второй макрос называется «Sub ApplyFormat ()», и, как вы можете видеть, я использую With Selection, поэтому, когда макрос вызывает второй макрос, он не делает Любые изменения, я думаю, потому что мой второй макрос использует «Выбор» и использовать Выбор, я думаю, работает, только если файл открыт и виден.

Я пытаюсь открыть каждый документ с помощью Visible: = False для повышения производительности.

Как я могу это исправить? Возможно, использую некоторую переменную вместо «Selection» в моем втором макросе, но я не знаю как.

Спасибо за любую помощь.

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

Ответы [ 2 ]

1 голос
/ 15 июня 2019

Ваше предположение "(без их открытия, поскольку Visible = 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

В любом случае ваш код может быть уменьшен до:

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
1 голос
/ 15 июня 2019

проблем с кодом

  1. strFile = Dir() используется вместо sFile = Dir()
  2. Либо 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...