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如果有帮助,我的用户形态就像这样;
干杯,
卡勒姆
答案 0 :(得分:0)
IDK实际问题是什么,但我试图重新创建你的问题,并决定向你展示我拥有的东西。看看是否有任何帮助你。
所有这些代码都在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"
namesArray
和cbIniValues
)中设置名称及其初始布尔值确保您拥有以&#34; CheckBox1&#34;,&#34; CheckBox2&#34;等命名的复选框,以及具有以&#34; label1&#34;命名的标签, &#34; Label2&#34;等等
确保&#34; CheckBoxX&#34;与&#34; LabelX&#34;
确保UserForm_Initialize
和namesArray
与标签和复选框具有相同的商品编号