【问题标题】:VBA string array with unknown amount of strings具有未知数量的字符串的 VBA 字符串数组
【发布时间】:2015-02-06 15:15:30
【问题描述】:

首先让我祝贺你在一个极好的论坛!它对我有帮助!到目前为止,我的小程序正在运行......现在我终于卡住了。

我正在尝试自动化 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 索引。 我不知道该怎么做,我什至不知道如何包含逗号和“和”。

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

【问题讨论】:

    标签: arrays string vba indexoutofboundsexception


    【解决方案1】:

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

    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 更好。

    【讨论】:

    • 效果非常好!也使我的一半代码变得多余......我想这对学习曲线总是有好处的!我对其进行了一些更改,以便通过在循环中插入 If 语句,倒数第二个检查不会添加昏迷: While k
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-16
      • 2021-04-07
      • 2015-09-08
      • 2017-05-02
      • 2018-09-01
      • 2023-03-28
      • 2021-11-13
      相关资源
      最近更新 更多