VBA: выбор активного текстового документа - PullRequest
0 голосов
/ 24 апреля 2018

Я недавно узнал, как управлять документами Word через VBA в Excel. Моя проблема в том, что я хочу, чтобы мой макрос мог определить активный текстовый документ с правильным именем файла, выбрать этот документ и продолжить макрос. У меня есть этот код ниже

Sub CreateNewWordFile()
  Dim wrd As Word.Application
  Dim Opfile As Object
  Dim AcFile As Object

  Set Opfile = GetObject(, "Word.Application")
  Debug.Print Opfile.Documents.count
  For Each AcFile In Opfile.Documents
    If AcFile = "SampleWord " & Format(Now, "mm-dd-yyyy") & ".docx" Then
      Set wrd = AcFile.Application
      With wrd
       .Activate
       .Selection.TypeParagraph
       .Selection.TypeParagraph
       .Selection.Font.Size = 20
       .Selection.TypeText "success"
       .ActiveDocument.Save
       GoTo Label1
      End With
    End If
  Next
  Set wrd = New Word.Application

 With wrd
   .Visible = True
   .Activate
   .Documents.Add
   With .Selection
       .ParagraphFormat.Alignment = wdAlignParagraphCenter
       .BoldRun
       .Font.Size = 18
       .TypeText "Sample Word File"
       .BoldRun
       .TypeParagraph
       .Font.Size = 12
       .ParagraphFormat.Alignment = wdAlignParagraphLeft
       .TypeParagraph
       .ParagraphFormat.Alignment = wdAlignParagraphCenter
       .Font.Size = 15
       .TypeText "samples"
   End With

  ActiveDocument.SaveAs2 Filename:="Documents\SampleWord " & Format(Now, "mm-dd-yyyy") & ".docx"

  End With

Label1:

  Set Opfile = Nothing
  Set wrd = Nothing

End Sub

Ниже цикла For Each указан мой код для создания документа Word на случай, если нет открытого документа Word с правильным именем файла. Проблема в том, что когда For Each Loop запускает макрос, он выдает ошибку

Компонент ActiveX не может создать объект

Но когда я превращаю его в комментарий и просто запускаю свой код, который создает документ Word и раскомментирует его для моего второго запуска, чтобы проверить, это работает. Также я замечаю, что Documents.count не учитывает открытые документы Word. Я попытался открыть несколько документов Word, но это не считается. Я надеюсь, что кто-то может помочь, спасибо.

1 Ответ

0 голосов
/ 24 апреля 2018

Я собираюсь дать вам много информации, но не менять ваш код.Вы узнаете больше, если сможете реализовать то, что я объясняю.Ваша главная проблема заключается в том, что вы не полностью понимаете, что происходит, когда вы используете GetObject против New Word.Application.После того, как вы это отсортируете, все будет в порядке.

Если Word вообще не работает, то GetObject возвращает сообщение об ошибке, которое вы видите.Типичный способ справиться с этим - проверить ошибку и запустить Word, если необходимо, например,

On Error Resume Next
Set wrd = GetObject(, "Word.Application")
If err.number = 429 Then
    Set wrd = new Word.Application
End If
On Error GoTo 0

ОДНАКО, поскольку вы ищете конкретный документ, если этот документ был сохранен ивы знаете путь к файлу, вы можете (но не обязаны) использовать

Dim wrdDoc as Object
Set wrdDoc = GetObject("C:\ExamplePath\DocName.docx")
Set wrd = wrdDoc.Application

Также нет необходимости зацикливать коллекцию документов, чтобы получить документ с определенным именем.Вы также можете сделать:

Set acFile = wrd.Documents("Filename")

Вы можете проверить, существует ли этот документ, используя

If acFile Is Nothing Then
  'put the code to create a new DOCUMENT here
  Set acFile = wrd.Documents.Add
  'Do all the formatting, etc. here
End If

Основная проблема с Documents.Count связана с использованием

Set wrd = New Word.Application

каждый раз, когда код не находит конкретный документ.Это создает новый экземпляр Word каждый раз, когда он выполняется.Каждый экземпляр не зависит от других, поэтому Documents.Count не возвращает число, равное всем сгенерированным вами документам.Он работает только для текущего экземпляра Word.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...