标签: word-vba

Word/VBA应用程序的实际限制

我工作的公司有一个内部开发的Word2003/VBA应用程序,其大小已经大约6.5 mb,他们希望为它添加额外的200多个宏,我认为这将使它更大.在我看来这是一个糟糕的想法,但找到用VSTO或其他一些更有用的技术重新开发工具的资源将是一个挑战.

所以这是我的问题:

  • 在紧张的情况下,对于具有10,20或30 mb的宏的Word模板具有业务依赖性是否可以?
  • 是否存在Microsoft定义或建议的限制(文件大小,宏的数量,复杂程度),在VBA应用程序变得无法使用之前,您应该/应该扩展多远?

从本质上讲,我想知道是否有令人信服的技术理由咬紧牙关并重新开发此应用程序.

ms-word word-vba

4
推荐指数
1
解决办法
2017
查看次数

如何使用Word VBA删除命令按钮?

我有一个Word文档,其中包含一个名为"更新"的命令按钮.

如何使用VBA删除此按钮?

vba ms-word word-vba

3
推荐指数
1
解决办法
1万
查看次数

Word 2007宏:是否有一个OnPrint事件我可以附加一个宏?

我希望在将word文件发送到打印机之前对其进行格式化检查,并且它需要对用户完全透明(没有额外的控件,只需使用UI提供的标准打印选项).是否有OnPrint或BeforePrint事件,或者可以在这方面使用的东西,我可以附加一个宏,就像我可以使用Open,Close或Save一样?这感觉应该很简单......但这些都是着名的遗言.

罗伯,提前谢谢

printing vba ms-office word-vba

3
推荐指数
1
解决办法
5081
查看次数

使用Excel VBA中的参数调用Word VBA Sub

我在dotm模板中有一个非常简单的Word子句:

Sub YHelloThar(msg As String)
    MsgBox (msg)
End Sub
Run Code Online (Sandbox Code Playgroud)

然后我有一个Excel子:

Sub CallWordSub()
        Dim wdApp As Word.Application
        Dim newDoc As Word.Document

        'Word template location   
        strFile = "C:\Some\Folder\MyWordDoc.dotm"
        'Get or create Word application
        Set wdApp = GetObject(, "Word.Application")
        If wdApp Is Nothing Then
            Set wdApp = CreateObject("Word.Application")
        End If
        'Create new Word doc from template
        Set newDoc= wdApp.Documents.Add(strFile)
        'Call the YHelloThar sub from the word doc
        Call wdApp.Run(strFile & "!YHelloThar", "Hello")
    End If
End Sub
Run Code Online (Sandbox Code Playgroud)

最后一行给出了"运行时错误'438':对象不支持此属性或方法."

我不确定我做错了什么 - 我查找的所有内容都表明这是从不同应用程序调用subs的正确方法.

此外,如果我将最后一行更改为无参数调用,它会突然正常工作.

parameters vba arguments excel-vba word-vba

3
推荐指数
1
解决办法
2万
查看次数

用户窗体中的可滚动图像

我有一个带有一堆ActiveX控件按钮或其他任何内容的单词doc,每次单击一个按钮时,都需要在弹出框中显示相应的图像.

我有一个名为ImageForm的用户窗体,这就是我现在正在做的事情:

Sub Button_Clicked()
    ImageForm.Picture = LoadPicture("appropriate_image_path")
    ImageForm.Show
End Sub
Run Code Online (Sandbox Code Playgroud)

这些图像中的每一个都具有8.5英寸的宽度,但它们的高度可以在3到20英寸之间变化(它们是pdf的片段).所以我将用户窗体的宽度设置为略大于8.5英寸,看起来很好.但是我需要能够在用户窗体中垂直滚动图像,因为某些图像可能比用户的监视器更高.

我完全坚持这个.到目前为止我尝试过的是在表单中添加一个框架,然后在表单中添加一个图像控件,并将框架的"ScrollBars"属性设置为vertical.然后,而不是使用"ImageForm.Picture = ..."我使用"ImageForm.ImageControl.Picture = ..."但它不起作用.

