2014-03-01 24 views
1

我正在嘗試將數據驗證添加到基於一組單元格的另一個工作表的一組單元格中。問題在於其他工作表中單元格的範圍不是靜態的,並且可能會更改。數據驗證和字符串構造出錯

總的來說,我正在尋找在A10一組下拉框:A29細胞與它們的成分

當我使用= INDIRECT:只需使用Excel驗證嚮導它的作品(「成分A2 A320!)但我需要最終單元是動態的。

我有這個當前VBA代碼

Dim endrow As Integer 

endrow = Sheets("Ingredients").Range("A" & Rows.Count).End(xlUp).Row 

Range("A10:A29").Select 
With Selection.Validation 
     .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ 
     xlBetween, Formula1:="=INDIRECT(" & Chr(34) & "Ingredients!A2:A" & endrow & Chr(34) & ")" 
     .IgnoreBlank = True 
     .InCellDropdown = True 
     .InputTitle = "" 
     .ErrorTitle = "" 
     .InputMessage = "" 
     .ErrorMessage = "" 
     .ShowInput = True 
     .ShowError = True 
    End With 

我得到這個代碼1004錯誤。

要使它便於任何人看着這個最終的結果,我的公式部分瞄準的是:

=INDIRECT("Ingredients!A2:A*endrow*) 
+1

你不需要VBA來做到這一點。改用指定的範圍。你也可以找到很多關於動態驗證的文章。如果我能找到時間,我會爲你發佈一個答案。 – L42

+0

@ L42是正確的 - 只需搜索動態範圍(例如:http://support.microsoft.com/kb/830287)。作爲一個方面說明,小心使用'Integer':它在第32,767行之後失敗。並且在大多數情況下使用'Selection'對象可能不是一個好主意(包括這個)。請參閱http://stackoverflow.com/questions/10714251/excel-macro-avoiding-using-select – Ioannis

+0

我確實看過動態範圍命名,但源工作表有時會被完全刪除,並且從另一個工作簿中複製一個新工作表,以便全部範圍命名丟失。這就是爲什麼當工作表和數據發生變化時,我正在嘗試執行VBA數據驗證。 –

回答

0

說明: 偏移移動範圍成份$ A $ 1由下來並調整的高度! !至列成份非空單元格的數量$ A:$ A減去1的列表的標題

=OFFSET(Ingredients!$A$1,1,0,COUNTA(Ingredients!$A:$A)-1,1) 
+4

你應該考慮增加一個你正在做什麼的解釋,這樣OP可以從你正在做的事情中學習,而不僅僅是複製和粘貼。 – jprofitt

0

你所得到的運行時錯誤1004的原因是因爲CHR(34 )。你不需要它。一旦你解決,你會得到一個運行時錯誤13,因爲你試圖連接具有此整數的字符串:

Range("A" & Rows.Count) 

您需要將整數轉換爲字符串:

Dim endrow As Integer 

endrow = Sheets("Ingredients").Range("A" & strings.trim(str(Rows.Count))).End(xlUp).Row 

Range("A10:A29").Select 
With Selection.Validation 
     .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ 
     xlBetween, Formula1:="=INDIRECT("Ingredients!A2:A" & strings.trim(str(endrow)))" 
     .IgnoreBlank = True 
     .InCellDropdown = True 
     .InputTitle = "" 
     .ErrorTitle = "" 
     .InputMessage = "" 
     .ErrorMessage = "" 
     .ShowInput = True 
     .ShowError = True 
    End With 

你還可以看到這篇文章,我寫Excel VBA, Common Errors When Using Strings

+1

我不認爲你需要做整數字符串的東西... – L42

+1

'範圍(「A」&Rows.Count)'工作正常。加法運算符('+')確實失敗,正如您在後文中所解釋的那樣。 – Ioannis

+0

如果我不轉換,則會出現類型不匹配錯誤。也許你們已經開啓了隱式轉換或其他功能 – Pedrumj

1

如這裏評論是我回答你的問題沒有VBA:

該演示使用Excel 2010中完成的:

從色帶選擇Formula Tab

Formula Tab

然後選擇Name Manager

Name Manager

選擇New
提供命名範圍的名稱(在我的示例中爲MyRange)。
然後把公式寫在Refers To以下。

=OFFSET(Sheet1!$A$2,0,0,COUNTA(Sheet1!$A:$A)-1) 

OK
請注意,我假定爲Sheet1作爲驗證列表來源。

New Name dialogue

您將返回到Name Manager對話:一個已經加入新創建的名稱
通知。
Close

Name Manager with New NAme

現在,去Validation
在驗證對話框中,在Allow字段中選擇List
然後在下面的公式中輸入Source

=MyRange 

Validation Criteria

當然,你需要按OK

重要提示:您可以在此直接輸入在命名範圍中使用的公式。
但是命名範圍提供數據可見性。

假設我們在Sheet1中單元格C1申請Validation,它看起來象下面這樣:

Validation Sample

添加另一個項目或數據將導致到:

Validation Sample2

注意,驗證列表自動調整。
希望這可以幫助你一點。

EDIT1:如果你要堅持你的邏輯,上面可以在VBA使用下面的代碼完成:

Sub DynamicValidation() 

Dim ws As Worksheet 
Dim rng As Range, valrng As Range 
Dim valformula As String 

Set ws = ThisWorkbook.Sheets("Sheet1") 
Set rng = ws.Range("C1") '~~> where you want to put the validation 
'~~> check if you have list, exit if none 
If ws.Range("A2").Value = "" Then Exit Sub 
'~~> Below contains your dynamic range 
Set valrng = ws.Range(ws.Range("A2"), ws.Range("A" & ws.Rows.Count).End(xlUp)) 
'~~> your formula based on your dynamic range 
valformula = "=" & valrng.Address 
'~~> actual application of validation 
With rng.Validation 
    .Delete 
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ 
    xlBetween, Formula1:=valformula '~~> use the variable here 
    .IgnoreBlank = True 
    .InCellDropdown = True 
    .InputTitle = "" 
    .ErrorTitle = "" 
    .InputMessage = "" 
    .ErrorMessage = "" 
    .ShowInput = True 
    .ShowError = True 
End With 

End Sub 

上面的代碼是經得起考驗的。
每次運行宏時,它都會更新驗證列表。
只需調整參考以滿足您的需求。