Vba 使用userform上的按钮获取变量并继续执行sub

Vba 使用userform上的按钮获取变量并继续执行sub,vba,excel,dictionary,Vba,Excel,Dictionary,我在excel中有一个用户表单,其中一个组合框使用另一个工作表中的范围编译下拉列表。我使用范围中的字典定义了下拉列表,并强制组合框匹配(这样做是为了确保用户在添加新公司之前尝试查找该公司)。但是,我确实希望他们能够在绝对需要的情况下将新公司添加到列表中,因此有一个标记为“添加公司”的按钮,现在需要它将他们输入的公司添加到列表/字典中,有什么想法吗 我想避免启动一个全新的userform,最理想的情况是我在点击按钮时会想到一个输入框,但我不确定如何将该变量强制返回到原始userform中 我目前的

我在excel中有一个用户表单,其中一个组合框使用另一个工作表中的范围编译下拉列表。我使用范围中的字典定义了下拉列表,并强制组合框匹配(这样做是为了确保用户在添加新公司之前尝试查找该公司)。但是,我确实希望他们能够在绝对需要的情况下将新公司添加到列表中,因此有一个标记为“添加公司”的按钮,现在需要它将他们输入的公司添加到列表/字典中,有什么想法吗

我想避免启动一个全新的userform,最理想的情况是我在点击按钮时会想到一个输入框,但我不确定如何将该变量强制返回到原始userform中

我目前的代码是:

Private Sub UserForm_Initialize()

    Dim Acctsht As Worksheet
    Dim ValSet
    Dim FinanInst
    Dim objFinanInst As Object
    Dim objAcctType As Object
    Dim objNickname As Object
    Dim objFourDig As Object
    Dim objAcctClass As Object
    Dim objDescript As Object
    Dim CompanyDict As New Scripting.Dictionary
    Dim Tempsht As Worksheet
    Dim NewCompTemp As String

    Set Acctsht = ActiveWorkbook.Sheets("Accounts")

    With Acctsht.Range("b2:b" & Range("b:b").SpecialCells(xlLastCell).Row)
        ValSet = .Value
    End With

    With CompanyDict
            .comparemode = 1
        For Each FinanInst In ValSet
            If Not .exists(FinanInst) Then .Add FinanInst, Nothing
        Next
        If .Count Then CBoxFinanInst.List = Application.Transpose(.keys)
    End With

    With CboxAcctType
        .AddItem "Checking Account"
        .AddItem "Fixed Loan"
        .AddItem "Investment Account"
        .AddItem "Money Market Account"
        .AddItem "Revolving Credit"
        .AddItem "Savings Account"

    End With

    With CBoxAcctClass
        .AddItem "Asset"
        .AddItem "Liability"

    End With

End Sub

Private Sub CButtonAddCompany_Click()

    Dim NewCompTemp As String

    Unload FrmCreateAccount

    NewCompTemp = InputBox("Please enter new company exactly as you wish it to appear", Title:="Create New Company")
    FrmCreateAccount.Show (NewCompTemp)

    Exit Sub

End Sub
为了回应Jean Pierre在下面的评论,我尝试了以下代码,但仍然不起作用:

私有子CButtonAddCompany_Click()

端接头

无论输入什么并存储为NewCompTemp,组合框中只显示原始下拉列表

我明白了,感谢让·皮埃尔把我送到正确的方向!我没有意识到我可以运行子程序,让它在表单上重置字典


基本上,字典是从初始化操作设置的,但是,我没有意识到我可以在按钮单击操作上重新触发同一字典的设置。一旦我这样做并结束了sub,它就会返回到原始的userformSub,瞧。谢谢你的帮助,谢谢你的耐心。(这里的老生物学家正在学习新技能)。

大家好,欢迎来到StackOverFlow,您是否尝试将您的
与CompanyDict….
代码添加到
CButtonAddCompany….
sub.如果您只是将代码替换为
FrmCreateAccount.Show(NewCompTemp)应该可以工作
您还需要包括设置会计科目范围的部分。嗨,Jean Pierre,谢谢您的回答!很抱歉,我很迟钝,但我还没有完全精通VBA,我正在学习…你能再解释一下吗?我仍然不确定如何将新变量(NewCompTemp)添加到字典中并传递回表单组合框。@JMB如果您找到了自己查询的答案,请随时将其作为答案发布给将来希望找到类似问题解决方案的任何人。关于这里,欢迎来到StackOverFlow,您是否尝试将您的
与CompanyDict….
代码添加到
CButtonAddCompany….
sub.如果您只是将代码放在
FrmCreateAccount.Show(NewCompTemp)的位置,则应该可以使用
您还需要包括设置会计科目范围的部分。嗨,Jean Pierre,谢谢您的回答!很抱歉,我很迟钝,但我还没有完全精通VBA,我正在学习…你能再解释一下吗?我仍然不确定如何将新变量(NewCompTemp)添加到字典中并传递回表单组合框。@JMB如果您找到了自己查询的答案,请随时将其作为答案发布给将来希望找到类似问题解决方案的任何人。当做
Dim NewCompTemp As String
Dim Acctsht As Worksheet
Dim CompanyDict As New Scripting.Dictionary

Set Acctsht = ActiveWorkbook.Sheets("Accounts")

NewCompTemp = InputBox("Please enter new company exactly as you wish it to appear", Title:="Create New Company")

With Acctsht.Range("b2:b" & Range("b:b").SpecialCells(xlLastCell).Row)
    ValSet = .Value
End With

With CompanyDict
        .comparemode = 1
    For Each FinanInst In ValSet
        If Not .exists(FinanInst) Then .Add FinanInst, Nothing
    Next
    If .Count Then CBoxFinanInst.List = Application.Transpose(.keys)
End With

With CompanyDict
    .Add CompanyDict.Count + 1, NewCompTemp
End With

Exit Sub