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

时间:2017-11-16 18:25:58

标签: excel vba excel-vba validation

以下代码是一个循环,它接受单元格(字符串)的值,并将其插入另一个工作表。然后它用逗号分隔符分隔字符串的值。这一切都正常,直到我尝试创建列表数据验证,其中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

2 个答案:

答案 0 :(得分:3)

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

经典错误:不合格的Cells成员调用隐含地指的是ActiveSheet;如果那不是Sheet7,则验证会默默地抛出内部错误,而您却无法获取列表。

RangeCellsColumnsRowsNames 始终应使用适当的{{明确限定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