Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 宏填充动态数组(从userform复选框选择)_Arrays_Excel_Vba - Fatal编程技术网

Arrays 宏填充动态数组(从userform复选框选择)

Arrays 宏填充动态数组(从userform复选框选择),arrays,excel,vba,Arrays,Excel,Vba,我有一个数组(我将有4个),它是根据用户选择1到4个复选框填充的 我的问题是:为什么我不能通过循环检查复选框并找到所选的复选框来直接填充数组 这不起作用: Dim chkBox As Control Dim sectArr() As Variant Dim s as long s = 0 For Each chkBox In Me.SectorsFrame.Controls 'Sector-level frame If TypeName(chkBox) = "CheckBox" And chk

我有一个数组(我将有4个),它是根据用户选择1到4个复选框填充的

我的问题是:为什么我不能通过循环检查复选框并找到所选的复选框来直接填充数组

这不起作用:

Dim chkBox As Control
Dim sectArr() As Variant
Dim s as long
s = 0

For Each chkBox In Me.SectorsFrame.Controls 'Sector-level frame
If TypeName(chkBox) = "CheckBox" And chkBox.Value = True Then
   sectArr(s) = chkBox.Caption
   s = s + 1        
End If
Next
这项工作:

Dim chkBox As Control
Dim sectArr As Variant, sectStr As String
sectStr = ""

For Each chkBox In Me.SectorsFrame.Controls 'Sector-level frame
    If TypeName(chkBox) = "CheckBox" And chkBox.Value = True Then
        sectStr = sectStr & "|" & chkBox.Caption
    End If
Next
sectStr = Right(sectStr, Len(sectStr) - 1)
sectArr = Split(sectStr, "|")
我得到的要么是“下标超出范围”(数组中有括号),要么是类型不匹配(没有括号)

我不想处理字符串,然后将它们切碎并用它们填充数组(我必须处理它们吗??)。不过,我对这一点了解不够,不知道我能做什么,不能做什么

我接下来的3个数组可以有1-6个选项,一个二维数组可以有多个选项

==================================编辑2/3/2016@1800z==========================

这看起来很有希望-我接受了您所说的内容,并对其进行了一些处理,得出了以下代码(可能仍然很笨拙):


我的猜测是,如果第一个复选框为false,那么数组就不会从
0
@findwindw开始填充。我们一直在测试第一个复选框是否为true-到目前为止还没有尝试取消选中第一个复选框(false)。不过要记住这一点是件好事(我不会马上想到这一点,而且以后还要对其进行故障排除)。您需要
Redim
数组以首先设置索引边界。这就是为什么会出现“下标超出范围”错误。如果您只存储选中控件的标题,则可能需要在控件之间循环,并首先计算检查次数,然后再重新输入
Redim
,然后捕获标题。@PeterT我会记住这一点,谢谢。作为后续:如果我循环通过它们来获得复选框的数量,是否有方法避免再次循环通过它们来将所述框分配给数组?我试图让事情变得更小更快,我(认为我)添加了时间循环/计数循环/添加vs,仅使用字符串并将其插入数组(或者我错了吗?),您可以使用
集合
字典
并在单个循环中完成。我猜如果第一个复选框为false,那么它将中断,因此您的数组不会从
0开始填充。
@findwindowo一直在测试第一个复选框是否为true-到目前为止还没有尝试取消选中第一个复选框(false)。不过要记住这一点是件好事(我不会马上想到这一点,而且以后还要对其进行故障排除)。您需要
Redim
数组以首先设置索引边界。这就是为什么会出现“下标超出范围”错误。如果您只存储选中控件的标题,则可能需要在控件之间循环,并首先计算检查次数,然后再重新输入
Redim
,然后捕获标题。@PeterT我会记住这一点,谢谢。作为后续:如果我循环通过它们来获得复选框的数量,是否有方法避免再次循环通过它们来将所述框分配给数组?我试图让事情变得更小更快,我(想我)添加了时间循环/计数循环/添加vs,只使用字符串并将其插入数组(或者我错了吗?)。或者填充数组,你可以使用
集合
字典
并在单个循环中完成。
Dim chkBox As Control
Dim sectArr() As Variant
Dim sec As Long

 sec = 0
    For Each chkBox In Me.SectorsFrame.Controls 'Sector-level frame
        If TypeName(chkBox) = "CheckBox" And chkBox.Value = True Then
            ReDim Preserve sectArr(sec)
            sectArr(sec) = chkBox.Caption
            sec = sec + 1
        End If
    Next