2013-01-23 58 views
1

我试图用VBA纯粹创建数据验证单元格。问题是,如果验证列表中的 项目之一是包含逗号的Excel公式(例如以下代码中的IF()),则会生成错误。产生Excel VBA - 验证数据和逗号分隔字符串

Dim str As String 
str = "=IF(SUM(A1:A2) = 0, ""Zero"", SUM(A1:A2)) , Item 2 , Item 3 , Item 4" 

s1.Range("B6").Validation.Add Type:=xlValidateList, _ 
      AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=str 

错误(运行时错误1004),因为它限定了串在第一逗号,所以确认的第一项是"=IF(SUM(A1:A2) = 0"。我希望有逗号的转义字符(如C中的\)来避免这种情况。 我想验证列表中显示为这样:

<result of IF() function> 
Item 2 
Item 3 
Item 4 

注:我不能使用范围的验证数据。如果用户删除了该电子表格将被破坏的范围。

+0

发布问题时,尽可能提供尽可能多的信息。产生的错误是什么?错误是否明确表明它存在转义字符问题或者是您的推理?请编辑答案以包含错误。 –

+2

至少在Excel 2003中,我不相信你可以在验证中混合公式和列表。看看你是否可以做你想在Excel中完成的事情(也许在宏记录器上)。你可以扩展你的公式来测试其他项目,但是如果这很重要,你不会得到一个下拉框。 –

+1

你可以使用一个范围,并将其放在一个xlveryhidden和锁定的工作表上,除非你的用户精通vba,他们甚至不会知道它的存在。 – scott

回答

0

在单元格A1或A2更改时,如何重置WorkSheet_Change事件以重置数据验证?

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 
Dim ValidationString As String 
Dim rngChanging As Excel.Range 
Dim rngWithValidation As Excel.Range 

Set rngChanging = Range("A1:A2") 
Set rngWithValidation = Range("B6") 
If Not Intersect(Target, rngChanging) Is Nothing Then 
    With rngWithValidation 
     .Validation.Delete 
     If WorksheetFunction.Sum(rngChanging) = 0 Then 
      ValidationString = "0" 
     Else 
      ValidationString = WorksheetFunction.Sum(rngChanging) 
     End If 
     ValidationString = ValidationString & ",Item2,Item3,Item4" 
     .Validation.Add Type:=xlValidateList, Formula1:=ValidationString 
    End With 
End If 
End Sub 
+0

这很聪明。但是,对于工作表上的每个数据验证字段(365)都是不切实际的。 我很难相信使用公式验证数据的唯一方法是将公式放在一个范围内......但我想这只是VBA – P4U1

+0

因此,每个验证的项目列表是否有所不同?如果是这样,反正你会有很多代码。如果不是,那么你可能能够定义两个命名范围,一个与总计单元格,一个与列表。假设他们有一些模式,捕捉总和范围内的任何变化并将数据验证应用到相应的单元格。我过去做过类似的事情,并且不错。 –