2015-02-06 64 views
0

首先让我所有人在一个精彩的论坛上恭喜你!它帮助我加载!到目前为止,让我的小程序工作......现在我终于被卡住了。字符串数量未知的VBA字符串数组

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

我们提供5种类型的解决方案,我不知道客户是需要1(DCF)还是2(顶部)或3(Ertragswert)或4(Belwert)或5(Sachwert) 。因此,我需要一种方法让代码检查勾选了多少个复选框,然后将它们排序为一个字符串(我已将其命名为ValTyp),并用逗号分隔它们,并在最后加上“and”。说客户需要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指标外边界。 我不知道该怎么做,我甚至都不知道如何包含逗号和“和”。

任何帮助都将非常感谢! 在此先感谢! 崖

回答

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比对象好String Array

+0

它工作得非常好!也使我的一半代码冗余......我认为这对学习曲线总是有好处的! 我改变了一点,以便倒数第二次检查没有通过在循环中插入If语句来添加彗差: 虽然k 2015-02-09 08:18:47

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以确保值不会走开。