任何见解将不胜感激.希望这个问题很清楚,我现在只使用VBA一个月左右.(我很想念Java,所以)

谢谢!

excel vba excel-vba word-vba

3
推荐指数
1
解决办法
8704
查看次数

使用VBA在MS Word中创建表

在MS Word中创建表的代码是什么?

我已经使用宏的记录功能来查看它是如何编写的,我不知道如何解释它.

你能不能在录制宏时画桌子?它使"绘制表"功能变灰.

我需要制作一个在表格中有一些合并单元格的talbe - 如果我可以绘制表格并使用宏记录会更容易但似乎我不能那样做...

表

我已经使用绘图功能绘制了下表,但我无法记录它.

救命?!

vba ms-word word-vba

3
推荐指数
1
解决办法
3万
查看次数

通过Microsoft Word 2011 for OSX中的POST发送和接收数据

我正在尝试移植我们在Windows上使用MS Word工作的宏,该宏使用网站生成方程图像并返回该图像以插入到文档中.当前(在Windows上工作)调用如下.当我在OSX中使用相同的调用时,我收到错误429,指出"ActiveX组件无法创建对象".

' Create an xmlhttp object.
Set w_page = CreateObject("Microsoft.XMLHTTP")

' Open the connection to the remote server.
w_page.Open "POST", WebAdd, False

' Indicate that the body of the request contains form data
w_page.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"

' Actually send the request and return the data:
Font_Size = ComboFontSize.Value
w_page.Send "formula=" & Font_Size & "." & Latex_Str
Run Code Online (Sandbox Code Playgroud)

Set w_page = CreateObject("Microsoft.XMLHTTP")语句上生成错误.我尝试了几种替代方法,例如:

Set w_page = CreateObject("MSXML2.ServerXMLHTTP")
Run Code Online (Sandbox Code Playgroud)

Set w_page = CreateObject("WinHttp.WinHttpRequest.5.1")
Run Code Online (Sandbox Code Playgroud)

但是会产生相同的错误.请帮我找到在OSX Word 2011中发送POST的正确方法.

对于任何感兴趣的人,该项目可在GitHub上获得.

非常感谢!

编辑 …

macos ms-word word-vba word-vba-mac

3
推荐指数
1
解决办法
2817
查看次数

vba WScript.Shell运行带参数的.exe文件

我正在从Word 2013运行VBA宏.我正在尝试运行一个需要文件名参数/参数的可执行文件.例如, c:\myfilefilter.exe filetobefiltered.htm

我想使用,Shell Run因为我希望VBA代码等到可执行文件完成运行后再恢复VBA代码.下面代码中的最后三行是我尝试过的一些不起作用的语法示例.我认为问题是可执行程序和它过滤的文件之间的空间.有没有人知道正确的语法或等待可执行程序完成的方法.如果您需要更多信息,请询问.

