VBA 字符串数组数量未知

VBA string array with unknown amount of strings

首先让我祝贺你的论坛很棒!它帮助了我很多!到目前为止让我的小程序正常工作......现在我终于被卡住了。

我正在尝试使 Outlook 自动化,以通过用户表单向客户发送定制的报价。

我们提供 5 种解决方案,我不知道客户是否想要 1 (DCF) 或 2 (Top-Slice) 或 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 索引超出范围。 我不知道该怎么做,甚至不知道如何包含逗号和 "and".

任何帮助都将不胜感激! 提前致谢! 悬崖

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

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.

您可以使用集合而不是数组,这在大多数情况下是更好的解决方案。如果出于某种原因你真的需要一个数组,你可以使用 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 以确保值不会丢失。