Performance 创建将文本框输入打印到文档中特定位置的用户表单
我在用VBA word开发一个系统。该系统的目标是用文本框中的输入替换文档中的几个不同单词。到目前为止,我有一个userform,它有12个不同的文本框,每个文本框包含用户输入的内容,以替换文档中的单词。我在userform中创建了一个按钮,用于将文本框中的所有输入打印到文档中。 对于每个文本框,我都编写了以下代码:Performance 创建将文本框输入打印到文档中特定位置的用户表单,performance,vba,loops,userform,undo-redo,Performance,Vba,Loops,Userform,Undo Redo,我在用VBA word开发一个系统。该系统的目标是用文本框中的输入替换文档中的几个不同单词。到目前为止,我有一个userform,它有12个不同的文本框,每个文本框包含用户输入的内容,以替换文档中的单词。我在userform中创建了一个按钮,用于将文本框中的所有输入打印到文档中。 对于每个文本框,我都编写了以下代码: Sub FindAndReplaceAllStoriesHopefully() Dim myStoryRange As Range ' ' 'Loop replaces eve
Sub FindAndReplaceAllStoriesHopefully()
Dim myStoryRange As Range
'
'
'Loop replaces everything with <KLANTNAAM> in the document
For Each myStoryRange In ActiveDocument.StoryRanges
With myStoryRange.Find
.Text = "<KLANTNAAM>"
.Replacement.Text = TextBox1.Value
.Wrap = wdFindContinue
.Execute Replace:=wdReplaceAll
End With
Do While Not (myStoryRange.NextStoryRange Is Nothing)
Set myStoryRange = myStoryRange.NextStoryRange
With myStoryRange.Find
.Text = "<KLANTNAAM>"
.Replacement.Text = TextBox1.Value
.Wrap = wdFindContinue
.Execute Replace:=wdReplaceAll
End With
Loop
Next myStoryRange
我有几个问题无法解决:
- 单击按钮并且用户未填写某些文本框后,仍会替换标记的单词,如
,并将其从文档中删除 - 宏的性能不是很好,因为同一代码被复制了12次
- 单击按钮后,用户无法轻松地撤消在userform中键入的错误,因为结果已经打印出来
Private Sub CommandButton1_Click()
Dim numBlank As Long, n As Long, txt As String
Dim bookMarkName As String
numBlank = Me.CountBlanks
If numBlank > 0 Then
If MsgBox(numBlank & " entries are blank!. Continue?", _
vbExclamation + vbOKCancel) <> vbOK Then
Exit Sub
End If
End If
For n = 1 To 4
txt = Me.Controls("Textbox" & n).Text
bookMarkName = "BOOKMARK" & n
FindAndReplaceAllStoriesHopefully bookMarkName, txt
Next n
End Sub
Function CountBlanks() As Long
Dim n As Long, b As Long
b = 0
For n = 1 To 4
If Len(Me.Controls("Textbox" & n).Text) = 0 Then
b = b + 1
End If
Next n
CountBlanks = n
End Function
Private子命令按钮1\u单击()
暗淡的麻木和长的一样,n和长的一样,txt和字符串一样
将书签名称设置为字符串
numBlank=Me.CountBlanks
如果numBlank>0,则
如果MsgBox(numBlank&“条目为空!”。是否继续?”_
vb感叹号+vbOKCancel)vbOK Then
出口接头
如果结束
如果结束
对于n=1到4
txt=Me.Controls(“Textbox”&n).Text
bookMarkName=“BOOKMARK”&n
FindReplaceAllStoriesName,txt
下一个
端接头
函数CountBlanks()的长度为
n等于长,b等于长
b=0
对于n=1到4
如果Len(Me.Controls(“Textbox”&n.Text)=0,则
b=b+1
如果结束
下一个
CountBlanks=n
端函数
您可以为要填充的每个不同值创建一个书签,然后为该值的每个“重复”创建对每个书签的交叉引用。然后,您可以使用表单中的文本填充每个书签(添加空白值检查!),只要您在执行此操作时小心不要删除书签,您就可以稍后返回并进行调整。当用户重新打开表单时,您可以从每个书签中提取文本,用“当前”值填充表单。在不删除书签的情况下替换书签中的文本:@TimWilliams谢谢,我确实也在考虑书签。然而,您的最后一个链接建议使用带有代码UpdateBookmark(BookmarkToUpdate为String,TextToUse为String)的子例程,其中TextToUse必须是文本框的值,我似乎无法确定如何将其调暗,以便它使用该值。不管怎样,我使用一个按钮的点击功能使其工作,我将文本框的名称变暗为字符串,并给它们该文本框的值。然后,我用callupdatebookmark(“bookmarkstring”,文本框的暗显字符串)调用了该函数,但我似乎不知道如何在这里检查空白值。
Private Sub CommandButton1_Click()
Dim numBlank As Long, n As Long, txt As String
Dim bookMarkName As String
numBlank = Me.CountBlanks
If numBlank > 0 Then
If MsgBox(numBlank & " entries are blank!. Continue?", _
vbExclamation + vbOKCancel) <> vbOK Then
Exit Sub
End If
End If
For n = 1 To 4
txt = Me.Controls("Textbox" & n).Text
bookMarkName = "BOOKMARK" & n
FindAndReplaceAllStoriesHopefully bookMarkName, txt
Next n
End Sub
Function CountBlanks() As Long
Dim n As Long, b As Long
b = 0
For n = 1 To 4
If Len(Me.Controls("Textbox" & n).Text) = 0 Then
b = b + 1
End If
Next n
CountBlanks = n
End Function