带有vba数组的数据验证列表

时间:2016-02-04 21:28:40

标签: excel vba excel-vba

我正在尝试使用vba代码创建数据验证列表。数组根据许多变量生成自己。

这是我正在使用的代码

            For iter4 = 2 To nbWsheet

            If Wsheet.Cells(iter4, 2) = Cat And Wsheet.Cells(iter4, ColMod) = "x" And Wsheet.Cells(iter4, ColStd) = "oui" Then

                TableValue = Wsheet.Cells(iter4, 4).Value & " - " & Wsheet.Cells(iter4, 7).Value
                Table = Table & "," & TableValue

            End If

        Next iter4

        'Ajout de la list
        With Cells(iGlob, 5).Validation
            .Delete
            .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
            xlBetween, Formula1:=Table
            .IgnoreBlank = True
            .InCellDropdown = True
            .InputTitle = ""
            .ErrorTitle = ""
            .InputMessage = ""
            .ErrorMessage = ""
            .ShowInput = ""
            .ShowError = ""
        End With

此代码的问题是表中的文本包含","。生成数据验证列表时,每次看到","它把文字放在新的一行......

有没有办法保持","在桌子里面

我要显示的内容的例子:123456 - Engine,300HP

希望我很清楚,

谢谢,

2 个答案:

答案 0 :(得分:3)

我认为自定义列表中的逗号没有转义字符。根据{{​​3}},逗号始终将条目分开。

一种解决方法是使用动态命名范围。

  1. 在隐藏表单或某处使用备用列,让我们使用A列进行演示
  2. 在A1中,输入“DV_ListTable”,定义名称为 DV_ListTable
  3. 的单元格
  4. 突出显示A栏,将其定义为 DV_ListColumn
  5. 使用名称管理器将另一个名称定义为 DV_List ,其中RefersTo为
    =OFFSET(DV_ListTable,1,0,IF(COUNTA(DV_ListColumn)-1=0,1,COUNTA(DV_ListColumn)-1)) {
    {3}}
  6. 现在数据验证将是(单元格D1):
    MSDN Validation.Add

    然后用于更改此动态范围内容的宏将是:

    Option Explicit
    
    Sub ChangeDataValidationList()
        Dim i As Long, Table As String, TableValue As String
        Dim oRng As Range, oValues As Variant
    
        With ThisWorkbook
            ' Build up the new table list
            Table = .Names("DV_ListTable").RefersToRange.Value ' Header
            ' For Demo, the data is from Columns next to the DV_ListTable
            Set oRng = .Names("DV_ListTable").RefersToRange.Offset(0, 1)
            Do Until IsEmpty(oRng)
                TableValue = oRng.Value & " - " & oRng.Offset(0, 1).Value
                Table = Table & vbCrLf & TableValue
                Set oRng = oRng.Offset(1, 0)
            Loop
            Set oRng = Nothing
            ' Clear the contents in the column
            .Names("DV_ListColumn").RefersToRange.ClearContents
            ' Paste in the values separated by vbCrLf
            oValues = Application.Transpose(Split(Table, vbCrLf))
            .Names("DV_ListTable").RefersToRange.Resize(UBound(oValues)) = oValues
            Set oValues = Nothing
        End With
    End Sub
    

    执行“ChangeDataValisationList”后的示例屏幕截图:
    ResultingNameManager

    希望这可以帮助您找到正确的解决方向。

答案 1 :(得分:0)

用Chr(44)替换“,”。 Chr函数根据VBA字符代码返回一个字符串。我发现当你想插入一个双引号(Chr(34)为双引号)时它也会派上用场。