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 以确保值不会丢失。
首先让我祝贺你的论坛很棒!它帮助了我很多!到目前为止让我的小程序正常工作......现在我终于被卡住了。
我正在尝试使 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 以确保值不会丢失。