忽略空值时串联多个字符串

时间:2018-09-17 16:44:55

标签: ms-access access-vba

我正在尝试找到一种解决方案,该解决方案是如何从大约15个不同的选项中连接字符串的。每个结果都来自一个复选框,该复选框根据一个人在特定区域内的居住状态来选择。

我知道如何将复选框选项转换为文本结果。我要寻找的是如何获取这些文本结果,将它们组合起来,然后忽略空结果,以便没有任何奇怪的空格或格式。

简而言之,如果有人在15个结果中选择3个,它将干净地合并这3个结果,而忽略其余的结果。例如:FL,CA,NY

1 个答案:

答案 0 :(得分:2)

当然,有多种方法可以实现,并且由于您未提供任何代码或尝试执行此操作的示例,因此我将提供两个选择。

1 -您可以使用&+运算符的组合来连接值。

例如,假设您有15个复选框,它们的名称都类似chkState01,chkState02 ...到chkState15。为了简化我的示例代码,我们假设当直接在代码中将复选框控件引用为chkState01时,如果选中了复选框,它将返回其表示的州(即NY)的2个字母的字符串缩写。 ,否则如果未选中此复选框,它将返回Null。这样,您可以通过两种方式获得结果:

选项A

StateList = (chkState01 + ",") & (chkState02 + ",") & (chkState03 + ",") ....

如果这3个复选框返回以下值

chkState01 = "NY"
chkState02 = Null
chkState03 = "FL"

然后,该级联代码的结果将是:

NY,FL,

请注意,该字符串以一个额外的逗号(,)结尾,并且由于您无法提前知道将选中多少个复选框,因此始终会出现此逗号。然后,您需要先从列表中删除该逗号,然后才能使用它。

选项B

'Create the list with a trailing comma that will need removed
Dim x as Integer
For x = 1 to 15
    StateList = StateList & (Me("chkState" & Format(x, "00")) + ",")
Next x

或者,您可以这样做:

'Create the list without a trailing comma
Dim x as Integer
For x = 1 to 15
    If Not IsNull(Me("chkState" & Format(x, "00"))) Then
        If Len(StateList) > 0 Then
            StateList = StateList & "," & Me("chkState" & Format(x, "00"))
        Else
            StateList = Me("chkState" & Format(x, "00"))
        End If
    End If
Next x

请注意,您可以通过将控件的名称“生成”为字符串并以Me("yourcontrolname")格式对其进行引用来引用表单上的控件。这是命名类似控件的一个优点,该控件以一种类似这样的循环结构的方式命名。 Format命令将x返回的数字格式化为2位数字,并带有前导零i.e. 1 becomes 01

此外,使用&连接两个项目(其中至少一个是字符串)将始终导致输出字符串(Null&“ S” =“ S”)。但是,使用+连接两个项(其中至少一个为Null)将始终导致Null输出(Null +“ S” = Null)。因此,值返回Null的复选框不会导致结果中包含其他逗号。

2 -您可以编写更复杂的代码来动态遍历复选框并构建输出列表。

更有可能,您将需要使用其他代码来确定哪个复选框是哪个状态的缩写,并返回正确的字符串值。也许您将状态缩写作为复选框名称i.e. chkState_NY, chkState_FL的一部分,或者已经将缩写放在每个复选框的Tag属性中。

假设您使用了特殊的控件命名chkState_NY, chkState_FL。您可以执行以下操作:

Dim ctl as Access.Control

For Each ctl in Me.Controls
    If ctl.Name Like "chkState_??" Then
        If ctl.Value = True Then
            If Len(StateList) > 0 Then
                StateList = StateList & "," & Right(ctl.Name,2)
            Else
                StateList = Right(ctl.Name,2)
            End If
        End If
    End If
Next ctl