2013-01-23 88 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

因此,每個驗證的項目列表是否有所不同?如果是這樣,反正你會有很多代碼。如果不是,那麼你可能能夠定義兩個命名範圍,一個與總計單元格,一個與列表。假設他們有一些模式,捕捉總和範圍內的任何變化並將數據驗證應用到相應的單元格。我過去做過類似的事情,並且不錯。 –