在框架内的不同复选框中选择案例 - Userform问题

时间:2014-08-17 12:46:30

标签: vba excel-vba excel

我在框架中添加了几个复选框,我需要在这些复选框中创建一个选择案例语句。有没有办法通过select case语句选择框架内的复选框?

我在下面尝试过(我的框架名为diet_frame)但是我遇到了类型不匹配错误。

Private Sub add_button_Click()

Dim target_range As Range: Set target_range = Range("A2:G29")
Dim period As String

target_range.End(xlDown).Offset(1, 0).Select
With Selection: i = 1
    Selection.Value = name_input
    Selection.Offset(0, i) = period_input.Value

    Select Case diet_frame  <<<--- name of my frame, trying to get to the checkboxes placed inside it. 

        Case meat_input.Value = True
            Selection.Offset(0, i + 1) = carnivore
        Case vegetation_input.Value = True
            Selection.Offset(0, i + 1) = herbivore
        Case vegetation_input = True And meat_input = True
            Selection.Offset(0, i + 1) = omnivore
    End Select

    Selection.Offset(0, i + 6) = group_input.Value
End With

2 个答案:

答案 0 :(得分:1)

帮助说

  • select case语句需要一个数字或字符串表达式 - 即一个表达式,结果可以通过播放自动转换来计算为数字或字符串。所以严格地在表单上,​​除非Frame对象的默认属性实际返回了数字或字符串表达式,否则你的代码会出现类型不匹配错误
  • select case语句中的表达式的结果将与不同Case子句的表达式的结果匹配 - 因此这些表达式也必须是类型兼容的

尝试使用True关键字作为select case语句的表达式 - 布尔值可自动转换为数字和字符串 - 以及每个Case子句的复选框值。这也需要你将你的复选框都为True的情况移动到Case层次结构中的第一个位置 - 原因是当表达式匹配多个Case子句时,只执行第一个匹配后的语句< / p>

答案 1 :(得分:1)

帧通常用于对选项(无线电)按钮进行分组,以使它们互斥。我不认为他们提供了您期望的功能。你需要明确一些事情:name_input,period_input,group_input来自哪里?如果这些是细胞,我希望看到一些&#34; RangeRefersTo&#34;。您是否有一组复选框或许多与Selection对象的这些行对齐的集合?以编程方式生成或手动生成(并保留工作簿的生命周期)?你可能意味着&#34; ForEach ...在选择&#34;而不是&#34; With&#34;? With不会为你迭代细胞。顺便说一下,你不会增加你的&#34; i&#34;列号,为什么不只是硬编码1,2和7?如果您有许多静态复选框,请使用tag属性存储与它们关联的行号。如果你没有绑定细胞,这是一种将它们绑定到特定细胞的方法。如果你有很多盒子和绑定单元格,那么你就可以不再使用3个名字,而不会有额外的麻烦。你想轮询一堆复选框? (quite possibly pseudocode) Dim ctrl as control For Each ctrl in controls If ctrl.typeof = "checkbox" then 'maybe further specificity based on If ctrl.name = "somename" ... ' more code... cells(ctrl.tag,7).value2 = whatever End if

就您的&#34;选择&#34;而言,如果您只是放Select Case True(奇怪但有效),您的代码将按原样运行,但对于Omnivores,您需要设置值3倍。实际上,你甚至不需要VBA。你可以使用单元格公式完成所有这些。将1加入真正的粘合细胞用于肉类,2用于蔬菜。将它们的总和放在目标单元格中​​的IF或CHOOSE公式中(其中&#34; ... vore&#34;将出现)。所以1是Carnie,2是Veggie,3是Omni。在Gnu / Linux盒子上或者我更明确。