我想知道如何避免使用Windows剪贴板,当你想"复制"Word文档的多个部分时(在宏中使用VBA)
为什么要避免?因为我们在服务器上使用Word,在多用户环境中(我知道它是正式的不赞成)
否则,使用Selection.Copy和Selection.Paste方法可以轻松完成.
谢谢.
我需要在Word文档中存储自定义元数据.'文档属性'限制为255个字节,但我的数据是>> 10k
我们正在使用VBA编写一个单词扩展来与我们的应用程序进行交互,并希望将我们的应用程序数据存储在word文档中.这个想法是用户可以只共享word文档而不共享我们应用程序的任何其他数据文件.
有没有人想过如何在Office 2003+文档中有效存储任意元数据?
所以,我刚刚开始理解正则表达式,我发现学习曲线相当陡峭.但是,stackoverflow在我的实验过程中非常有用.我想写一个特定的单词宏,但我还没有想出办法.我希望能够在一个文档中找到彼此10个左右的单词中的两个单词,然后将这些单词用斜体字表示,如果这些单词的间隔超过10个单词或者顺序不同,我希望宏不要斜体那些话.
我一直在使用以下正则表达式:
\bPanama\W+(?:\w+\W+){0,10}?Canal\b
Run Code Online (Sandbox Code Playgroud)
然而,它只允许我操纵整个字符串作为一个整体,包括其间的随机单词.此外,.Replace函数只允许我用不同的字符串替换该字符串而不更改格式样式.
有经验的人是否知道如何使这项工作?它甚至可以吗?
编辑:这是我到目前为止.我有两个问题.首先,我不知道如何仅从匹配的正则表达式中选择单词"Panama"和"Canal",并仅替换那些单词(而不是中间单词).其次,我只是不知道如何替换与不同格式匹配的正则表达式,只有不同的文本字符串 - 可能只是因为对单词宏不熟悉.
Sub RegText()
Dim re As regExp
Dim para As Paragraph
Dim rng As Range
Set re = New regExp
re.Pattern = "\bPanama\W+(?:\w+\W+){0,10}?Canal\b"
re.IgnoreCase = True
re.Global = True
For Each para In ActiveDocument.Paragraphs
Set rng = para.Range
rng.MoveEnd unit:=wdCharacter, Count:=-1
Text$ = rng.Text + "Modified"
rng.Text = re.Replace(rng.Text, Text$)
Next para
End Sub
Run Code Online (Sandbox Code Playgroud)
好的,感谢蒂姆·威廉姆斯的帮助下面我得到了以下解决方案,它在某些方面有点笨拙并且它绝不是纯粹的正则表达式,但它确实完成了工作.如果有人有更好的解决方案或想法如何解决这个问题,我会很高兴听到它.再一次,我的粗暴强迫搜索和替换功能的变化是一个有点令人尴尬的粗糙,但至少它的工作原理...
Sub RegText()
Dim re As regExp
Dim para As Paragraph
Dim rng As Range
Dim txt …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用VBA在一个Word文档中提取句子并将其放入另一个Word文档中.因此,例如,如果我们需要找到组织的标题,我们将遵循以下算法:
搜索"标题"
在"标题"之后执行(获取)每个字符并且(停止)直到"地址"
当我单击Word 2010中的复选框时,我想运行宏.
请注意,我既不想要"Legacy Forms"复选框也不想要"ActiveX"复选框!它们只能在一些"受保护的文档模式"下工作并且看起来很难看,但是我想要在编写文档时可以选择和取消选择的新文件,这对我来说看起来更好.
我知道,使用遗留表单,您可以在输入表单元素时直接插入宏,而在离开表单元素时可以直接插入宏,您可以在VBA中捕获事件,如
Sub CheckboxXY_Click()
Run Code Online (Sandbox Code Playgroud)
但这对Word 2010复选框不起作用,即使我给它们描述和标记名称.
重复:这些是我想要使用的形式(以防万一有人建议我使用Legacy的形式):

这就是它们在文档中的样子(鼠标悬停):

我不敢相信我是第一个试过这个的人......
我有一个存在于SharePoint文档库中的.docm文件.打开时,宏会触发并提示用户输入新的文件名和文件夹,然后使用.SaveAs2将指定位置的文件副本保存为不带宏的.docx.
我不能使用具有正确.dotm的SP内容类型作为模板,因为库中有超过30种不同的文件模板.我必须在SharePoint库中使用.docm,然后确保用户将该文件的副本保存到其个人驱动器中.
所以我在open事件中使用了一些代码.我让用户指定一个文件夹和一个文件名.然后.SaveAs2获取这些参数并将当前文件保存在新路径中,新名称为不带宏的普通.docx文件.我就饶你如何的细节strFolder和strDoc聚集.请放心,他们存在.我有一个带有完整文件名的debug.print,它是正确的.
With o
.SaveAs2 strFolder & strDoc & ".docx", wdFormatDocumentDefault
End With
Run Code Online (Sandbox Code Playgroud)
问题是此代码会显示一条消息,指出无法找到该文件.

