Vba 为变量创建动态输入

Vba 为变量创建动态输入,vba,ms-access,Vba,Ms Access,我希望有人能帮忙,我是编程新手,我的问题是: 表单上的40个复选框需要逐个检查布尔值“True”或“False”(由用户检查或取消检查),以便我可以为每个“True”案例运行单独的代码 我试图在“MS Access checkbox reference”中包含一个计数器“I”,用于变量,以给出给定复选框的值。下面的代码应该显示我试图实现的目标,有没有人能在不使用非常高级的解决方案的情况下为我指出正确的方向?我认为这是因为它不能在一个步骤中执行所有这些,或者因为它只将变量的输入视为字符串,而不是要

我希望有人能帮忙,我是编程新手,我的问题是:

表单上的40个复选框需要逐个检查布尔值“True”或“False”(由用户检查或取消检查),以便我可以为每个“True”案例运行单独的代码

我试图在“MS Access checkbox reference”中包含一个计数器“I”,用于变量,以给出给定复选框的值。下面的代码应该显示我试图实现的目标,有没有人能在不使用非常高级的解决方案的情况下为我指出正确的方向?我认为这是因为它不能在一个步骤中执行所有这些,或者因为它只将变量的输入视为字符串,而不是要执行的命令:

Do While Flag = True

Dim CheckboxVar As Boolean
i = i + 1

If i = 40 Then
    Flag = False
End If

CheckboxVar = "Me.Checkbox" & i & ".Value"
AddWhereSQL = SQLBuilder (CheckboxVar)
Loop

(检索Checkbox1的值并将其发送给SQLBuilder,检索Checkbox2并将其发送给SQLBuilder,依此类推)

若要在控件之间循环,可以执行以下操作:

Dim i As Long
For i = 1 To 40
    If Me.Controls("CheckBoxControlName" & i).Value = -1 Then
        'The control value is True
    End If
Next i

如果将代码放在标准模块中,请将
Me
更改为
Forms!YourFormName

要在控件之间循环,可以执行以下操作:

Dim i As Long
For i = 1 To 40
    If Me.Controls("CheckBoxControlName" & i).Value = -1 Then
        'The control value is True
    End If
Next i
如果将代码放在标准模块中,请将
Me
更改为
Forms!YourFormName

我认为您需要一个“for”循环。可能是这样的:

CheckboxVar = " WHERE "
For i = 1 to 40
    CheckboxVar = Me.Controls("Checkbox" & i).Value = True & " AND " & checkboxVar
next
我想你需要一个“for”循环。可能是这样的:

CheckboxVar = " WHERE "
For i = 1 to 40
    CheckboxVar = Me.Controls("Checkbox" & i).Value = True & " AND " & checkboxVar
next

像这样循环检查您的复选框:

Sub Test()
    Dim ctrl As Control

    For Each ctrl In Me.Controls
        If TypeOf ctrl Is CheckBox Then
            If ctrl.Value = True Then
                'do something
            End If
        End If
    Next ctrl
End Sub

将您的复选框命名为“Checkbox1”、“Checkbox2”等是令人厌烦的,并且不是最佳命名实践。上面的代码将找到表单上的每个复选框,但您可以很容易地将其限制为具有特定标记的所有复选框,例如。

循环检查您的复选框,如下所示:

Sub Test()
    Dim ctrl As Control

    For Each ctrl In Me.Controls
        If TypeOf ctrl Is CheckBox Then
            If ctrl.Value = True Then
                'do something
            End If
        End If
    Next ctrl
End Sub


将您的复选框命名为“Checkbox1”、“Checkbox2”等是令人厌烦的,并且不是最佳命名实践。上面的代码将找到表单上的每个复选框,但您可以轻松地将其限制为具有特定标记的所有复选框,例如。

小注:使用整数而不是长整数以节省内存和执行时间(最大值为40)@Erik von Asmuth VBA在内部将所有整数转换为长整数,因此没有性能优势。@ErikvonAsmuth。我今天也学到了一些新东西(谢谢Kostas K.!)@KostasK。谢谢你的提醒,很抱歉你的批评不正确。我想我可以直接优化所有使用我曾经编写的整数的代码。@ErikvonAsmuth或使用Rubberduck检查,在两次单击中立即用
Long
声明替换所有
Integer
声明;-)小提示:使用整数而不是long来节省内存和执行时间(最大值为40)@Erik von Asmuth VBA在内部将所有整数转换为long,因此没有性能优势。@ErikvonAsmuth。我今天也学到了一些新东西(谢谢Kostas K.!)@Kostash。谢谢你的提醒,很抱歉你的批评不正确。我想我可以直接优化所有使用我曾经编写的整数的代码。@ErikvonAsmuth或使用Rubberduck检查,在两次单击中立即用
Long
声明替换所有
Integer
声明;-)请注意,您可能必须考虑不应在循环中的复选框。您可以为此使用标记(例如,为所有应设置的复选框设置标记,如果ctrl.tag=“something”,则选中
),您的代码应用于用户表单,但不应用于访问表单(它们不是MSForms)。--表单上有40个复选框,唯一合理的命名方式可能是
Checkbox1
Checkbox2
,…@ErikvonAsmuth,标记有效——出于同样的原因,我建议将它们都放在一个框架中,并循环通过
UserForm1.Frame1.Controls
。@CallumDA是的,但正如Andre所说,这是一个访问问题,而不是用户表单,因此帧不可用。标签是访问的常用方式。在MS Access中使用调整后(删除
MSForms.
,将
UserForm1
更改为
Me
),您的进一步代码可以正常工作,@Andre现在应该可以了,我同意应避免复选框1、复选框2等。请注意,您可能必须考虑不应该在循环中的复选框。您可以为此使用标记(例如,为所有应设置的复选框设置标记,如果ctrl.tag=“something”,则选中
),您的代码应用于用户表单,但不应用于访问表单(它们不是MSForms)。--表单上有40个复选框,唯一合理的命名方式可能是
Checkbox1
Checkbox2
,…@ErikvonAsmuth,标记有效——出于同样的原因,我建议将它们都放在一个框架中,并循环通过
UserForm1.Frame1.Controls
。@CallumDA是的,但正如Andre所说,这是一个访问问题,而不是用户表单,因此帧不可用。标签是访问的常用方式。在MS Access中使用调整后(删除
MSForms.
,将
UserForm1
更改为
Me
),您的进一步代码将可以正常工作,@Andre现在应该可以了,我同意CallumDA的观点,应该避免使用复选框1、复选框2等。感谢大家对我的案例和角色提出的建议,Kostas K的解决方案效果最佳(已实施并正在运行)。我使用控件的名称而不是标记,并根据哪个复选框为True运行单个/唯一代码。这个网站是一个很棒的地方,有很多很棒的人,非常感谢。MichaelThank感谢大家的建议,对于我的案例和角色,Kostas K的解决方案效果最好(已经实现并运行)。我使用控件的名称而不是标记,并根据哪个复选框为True运行单个/唯一代码。这个网站是一个很棒的地方,有很多很棒的人,非常感谢。迈克尔