Userform控制宏中的变量

时间:2016-05-09 10:35:37

标签: vba userform

Morning Guys,

我的项目遇到了一个小障碍。我是VBA的新手,我正在尽我所能,通过这样做来学习。但我似乎无法理解宏/用户形式的互动。

我有一个带有一个文本框和9个复选框的用户表单。这应该显示userform,允许用户指定工作表名称,并(从9个用户的列表中)选择哪个是活动的(true或false)。

在我的主要内容中,我只有一个

Allocator.show

命令,正如您可能已经猜到的那样,allocator是我的用户名称。

然后我只是尝试了一些事情,所以我不知道其余的用户形式代码是否正确;

Private Sub cbGo_Click()

Unload Allocator

End Sub

Private Sub cboxAlison_Click()

If Me.cboxAlison.Value = True Then
    AlisonYN = True
        Else
    AlisonYN = False
End If

End Sub

Private Sub cboxBeverly_Click()

If Me.cboxBeverly.Value = True Then
    BevelyYN = True
        Else
    BevelyYN = False
End If

End Sub

Private Sub cboxCallum_Click()

If Me.cboxCallum.Value = True Then
    CallumYN = True
        Else
    CallumYN = False
End If

End Sub

Private Sub cboxEllen_Click()

If Me.cboxEllen.Value = True Then
    EllenYN = True
        Else
    EllenYN = False
End If

End Sub

Private Sub cboxGeoff_Click()

If Me.cboxGeoff.Value = True Then
    GeoffYN = True
        Else
    GeoffYN = False
End If

End Sub

Private Sub cboxJames_Click()

If Me.cboxJames.Value = True Then
    JamesYN = True
        Else
    JamesYN = False
End If

End Sub

Private Sub cboxLouise_Click()

If Me.cboxLouise.Value = True Then
    LouiseYN = True
        Else
    LouiseYN = False
End If

End Sub

Private Sub cboxMick_Click()

If Me.cboxMick.Value = True Then
    MickYN = True
        Else
    MickYN = False
End If

End Sub

Private Sub cboxTammy_Click()

If Me.cboxTammy.Value = True Then
    TammyYN = True
        Else
    TammyYN = False
End If

End Sub

Private Sub tbRPName_Change()

End Sub

Private Sub UserForm_Initialize()

Dim GeoffYN, TammyYN, CallumYN, JamesYN, MickYN, AlisonYN, BeverlyYN, LouiseYN, EllenYN As Boolean
Dim RP_Name As String

Me.cboxGeoff.Value = True


Me.cboxTammy.Value = True


Me.cboxCallum.Value = True


Me.cboxJames.Value = True


Me.cboxMick.Value = False


Me.cboxAlison.Value = False


Me.cboxBeverly.Value = False


Me.cboxLouise.Value = False


Me.cboxEllen.Value = False

Me.tbRPName = ""

End Sub

所有指定的用户变量(xxxxYN)在我的主模块中都是公共的。

这些是我想在用户选中所需的框后将其作为true或false拉回到我的主宏中的变量,以及作为字符串的名称,然后继续运行原始宏。

任何帮助都会非常感激,我此刻似乎正在围成一圈!

PS如果有帮助,我的用户形态就像这样;

UserForm

干杯,

卡勒姆

3 个答案:

答案 0 :(得分:0)

IDK实际问题是什么,但我试图重新创建你的问题,并决定向你展示我拥有的东西。看看是否有任何帮助你。

enter image description here

enter image description here

所有这些代码都在userform代码中,而不是在模块级别。当我更改复选框值时,将存储这些值(在主子数据库之外,在“检查”子点击事件中验证)。

答案 1 :(得分:0)

为了使代码更短,您可以直接将复选框的值赋给变量

Dim test as Boolean
test = me.CheckBox1.Value

您可以将其插入到转到按钮的代码中

答案 2 :(得分:0)

你写了"所有指定的用户变量(xxxxYN)在我的主模块中是公共的。" 但是我们看到它们在userform' s {{1也是:

Sub UserForm_Initialize

即使您在任何模块中声明了与Private Sub UserForm_Initialize() Dim GeoffYN, TammyYN, CallumYN, JamesYN, MickYN, AlisonYN, BeverlyYN, LouiseYN, EllenYN As Boolean Dim RP_Name As Stringn ... 相同的变量,Userform变量也会隐藏其公共 namsakes ,因此任何Userform设置都不会"看到&#34 ; 在其他模块中

因此,您最好删除"同名"的Userform调光声明。并只留下Public一个

此外,在您使用的声明语句中,未与特定类型明确关联的每个变量都隐式关联到Variant类型

所以在主模块中你应该使用"调光"声明如下:

Public

但是,如果以上所有内容都能帮到您,那么我建议您切换到"类"与Dictionary对象一起使用的方法,如下所示

