具有未知字符串数量的VBA字符串数组

时间:2015-02-06 15:15:30

标签: arrays string vba indexoutofboundsexception

首先,请允许我在一个精湛的论坛上祝贺你们!这对我有帮助!到目前为止,让我的小程序工作......现在我终于陷入了困境。

我正在尝试自动化Outlook,以通过UserForm向客户发送定制的优惠。

我们提供5种类型的解决方案,我不知道客户是否需要1(DCF)或2(Top-Slice)或3(Ertragswert)或4(Belwert)或5(Sachwert)。所以我需要一种方法让代码检查勾选了多少个Checkbox,然后将它们排成一个字符串(我将它命名为ValTyp)并用逗号分隔它们并在最后一个之前插入一个“和”。假设客户想要1,3和5.解决方案将是DCF,Ertragswert和Sachwert。到目前为止,我的复选框都按以下方式检查值:

Public iSach As String
Private Sub CKSach_Click()

   Dim Sach As Boolean

   Sach = CKSach.Value

   If Sach = True Then
      iSach = "Sachwert "
      ValCount = ValCount + 1
   Else
      iSach = ""
      ValCount = ValCount - 1
   End If

End Sub

我试图为类似的部分构建一个IF语句,该部分有3个选项,其中一个是必须的:

If (iRics <> "" And iBelSTD <> "" And iImmo <> "") Then
    Standard = (iRics & ", " & iBelSTD & "und " & iImmo)
ElseIf (iBelSTD <> "" Or iImmo <> "") Then
    Standard = (iRics & "und " & iImmo & iBelSTD)
Else
    Stadard = iRics
End If

我正在考虑创建一个数组,其长度为ValCount ......但我似乎完全无法使其工作:

Dim Services() As String
ReDim Services(0 To 4) As String

If iDCF <> "" Then
   Services(0) = iDCF
End If
If iDCF <> "" Then
   Services(1) = iCore
End If
If iDCF <> "" Then
   Services(2) = iErtrag
End If
If iDCF <> "" Then
   Services(3) = iSach
End If
If iDCF <> "" Then
   Services(4) = iBelVT
End If

Debug.Print Services(0, 1, 2, 3, 4)

我在边界外得到一个运行时错误9索引。 我不知道该怎么做,我甚至没有得到如何包含逗号和“和”。

任何帮助都将非常感谢! 提前致谢! 崖

2 个答案:

答案 0 :(得分:0)

我会这样做:首先,将复选框存储在一个集合中:

Dim cbs As New Collection
cbs.Add checkbox1
cbs.Add checkbox2
'...
cbs.Add checkbox5

因此,您在其中循环以将选中的值添加到新集合中:

Dim myStr As String: myStr = ""
Dim cbsCheck As New Collection
'count "true"
For j = 1 To cbs.Count
    If cbs(j).Value = True Then
        cbsCheck.Add cbs(j)
    End If
Next j
'hence you compose the string
If cbsCheck.Count = 0 Then
    myStr = "No element selected"
ElseIf cbsCheck.Count = 1 Then
    myStr = "You selected " & cbsCheck(1).Caption
Else
    k = 1
    myStr = "You selected "
    While k < cbsCheck.Count 
        myStr = myStr & cbsCheck(k).Caption & ", "
        k = k + 1
    Loop
    myStr = myStr & "and " & cbsCheck(k+1).Caption
End If

注意如果要构建一个事先不知道大小的元素数组,在95%的情况下,对象Collection优于对象{{ 1}}。

答案 1 :(得分:0)

您可以使用集合而不是数组,这在大多数情况下是更好的解决方案。如果由于某种原因确实需要数组,可以使用redim函数调整数组大小:

示例:

Dim myArray(3) As String

    myArray(1) = "a"
    myArray(2) = "b"
    myArray(3) = "c"
    ReDim myArray(4) As String
    myArray(4) = "d"

您还可以在ReDim之后添加Preserve以确保这些值不会丢失。