Dim wsh As Object
Set wsh = VBA.CreateObject("WScript.Shell")
Dim waitOnReturn As Boolean: waitOnReturn = True
Dim windowStyle As Integer: windowStyle = 1
Dim errorCode As Integer
Dim strProgramName As String
Dim strMyFile As String
Call Shell("""" & strProgramName & """ """ & strMyFile & """", vbNormalFocus, waitOnReturn"""")
wsh.Run(strProgramName & """ """ & fileToFilterB & """", vbNormalFocus, waitOnReturn)
wsh.Run "Chr(34)strProgramNameChr(34)strMyFile", waitOnReturn
Run Code Online (Sandbox Code Playgroud)

以下代码有效.之后strCMD,第一个数字是一个布尔参数:1显示dos框,0隐藏dos框; 第二个数字是相似的:1等待程序在继续VBA代码之前完成,0不等待.

strCMD = sMyProgram + " " + sMyFile …
Run Code Online (Sandbox Code Playgroud)

vba wsh word-vba

3
推荐指数
2
解决办法
3万
查看次数

使用VBA管理同一Word文档中的多个样式定义

TL/DR:我有一个关于如何在下面执行此操作的游戏计划; 但是,我想知道我的计划是否会被证明过于复杂,以及在开始构建这个项目之前需要考虑哪些额外的考虑因素.虽然我不是一个经验丰富的程序员,但我不是要求代码; 我要求有经验的Word VBA程序员反馈我的整个想法/方法是否是一个巨大的错误.

我有一个文档"模板"(还不是模板文件类型 - 我希望如下所述创建它)用于报告.该报告分为不同部分:

Letter to the Client
Table of Contents
Section I
    Title Page
    Body
        1.0
        2.0
Section II
    Title Page
    Body
        1.0
        2.0
Appendix A
    Title Page
    Body
Appendix B
    Title Page
    Body
Run Code Online (Sandbox Code Playgroud)

我希望每个主要的"metasection"(例如Letter,Section I,Section II,Appendices)具有不同的样式和格式.这可以通过为每个元集具有多个样式来实现,例如:

Normal-Letter
Normal-SectionI
Normal-Appendices
Heading1-Letter
Heading1-SectionI
Heading1-Appendices 
Run Code Online (Sandbox Code Playgroud)

这很快就会变得无法管理.

为了避免用户不得不通过大量的样式来找到正确的样式(并且值得注意的是,如果这个报告的用户必须这样做,他们可能不会使用样式AT ALL),这将是不错的如果我可以有相同的样式名称(例如,Normal)取决于它找到的文档的哪个部分.或者换句话说,我希望文档具有多个样式集,具体取决于部分.

用户体验的目标是:

  1. 用户只需根据需要应用Normal样式,Heading1样式等.
  2. 通过Modify Style对话框或其他方式编辑样式时,将更新已注册的特定于部分的样式定义.
  3. 更改样式或打开,保存或打印文档时,样式将自动且透明地应用.
  4. 替代方法:如果自动/透明样式应用程序证明太困难,请使用简单的命令按钮执行样式应用程序.

我在VBA中如何做到这一点的初步想法是:

  1. 编写VBA代码(可能是一个类),使得每个文档部分都有Normals和Heading1s等样式注册表.
  2. 编写样式应用程序子例程,该子例程遍历已注册的文档部分,选择具有每个注册样式的所有部分,并从样式注册表应用特定于部分的样式(保留任何与样式定义不同的样式).
  3. 编写样式更新子例程,自动并透明地更新已注册的样式定义
  4. 样式应用程序子例程执行任何时候样式应用于其中一个注册部分(所以我需要绑定到事件).
  5. 样式更新子例程在注册部分中的样式定义发生更改时执行(所以这是我需要监视的另一个事件).

我以前在超级用户上问了一个关于这个话题的类似问题 …

vba ms-word word-vba office-2013

3
推荐指数
1
解决办法
918
查看次数

VBA在Word 2016中编译,但不在Word 2010中编译

自Word 2010以来MS向MS Word引入的一项新功能是LayoutColumns FootnoteOptions.

因此,下面的代码行在Word 2016中编译: ActiveDocument.Range.FootnoteOptions.LayoutColumns但不在Word 2010中(我没有在Word 2013中测试过).

条件编译器语句似乎没有帮助......除了包含Word 2010的VBA7之外,应用程序版本没有任何内容.

https://msdn.microsoft.com/VBA/Language-Reference-VBA/articles/compiler-constants

所以这不会在Word 2010中编译:

Sub testWd10()
#If Win64 And VBA7 Then
    ActiveDocument.Range.FootnoteOptions.LayoutColumns
#End If
End Sub
Run Code Online (Sandbox Code Playgroud)

编译器错误 - 找不到方法或数据成员

vba ms-word word-vba

3
推荐指数
1
解决办法
100
查看次数