好吧,呃,我正在尝试将文件保存在这个位置.当然它不存在.这才是重点.(请注意,该文件夹确实存在.)
消息框关闭后,Word愉快地将文件保存到指定的位置.
此外,如果从SharePoint以读取模式打开原始文件并且新文件路径位于网络驱动器上,则仅弹出消息.
如果,则不会弹出该消息
在生产系统中,用户将无法选择"编辑"或"只读".它们将默认为只读.此外,用户将无法保存到本地C:\驱动器,因为业务系统将其配置文件和"我的文档"放在网络驱动器(H :)上.
我试过了
msoFileDialogSaveAs - 相同的消息Application.DisplayAlert = False(我知道,但我很绝望)或wdAlertsNone. - 不起作用.消息仍显示On Error Resume Next或On Error Goto MyHandler没有错误处理程序的消息弹出,但被解雇.该消息具有蓝色的"i"图标,因此可能不会将其解释为错误,而是作为一条信息.如何让消息消失?
此外,虽然这不是必不可少的,但我们很高兴知道:
有没有办法检测用户何时使用VBA在Microsoft Word中按键.我已经搜索过这样做的方法.我还搜索了一些方法,这些方法可以解决这个问题,例如检测插入点何时移动,或者检测到新单词放在word文档中的时间,但我一直没看.我目前正在使用,appWord_WindowSelectionChange(ByVal Sel As Selection)但在您键入时无法检测到.
我很感激有人向我展示如何检测按键,或者能够向我展示一个可以实现相同目标的解决方法.
编辑
如果上面我想要的内容摘要不清楚,我道歉.我所拥有的是一个使用它的子appWord_WindowSelectionChange(ByVal Sel As Selection).然而,我想要的是,只要在word文档中输入任何数据,就会触发此子目录,例如.一个字母或一个空白字符.例如,如果单词文档的页脚中存在字符计数,并且我已更新此字符计数,则字符计数字段应在用户键入文档时更新.
你能推荐我在VBA中作为参考或指针类型的一个很好的替代品吗?我一直在努力与这样的表达:
dblMyArray( i * lngDimension0 + j * lngDimension1 + k * lngDimension2, l * lngDimension3 + m * lngDimension4 ) = dblMyArray( i * lngDimension0 + j * lngDimension1 + k * lngDimension2, l * lngDimension3 + m * lngDimension4 ) + 1
Run Code Online (Sandbox Code Playgroud)
如果我想在例如C++中的多维数组中累积值,我可以这样写:
double& rElement = dblMyArray[ i * lngDimension0 + j * lngDimension1 + k * lngDimension2 ][ l * lngDimension3 + m * lngDimension4 ];
rElement += 1;
Run Code Online (Sandbox Code Playgroud)
要么
double* pElement = &dblMyArray[ i * lngDimension0 …Run Code Online (Sandbox Code Playgroud) 我正在处理几个Word文档,这些文档要求我将制表符转换或替换为逗号.文字可能如下所示:
Hello........world (dot)
Hello------------World (dash)
Hello____World (line)
Hello world (none)
Run Code Online (Sandbox Code Playgroud)
Word为制表位提供了4种选择:点,短划线,直线和无.但是,我想只将前3个领导者类型替换为逗号.最后一个不会像这样改变:
Hello,world
Hello,World
Hello,World
Hello world
Run Code Online (Sandbox Code Playgroud)
在Word中查找和替换选项卡功能不起作用.因此,经过大量的谷歌搜索,我试图从各种来源"复制并粘贴"到一个简单的宏来完成这项任务(我是Word宏和VBA的新手):
Sub Macro1()
For Each para In ActiveDocument.Content.Paragraphs
For Each aTab In para.TabStops
If aTab.Leader = wdTabLeaderDots _
Or aTab.Leader = wdTabLeaderDashes _
Or aTab.Leader = wdTabLeaderLines Then
TypeText = ","
aTab.Clear
End If
Next aTab
Next para
End Sub
Run Code Online (Sandbox Code Playgroud)
参考:https://msdn.microsoft.com/en-us/library/office/ff192806.aspx
Word说行中有错误:TypeText =","我不知道如何纠正它.
你能帮我看一下这个宏吗?
提前致谢.
P/S:Slai有一个解决这个问题的方法.我只是将第二个代码复制到宏中,稍微修改一下以使其工作:
Sub Macro1()
Dim p As Paragraph, t As TabStop
For Each p In ActiveDocument.Paragraphs
For …Run Code Online (Sandbox Code Playgroud) 在MS Word中,我添加了一些代码来查看文档是否缺少其数字签名,或者至少我认为我做了.我决定在其他系统上测试之前分享.
Sub test()
If Not ThisDocument.VBASigned Then
Debug.Print "I am NOT signed"
End If
End Sub
Run Code Online (Sandbox Code Playgroud)
问题:无论文档是否具有数字签名,上述代码都会产生相同的结果.如果我通过删除我修改代码Not仍然会得到意想不到的结果.
我试图通过以下方式来强迫事情:
If Not CBool(ThisDocument.VBASigned) Then
Run Code Online (Sandbox Code Playgroud)
但更令人惊讶的是,以下代码也失败了:
Sub test()
Dim isSigned As Boolean
isSigned = ThisDocument.VBASigned
If Not isSigned Then
Debug.Print "I am NOT signed"
End If
End Sub
Run Code Online (Sandbox Code Playgroud)
即使ThisDocument.VBASignedAND isSigned都是TRUE......
但如果改变isSigned = ThisDocument.VBASigned,isSigned = True那么一切都按预期工作.
谁能证实这一点?有什么想法吗?
以下编辑回答了一些问题:
是的,使用Option Explicit,Yes也试过Debug.
这段代码:
Option Explicit
Sub test()
Dim isSigned As Boolean
isSigned …Run Code Online (Sandbox Code Playgroud)