数据validation和stringbuild立错误
我正在尝试将数据validation添加到一组基于另一个工作表中单元格范围的单元格。 问题在于其他工作表中单元格的范围不是静态的,可以更改。
总体而言,我正在寻找A10:A29单元中的一组下拉框,其中的成分
当我使用= INDIRECT(“配料!A2:A320)只使用Excelvalidation向导它的工作原理,但我需要dynamic的末端单元格。
我有这个当前的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*)
正如这里评论的是我没有VBA的问题的答案:
此演示使用Excel 2010完成:
从function区select“ Formula Tab
然后selectName Manager
。
selectNew
。
为命名的范围提供一个名称(在我的例子中是MyRange
)。
然后在下面的公式中Refers To
。
=OFFSET(Sheet1!$A$2,0,0,COUNTA(Sheet1!$A:$A)-1)
按OK
。
请注意,我假定Sheet1
为validation列表源。
您将返回到Name Manager
对话框:
请注意,您新创build的名称已添加。
按Close
现在,去Validation
。
在validation对话框中,selectAllow
字段中的List
。
然后在Source
中input以下公式。
=MyRange
当然你需要按OK
。
重要提示:您可以直接input在命名范围中使用的公式。
但是有一个命名的范围提供数据可见性。
假设我们在Sheet1 Cell C1中应用Validation
,它将如下所示:
添加另一个项目或数据将导致:
注意validation列表自动调整。
希望这可以帮助你一点。
编辑1:如果你想坚持你的逻辑,上面可以使用下面的代码在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
以上代码经过testing。
每次运行macros时,都会更新validation列表。
只需调整参考以满足您的需求。
你得到运行时错误1004的原因是因为chr(34)。 你不需要它。 一旦你解决了这个问题,你会得到一个运行时错误13,因为你试图连接一个string与一个整数在这里:
Range("A" & Rows.Count)
您需要将整数转换为string:
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,使用string时的常见错误
说明:偏移量将范围成分!$ A $ 1减1,并将范围的高度调整为列成分中非空单元格的数量!$ A:$ A:$ A减1
=OFFSET(Ingredients!$A$1,1,0,COUNTA(Ingredients!$A:$A)-1,1)