我工作的公司有一个内部开发的Word2003/VBA应用程序,其大小已经大约6.5 mb,他们希望为它添加额外的200多个宏,我认为这将使它更大.在我看来这是一个糟糕的想法,但找到用VSTO或其他一些更有用的技术重新开发工具的资源将是一个挑战.
所以这是我的问题:
从本质上讲,我想知道是否有令人信服的技术理由咬紧牙关并重新开发此应用程序.
我有一个Word文档,其中包含一个名为"更新"的命令按钮.
如何使用VBA删除此按钮?
我希望在将word文件发送到打印机之前对其进行格式化检查,并且它需要对用户完全透明(没有额外的控件,只需使用UI提供的标准打印选项).是否有OnPrint或BeforePrint事件,或者可以在这方面使用的东西,我可以附加一个宏,就像我可以使用Open,Close或Save一样?这感觉应该很简单......但这些都是着名的遗言.
罗伯,提前谢谢
我在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的正确方法.
此外,如果我将最后一行更改为无参数调用,它会突然正常工作.
我有一个带有一堆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,所以)
谢谢!
在MS Word中创建表的代码是什么?
我已经使用宏的记录功能来查看它是如何编写的,我不知道如何解释它.
你能不能在录制宏时画桌子?它使"绘制表"功能变灰.
我需要制作一个在表格中有一些合并单元格的talbe - 如果我可以绘制表格并使用宏记录会更容易但似乎我不能那样做...

我已经使用绘图功能绘制了下表,但我无法记录它.
救命?!
我正在尝试移植我们在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上获得.
非常感谢!
编辑 …
我正在从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) 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)取决于它找到的文档的哪个部分.或者换句话说,我希望文档具有多个样式集,具体取决于部分.
用户体验的目标是:
Normal样式,Heading1样式等.Modify Style对话框或其他方式编辑样式时,将更新已注册的特定于部分的样式定义.我在VBA中如何做到这一点的初步想法是:
Normals和Heading1s等样式注册表.自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)
word-vba ×10
vba ×8
ms-word ×6
excel-vba ×2
arguments ×1
excel ×1
macos ×1
ms-office ×1
office-2013 ×1
parameters ×1
printing ×1
word-vba-mac ×1
wsh ×1