VBA数据validation列表不起作用(Formula1:=)

下面的代码是一个循环,它取一个单元格(string)的值,并将其插入到另一个表单中。 它然后用逗号分隔符分隔string的值。 这一切工作正常,直到我尝试创build列表数据validation,其中Formula1:=似乎不能正常工作,但代码看起来不错。

它应该将循环的当前行一直复制到最后一列,并从中创build一个数据validation列表。

请帮忙,我做错了什么?

 Sub dataVal() Dim lrow As Long Dim lcol As Long Dim i As Long Dim counter As Integer counter = 1 lrow = Sheets("LVL & Mapping").Cells(Sheets("LVL & Mapping").Rows.count, "H").End(xlUp).Row lcol = Sheets("Sheet7").Cells(counter, Columns.count).End(xlToLeft).Column For i = 4 To lrow Range("I" & i).Select Selection.Copy Sheets("Sheet7").Select Range("A" & counter).Select ActiveSheet.Paste Application.CutCopyMode = False Selection.TextToColumns Destination:=Range("A" & counter), DataType:=xlDelimited, _ TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _ Semicolon:=False, Comma:=True, Space:=False, Other:=False, FieldInfo _ :=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1)), _ TrailingMinusNumbers:=True Sheets("LVL & Mapping").Select Range("J" & i).Select With Selection.Validation .Delete .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ xlBetween, Formula1:=Sheets("Sheet7").Range(Cells(counter, 1), Cells(counter, lcol)) .IgnoreBlank = True .InCellDropdown = True .InputTitle = "" .ErrorTitle = "" .InputMessage = "" .ErrorMessage = "" .ShowInput = True .ShowError = True End With counter = counter + 1 Next i End Sub 

 Formula1:=Sheets("Sheet7").Range(Cells(counter, 1), Cells(counter, lcol)) 

经典的错误:不合格的Cells成员调用隐含指的是ActiveSheet ; 如果这不是Sheet7 ,validation是默默地抛出一个内部错误,你不明白你的名单。

RangeCellsColumnsRowsNames始终使用适当的Worksheet实例进行显式限定。

这就是你在这里所做的:

 Sheets("Sheet7").Range(...) 

这个Range成员属于Sheets调用的任何工作Sheets (它本身隐式地closuresActiveWorkbook )正在返回。

macroslogging器生成笨拙的代码,模仿用户交互。 这对于探索对象模型是很好的,可以学习使用什么成员来做什么,但是它本质上是脆弱的,容易出错的。

不要使用.Select.Activate ; 取而代之的是对象引用。 看到这个职位了解更多信息。

 Dim validationSource As worksheet Set validationSource = ThisWorkbook.Worksheets("Sheet7") ... With Selection.Validation .Delete .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ xlBetween, Formula1:="=" & validationSource.Range(validationSource.Cells(counter, 1), validationSource.Cells(counter, lcol)).Address '... 

给它的范围的地址,而不是范围本身。 由于这是一个公式 ,所以前缀为=符号。

根据你的代码应该如何工作,这个子应该做你想要的。 我只是不明白Sheet7上的最后一列(因为我没有你的工作簿),为什么你试图在J列的每个单元格上进行数据validation。 DataValidation列表需要是一列数据或一个分隔列表,所以我去了列A的Sheet7。

 Sub dataVal() Dim lrow As Long Dim i As Long Set shta = Sheets("LVL & Mapping") Set shtb = Sheets("Sheet7") lrow = Sheets("LVL & Mapping").Cells(Sheets("LVL & Mapping").Rows.Count, "H").End(xlUp).Row shta.Range("I4:I" & lrow).Copy shtb.Range("A1") Set objRange = shtb.Range("A1").EntireColumn objRange.TextToColumns Destination:=objRange, DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Comma:=True, FieldInfo _ :=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1)) With shta.Range("J4:J" & lrow).Validation .Delete .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ xlBetween, Formula1:="=Sheet1!" & shtb.Range("A1:A" & lrow).address End With End Sub