Как использовать встроенную точку в Word.Documents.Add () из Excel VBA? - PullRequest
1 голос
/ 19 марта 2012

Я хочу встроить шаблон слова в книгу Excel, чтобы пользователь мог щелкнуть по кнопке создания отчета и получить слово, чтобы открыть новый документ с помощью шаблона слова.

Приведенный ниже код напрямую редактирует точкуи позволяет вносить изменения в шаблон, что нежелательно, поскольку шаблон содержит форматирование и разметку, поддерживающие автоматическое создание отчетов.

Public Sub ExportReportEmbedded()

Set curSheet = ActiveSheet
Application.ScreenUpdating = False

Dim wdApp As Word.Application, wdDoc As Word.Document
Set ole = Sheets("Report").Shapes("Object 4").OLEFormat
ole.Activate
' rather than activating it, I want to use the dotx in a new Word.Documents.Add().
' But how?
' wdApp.Documents.Add(ole.???)
curSheet.Activate
Set wdDoc = ole.Object.Object

Set q = Sheets("Report")
With wdDoc.ContentControls
    For i = 1 To 62 Step 1
        .Item(i).Range.Text = q.Range("b" & i)
    Next
End With

Application.ScreenUpdating = True

End Sub

1 Ответ

1 голос
/ 19 марта 2012

Приведенный ниже код напрямую редактирует dotx и позволяет вносить изменения в шаблон, что нежелательно, поскольку шаблон содержит форматирование и разметку, поддерживающие автоматическое создание отчетов.

Чтобы напрямую ответить на ваш вопрос, вы можете открыть встроенный Dotx следующим образом, чтобы сам шаблон не открывался, а представлял собой другой текстовый документ на основе шаблона..

Надеюсь, это то, что вы хотели?

Sub Sample()
    Dim shp As Shape

    Set shp = Sheets("Report").Shapes.Range(Array("Object 4"))
    shp.Select
    Selection.Verb Verb:=xlPrimary
End Sub

FOLLOWUP

Попробуйте это.Я использую GetTempPath API, чтобы получить временную папку пользователя, а затем сохраняю внедренный документ в эту папку.После сохранения документа я использую .Add для создания нового файла.Также я использую Позднее связывание с MS Word, поэтому вам не нужно устанавливать ссылки на библиотеку объектов MS Word.Дайте мне знать, если у вас есть какие-либо вопросы:)

Private Declare Function GetTempPath Lib "kernel32" _
Alias "GetTempPathA" (ByVal nBufferLength As Long, _
ByVal lpBuffer As String) As Long

Public Sub ExportReportEmbedded()
    Dim oWordApp As Object, oWordDoc As Object, objWord As Object
    Dim FlName As String
    Dim sh As Shape
    Dim objOLE As OLEObject

    '~~> Decide on a temporary file name which will be saved in the
    '~~> users temporary folder
    FlName = GetTempDirectory & "\Template.dotx"

    Set sh = Sheets("Report").Shapes("Object 4")

    sh.OLEFormat.Activate

    Set objOLE = sh.OLEFormat.Object

    Set objWord = objOLE.Object

    '~~> Save the file to the relevant temp folder
    objWord.SaveAs2 fileName:=FlName, FileFormat:=wdFormatXMLTemplate

    '~~> Establish an Word application object
    On Error Resume Next
    Set oWordApp = GetObject(, "Word.Application")

    If Err.Number <> 0 Then
        Set oWordApp = CreateObject("Word.Application")
    End If
    Err.Clear
    On Error GoTo 0

    oWordApp.Visible = True

    '~~> Create new document based on the template
    Set oWordDoc = oWordApp.Documents.Add(Template:=FlName, NewTemplate:=False, DocumentType:=0)

    '~~> Close the actual template that opened
    objWord.Close savechanges:=False

    '~~> Rest of the code
    '~~> now you can work with oWordDoc. This will not save the actual template

    '~~> In the end Clean Up (Delete the template saved in the temp directory)
    Kill FlName
End Sub

'~~> Function to get the user's temp directory
Function GetTempDirectory() As String
   Dim buffer As String
   Dim bufferLen As Long
   buffer = Space$(256)
   bufferLen = GetTempPath(Len(buffer), buffer)
   If bufferLen > 0 And bufferLen < 256 Then
      buffer = Left$(buffer, bufferLen)
   End If
   If InStr(buffer, Chr$(0)) <> 0 Then
      GetTempDirectory = Left$(buffer, InStr(buffer, Chr$(0)) - 1)
   Else
      GetTempDirectory = buffer
   End If
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...