Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Excel中的Word.Documents.Add()中使用嵌入式dotx?_Excel_Vba_Ms Word - Fatal编程技术网

如何在Excel中的Word.Documents.Add()中使用嵌入式dotx?

如何在Excel中的Word.Documents.Add()中使用嵌入式dotx?,excel,vba,ms-word,Excel,Vba,Ms Word,我想在Excel工作簿中嵌入word模板,以便用户可以单击“生成报告”按钮,让word使用word模板打开新文档 下面的代码直接编辑dotx并允许对模板进行更改,这是不可取的,因为模板包含支持自动报告生成的格式和标记 Public Sub ExportReportEmbedded() Set curSheet = ActiveSheet Application.ScreenUpdating = False Dim wdApp As Word.Applicatio

我想在Excel工作簿中嵌入word模板,以便用户可以单击“生成报告”按钮,让word使用word模板打开新文档

下面的代码直接编辑dotx并允许对模板进行更改,这是不可取的,因为模板包含支持自动报告生成的格式和标记

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
下面的代码直接编辑dotx并允许对模板进行更改,这是不可取的,因为模板包含支持自动报告生成的格式和标记

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

要直接回答您的问题,您可以按以下方式打开嵌入的Dotx,这样就不会打开模板本身,而是打开基于模板的另一个word文档

希望这就是你想要的

Sub Sample()
    Dim shp As Shape

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

试试这个。我正在使用
GetTempPath
API获取用户的临时文件夹,然后将嵌入的文档保存到该文件夹中。保存文档后,我将使用
.Add
创建新文件。另外,我正在使用MS Word的后期绑定,所以您不需要设置对MS Word对象库的任何引用。如果您有任何疑问,请务必告诉我:)

Private声明函数GetTempPath Lib“kernel32”_
别名“GetTempPathA”(ByVal nBufferLength,长度相同_
ByVal lpBuffer(作为字符串)长度相同
公共子ExportReportEmbedded()
将oWordApp作为对象,将oWordDoc作为对象,将objWord作为对象
将名称设置为字符串
像形状一样暗淡
暗淡的物体
“~~>决定将保存在中的临时文件名
“~~>用户临时文件夹
FlName=GetTempDirectory&“\Template.dotx”
设置sh=图纸(“报告”)。形状(“对象4”)
sh.OLEFormat.Activate
设置objOLE=sh.OLEFormat.Object
设置objWord=objOLE.Object
“~~>将文件保存到相关的临时文件夹中
objWord.SaveAs2文件名:=FlName,文件格式:=wdFormatXMLTemplate
“~~>建立Word应用程序对象
出错时继续下一步
Set oWordApp=GetObject(,“Word.Application”)
如果错误号为0,则
设置oWordApp=CreateObject(“Word.Application”)
如果结束
呃,明白了
错误转到0
oWordApp.Visible=True
“~~>基于模板创建新文档
设置oWordDoc=oWordApp.Documents.Add(模板:=FlName,新模板:=False,文档类型:=0)
“~~>关闭实际打开的模板
objWord.Close savechanges:=False
“~~>代码的其余部分
“~~>现在您可以使用oWordDoc了。这将不会保存实际的模板
“~~>最后清理(删除保存在临时目录中的模板)
杀死FlName
端接头
“~~>函数以获取用户的临时目录
函数GetTempDirectory()作为字符串
将缓冲区设置为字符串
暗淡的缓冲区和长的一样
缓冲区=空间$(256)
bufferLen=GetTempPath(Len(buffer),buffer)
如果bufferLen>0且bufferLen<256,则
buffer=Left$(buffer,bufferLen)
如果结束
如果InStr(缓冲区,Chr$(0))为0,则
GetTempDirectory=Left$(缓冲区,InStr(缓冲区,Chr$(0))-1)
其他的
GetTempDirectory=buffer
如果结束
端函数

Jake,你真的需要嵌入该模板吗?更改完成后,您始终可以使用该文档创建新文档,然后使用“另存为”将其另存为其他文件?或者您计划分发嵌入模板的Excel文件?@SiddharthRout计划分发嵌入模板的Excel文件。或者,我可以通过网络访问它,但宏安全性和受信任文档警告正在妨碍…在这种情况下,请参阅下面的代码。@Jake:我已经列出了一个使用这种方法从Excel导出word文件的小示例。我发现更容易使用的一件事是将模板设置为
docx
,而不是
dotx
“这样模板本身就不会打开,而是基于模板的另一个word文档”——我不明白这一点。Word打开后,我按CTRL+S键,文档将保存回Excel工作簿。有什么想法吗?你必须使用文件另存为或在VBA
中使用。另存为
那么在OP中使用动词与我的代码有何不同?谢谢你的时间。。。正如我提到的,我不希望每次用户单击generate按钮时都保存一份副本,这样,用户就可以预览报告而不保存它。当他真的想存钱的时候,他不需要记得存钱。杰克,我已经更新了帖子。刚刚看到你编辑的帖子。快速提问。您想将用户更改保存到嵌入的word文件中吗?亲爱的@SiddharthRout,我真的很难过,这样一个伟大的答案在8年后没有获得超过1次的赞成票。请至少今天再来一杯!