Performance 创建将文本框输入打印到文档中特定位置的用户表单

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

我在用VBA word开发一个系统。该系统的目标是用文本框中的输入替换文档中的几个不同单词。到目前为止,我有一个userform,它有12个不同的文本框,每个文本框包含用户输入的内容,以替换文档中的单词。我在userform中创建了一个按钮,用于将文本框中的所有输入打印到文档中。 对于每个文本框,我都编写了以下代码:

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