2015-03-30 169 views
0

我有這個功能。但我有#VALUE錯誤。如何解決此問題?#宏Excel數據驗證功能錯誤

Function UYGULAMAADI(ByVal Target As Excel.Range) 

Sheets("Sheet1").Range(Target).Select 
With Selection.Validation 
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, _ 
Formula1:="=IF(OFFSET(" & Target & ";0;1;1;1)='stackoverflow';INDIRECT('x1');INDIRECT('x2'))" 
.IgnoreBlank = True 
.InCellDropdown = True 
End With 

End Function 
+1

從工作表中調用(即'= UYGULAMAADI(A1)'當你的函數把它放在一個單元格中調用函數)不能在這樣的工作表對象上操作。具體來說,'.Select'方法可能是導致函數提前中止的原因。我期望'.Validation'方法也會出錯。 – 2015-03-30 19:42:03

+0

謝謝@David。你對解決方案有什麼建議? – 2015-03-30 19:48:07

+0

這取決於問題。你想做什麼?我解釋了爲什麼這不起作用。只要你提供一種方法來傳遞一個範圍參數(inputbox,或者使用'Selection'作爲輸入等等),它應該很可能作爲一個sub來使用。 – 2015-03-30 20:01:57

回答

0

從工作表中調用的函數(即,= UYGULAMAADI(A1)時,把這個小區中的呼叫的功能)不能像這樣工作表對象進行操作。也就是說,你想要的 - 幾乎所有的範圍和工作方法被稱爲這種方式,以防止循環引用錯誤,依賴錯誤,無限循環UDF等

您正在使用Target作爲輸入內禁止向目標單元添加驗證。你可以做同樣的Selection,在子程序

Sub UYGULAMAADI() 

'Applies this macro to the range currently SELECTED by the user 

With Selection.Validation 
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, _ 
Formula1:="=IF(OFFSET(" & Selection.Value & ";0;1;1;1)='stackoverflow';INDIRECT('x1');INDIRECT('x2'))" 
.IgnoreBlank = True 
.InCellDropdown = True 
End With 

End Sub 

或者提示用戶進行輸入:

Sub UYGULAMAADI() 

'Prompts the user for an input/range 
Dim rng as Range 
Set rng = Application.InputBox("Select a cell", Type:=8) 

If rng Is Nothing Then Exit Sub 

With rng.Validation 
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, _ 
Formula1:="=IF(OFFSET(" & Selection.Value & ";0;1;1;1)='stackoverflow';INDIRECT('x1');INDIRECT('x2'))" 
.IgnoreBlank = True 
.InCellDropdown = True 
End With 

End Sub