根据按下的按钮,从vba用户表单返回不同的值

时间:2014-04-12 22:57:19

标签: excel vba excel-vba

我一直在创建一个首字母缩略词查找宏,它将位于word中的自定义工具栏上。运行时,它会在文档中搜索首字母缩略词并将它们放在表格中。我想要包含一些用户表单,以便在宏找到首字母缩写词时,用户可以选择预定义的定义(从excel文档中获取)或输入他们自己的新词(我知道多个首字母缩略词含义是不赞成的,但它会发生)。 / p>

无论如何我被卡住了。我创建了一个带有三个按钮的用户表单。文本输入和标签。现在我已经设法使用找到的首字母缩略词设置标签文本但是我似乎无法通过按钮更改变量userChoice,并且如果适用,保存新输入的定义。

下面是测试宏我一直在尝试

Sub userFormTest()

Dim objExcel As Object
Dim objWbk As Object
Dim rngSearch As Object
Dim rngFound As Object
Dim targetCellValue As String
Dim userChoice As Integer

Set objDoc = ActiveDocument
Set objExcel = CreateObject("Excel.Application")
Set objWbk = objExcel.Workbooks.Open("C:\Users\Dave\Documents\Test_Definitions.xlsx")
objExcel.Visible = True
objWbk.Activate

With objWbk.Sheets("Sheet1")

Set rngSearch = .Range(.Range("A1"), .Range("A" & .Rows.Count).End(-4162))

Set rngFound = rngSearch.Find(What:="AA", After:=.Range("A1"), LookAt:=1)



If rngFound Is Nothing Then

    UserForm1.Label1.Caption = "Acronym:    AA" & vbCr & _
                               "Definition: Not found, please enter a definition below" & vbCr & _
                               "            or choose to ignore this acronym"
    UserForm1.Show

'an if statement here so that if the add button was pressed it adds to doc etc

Else

    targetCellValue = .Cells(rngFound.Row, 2).Value

    UserForm2.Label1.Caption = "Acronym:    AA" & vbCr & _
                               "Definition: " & targetCellValue
    UserForm2.Show

'an if statement here so that if the add button was pressed it adds to doc etc

End If

End With

objWbk.Close Saved = True

Set rngFound = Nothing
Set rngSearch = Nothing
Set objWbk = Nothing
objExcel.Visible = True
Set objExcel = Nothing
Set objDoc = Nothing

End Sub

我确实知道这可以在button_click()subs中完成,但是我已经在其他宏中打开了所有文档等。或者是否可以链接到那些已打开的文档?老实说,无论哪种方式,我都希望返回主宏,只需将表单用于用户输入。

1 个答案:

答案 0 :(得分:2)

  

我确实知道这可以在button_click()subs中完成。但是我已经在其他宏中打开了所有文档等。或者是否可以链接到那些已打开的文档?

您可以在button_click()潜水艇和主宏之间进行链接,以修改userChoice的价值。

<强>答案

您需要的是一些userform元素(如文本框),它可以保存您的值,以便您可以在主宏中引用它。看起来你已经有了这个元素(基于你的标题&#34;未找到,请在下面输入定义&#34;)。让我们说该元素是一个名为Definition的TextBox。然后让我们说你想在人们推动&#34;添加&#34;之后回到主宏。按钮,就像您看到的那样(根据您的评论&#34;因此,如果按下添加按钮,则会添加到文档&#34;)。

在Userform1和Userform2的每一个中,你都需要这样的东西:

Private Sub AddButton_Click()

    Userform1/Userform2.Hide

End Sub

这会让你回到主宏,你可以在那里跟进:

If Userform1/Userform2.Definition.Value = Whatever Then
    'if the add button was pressed it adds to doc etc
End If

您现有评论的位置。请注意,您可以在此设置userChoice = Userform1.Definition.Value,但不需要,因为Userform1.Definition.Value已包含您需要跟踪的信息。

其他材料

我可以建议创建Userform变量以包含它们的.Show实例,而不是立即使用New来使用Userform1和Userform2的默认实例,而不是将它们的新实例分配给它们。这样:

Dim UnknownDefinition As Userform1
Set UnknownDefinition = New Userform1
UnknownDefinition.Show

或者,如果您想要获得最佳效果,可以按照此处推荐的更多方法来制作正确实例化的抽象用户形式:

Rubberduck VBA: How to create a properly instanced, abstracted userform

现在有来自帖子的作者的奖金引用@Mathieu Guindon:

  

make Definition a proper property, with the Property Let mutator changing the label value on top of changing its private backing field's value; avoid accessing form controls outside the form, treat them as private even if VBA makes them public.

     

Calling code wants data, not controls. You can extract properties/data, but not controls, into a dedicated model class.