以下代码是一个循环,它接受单元格(字符串)的值,并将其插入另一个工作表。然后它用逗号分隔符分隔字符串的值。这一切都正常,直到我尝试创建列表数据验证,其中Formula1:=
似乎没有正常工作,但代码看起来很好。
应该将循环的当前行一直复制到最后一列,并从中创建数据验证列表。
请帮助,我做错了什么?
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
答案 0 :(得分:3)
Formula1:=Sheets("Sheet7").Range(Cells(counter, 1), Cells(counter, lcol))
经典错误:不合格的Cells
成员调用隐含地指的是ActiveSheet
;如果那不是Sheet7
,则验证会默默地抛出内部错误,而您却无法获取列表。
Range
,Cells
,Columns
,Rows
和Names
始终应使用适当的{{明确限定1}}实例。
你在这里做了什么:
Worksheet
这个Sheets("Sheet7").Range(...)
成员属于Range
调用的任何工作表(它本身隐含地处理了Sheets
所返回的任何内容。
宏录制器生成模仿用户交互的笨拙代码。它有助于探索对象模型并了解成员用来做什么,但它本身就是脆弱和容易出错。
请勿使用ActiveWorkbook
和.Select
;取而代之的是对象引用。有关详细信息,请参阅this post。
.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
'...
,而不是范围本身。由于这是公式,因此前缀为.Address
符号。
答案 1 :(得分:0)
根据你的代码应该如何工作,这个sub应该做你想要的。我只是不理解Sheet7上的最后一栏(因为我没有你的工作簿)以及你为什么要尝试对J列中的每个单元格进行数据验证,一次一个。 DataValidation列表需要是一列数据或分隔列表,因此我选择了Sheet7的A列。
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