数据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

名称经理与新NAme

现在,去Validation
在validation对话框中,selectAllow字段中的List
然后在Source中input以下公式。

 =MyRange 

验证标准

当然你需要按OK

重要提示:您可以直接input在命名范围中使用的公式。
但是有一个命名的范围提供数据可见性。

假设我们在Sheet1 Cell C1中应用Validation ,它将如下所示:

验证样本

添加另一个项目或数据将导致:

验证Sample2

注意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)