Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA:如何在不使用范围引用的情况下添加包含逗号包含值的数据验证列表_Vba_Excel - Fatal编程技术网

Excel VBA:如何在不使用范围引用的情况下添加包含逗号包含值的数据验证列表

Excel VBA:如何在不使用范围引用的情况下添加包含逗号包含值的数据验证列表,vba,excel,Vba,Excel,我需要向单元格中添加一个数据验证列表,该单元格中的几个值包含逗号。 我也有这样的问题 但是我不能引用一个区域,因为我正在创建一个新工作簿,并向其单元格提供数据验证列表。因此,引用对我不起作用,因为某些值包含逗号,所以我无法将范围设置为字符串并在公式1之后使用该值 .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ xlBetween, Formula1:=myStr 我发现的另一个想法是,我

我需要向单元格中添加一个数据验证列表,该单元格中的几个值包含逗号。 我也有这样的问题

但是我不能引用一个区域,因为我正在创建一个新工作簿,并向其单元格提供数据验证列表。因此,引用对我不起作用,因为某些值包含逗号,所以我无法将范围设置为字符串并在公式1之后使用该值

.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:=myStr
我发现的另一个想法是,我可以用其他字符(虚拟字符)替换逗号,并在填充单元格后用逗号替换该虚拟字符,但问题是如何用逗号替换该虚拟字符?

另一种方法是重写公式1,以便我可以使用伪字符作为分隔符,但我不知道如何实现这一点


请提出任何解决方案,我的最终目标是创建一个新工作簿,并通过Excel VBA用数据验证列表填充它。

因为其他答案说明,逗号不能转义。就我所知,唯一的解决方案是在新工作簿中添加一个额外的工作表,在列表中添加值,命名该区域,隐藏该工作表,并引用命名区域。这是相当多的步骤,但实际上是唯一的方法。

让我们对单元格B9使用虚拟字符方法。这将设置DV:

其中,Chr(130)假人。
.ShowError
很重要

现在,为了替换虚拟对象,我们使用事件宏:


正如@snoopen所建议的,我已经创建了一个虚拟工作簿,其中包含数据验证列表,每次代码运行时,它都会作为虚拟工作簿保存到所需的新文件名。之后,它会用所需的数据填充该工作表。

您是否可以创建一个新工作表并将列表放在那里,然后引用它?我可以,但问题是逗号包含值。如果我将整个项目存储在myStr中,那么列表验证也会自动将它们拆分为新项目。我不需要。看,尤其是Siddharth的答案使用了
chr(130)
——看起来像个逗号,但不是一个。Siddharth的答案没有什么帮助,但我可以通过任何方法将chr(130)改成逗号吗?如果chr(130)看起来和逗号相同,为什么需要更改它?谢谢你的答案,但它不起作用。它只更改选定列表项的虚拟字符,而不是整个项目。我建议对此进行编辑,其中使用Chr(130)作为虚拟字符。这将满足@civam在列表中看起来像逗号并在选择后实际导出为逗号的所有要求。@snoopen感谢您的改进!谢谢你的建议,但这不是我的要求。我很感激这不是你的要求,但是这是在你的列表中有一个真正逗号的唯一方法。如果您不想创建单独的工作表,我建议您使用@vacip建议的Chr(130)。我创建了一个虚拟工作簿,每次代码运行时,它都会用新的文件名保存该工作簿。我很好奇您是否尝试了@Gary的学生使用Chr(130)提出的更新解决方案?我本以为这是一个理想的解决方案,因为它不需要额外的工作表。
Sub InternalString2()
    Range("B9").Select
    With Selection.Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:=Replace("alpha%ralpha,beta%waiter,gamma%hammer,delta%faucet","%",Chr(130))
        .IgnoreBlank = True
        .InCellDropdown = True
        .InputTitle = ""
        .ErrorTitle = ""
        .InputMessage = ""
        .ErrorMessage = ""
        .ShowInput = True
        .ShowError = False
    End With
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
    If Intersect(Target, Range("B9")) Is Nothing Then Exit Sub

    Application.EnableEvents = False
        Range("B9").Replace What:=Chr(130), Replacement:=","
    Application.EnableEvents = True
End Sub