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是默默地抛出一个内部错误,你不明白你的名单。
Range
, Cells
, Columns
, Rows
和Names
应始终使用适当的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