Public GeoffYN As Boolean, TammyYN As Boolean, CallumYN As Boolean, JamesYN As Boolean, MickYN As Boolean, AlisonYN As Boolean, BeverlyYN As Boolean, LouiseYN As Boolean, EllenYN As Boolean 代码窗格中放置以下代码

Allocator

添加一个"类模块"到你的项目

点击插入 - > VBA IDE主功能区菜单中的类模块

或右键单击VBA IDE项目窗口中的任意位置,然后选择插入 - >后续子菜单中的类模块

扩展"类模块"项目窗口中的节点

如果您没有看到项目窗口,可以点击查看 - >打开它。主功能区菜单中的项目窗口,或按" Ctrl + R"

选择你添加的新课程(它应该是一些" Class1"或者喜欢的)并将其名称更改为" ChkBx_Class"在属性窗口"名称"文本框

如果您没有看到属性窗口,可以点击查看 - >打开它。主功能区菜单中的属性窗口或按" F4"

在“类模块”代码窗格中放置以下内容

Option Explicit

Dim chkBoxes() As ChkBx_Class 'array of type "ChkBx_Class" which you define in a Class Module

Private Sub UserForm_Initialize()
Dim nControls As Integer, i As Integer
Dim namesArray As Variant, cbIniValues As Variant

UFInit = True

namesArray = Array("Geoff", "Tammy", "Callum", "James", "Mick", "Alison", "Beverly", "Louise", "Ellen") '<== set here the names to be associated to every CheckBox
cbIniValues = Array(True, True, True, True, False, False, False, False, False) '<== set here the initial values of checkboxes

nControls = UBound(namesArray) + 1 '<== retrieve the number of CheckBoxes you're going to consider in the Form
ReDim chkBoxes(1 To nControls) As ChkBx_Class 'redim the "ChkBx_Class" array
For i = 1 To nControls

    Set chkBoxes(i) = New ChkBx_Class 'initialize a new instance of 'ChkBoxClass' class and store it in the array i-th position
    With chkBoxes(i)
        Set .ChkBox = Me.Controls("CheckBox" & i) 'assign the correct CheckBox control to its "ChkBox" property
        .Name = namesArray(i - 1)  ' assign the Name property of the Checkbox

        .ChkBox.Value = cbIniValues(i - 1) 'set the checkbox correct initial value
         Me.Controls("Label" & i) = .Name ' set the corresponding label caption

         dealersDict.Add .Name, .ChkBox.Value ' fill the dictionary initial pair of Dealer-name/checkbox-value
    End With

Next i

Me.tbRPName.Text = ""

UFInit = False

End Sub


Private Sub cbGo_Click()

Me.Hide

End Sub

按如下方式编辑主子模块

Option Explicit

'declare class properties: they will be associated in every instance of this class.
Public WithEvents ChkBox As MSForms.CheckBox ' "ChkBox" is now a property of the class of type CheckBox. it's associated to events
Public Name As String

' events associated to ChkBox class property
Sub ChkBox_Click()
    If Not UFInit Then dealersDict.Item(Me.Name) = Me.ChkBox.Value ' set the dictionary pair of Dealer-name/checkbox-value
End Sub

创建对Microsoft Scripting Runtime Library的引用以使用词典。

这是通过在Visual Basic编辑器(VBE)中选择Tools➜References命令来完成的,该命令会弹出一个对话框,在其中找到您要查找的列表框&#34; Microsoft Scripting Runtime&#34;然后选中一个复选标记,然后按OK。

运行主子

每当您需要检索与给定名称相关联的布尔值时,您只需使用

Option Explicit

Public dealersDict As New Scripting.Dictionary
Public UFInit As Boolean

Sub main()
myval = "io"
Dim myKey As Variant

Allocator.Show
Unload Allocator

For Each myKey In dealersDict
    MsgBox myKey & ": " & dealersDict(myKey)
Next myKey

End Sub

其中name可以是:

  • 一个带有名字的字符串文字(&#34; Alison&#34;,&#34; Mick&#34;,..)

  • 一个字符串变量,其值存储了所需的名称,因此您可能在代码中的某处键入了:

    myBool = dealersDict(name)

这种方法为您提供了很大的灵活性,因为您只需要:

  • Dim name as string name = "Mick"

    中的这两个数组(namesArraycbIniValues)中设置名称及其初始布尔值
  • 确保您拥有以&#34; CheckBox1&#34;,&#34; CheckBox2&#34;等命名的复选框,以及具有以&#34; label1&#34;命名的标签, &#34; Label2&#34;等等

  • 确保&#34; CheckBoxX&#34;与&#34; LabelX&#34;

  • 对齐
  • 确保UserForm_InitializenamesArray与标签和复选框具有相同的商品编号