VBA验证引发1004应用程序 - 定义错误

时间:2013-03-21 22:16:27

标签: excel excel-vba vba

您好我有以下代码,它被触发了数千个单元格。它为每个单元格添加了一个验证列表(列表值在名称范围内定义 - 名称范围在单独的选项卡中)。

Sub CreateList(cell As Variant, rng As String)
     If rng <> Empty Then
          With cell.Validation
             .Delete
             .Add Type:=xlValidateList, Formula1:="=" & rng
             .ShowError = False
          End With
       End If
    End Sub

我从另一个循环遍历单元格的函数中调用子程序。注意totalCols&amp; totalRow在其他地方设置,但是是数据范围的界限:

    For i = 2 To totalRows
       For J = 1 To totalCols
          CreateList(Worksheets("Data").cells(i, j), GetRange(Worksheets("Data").cells(1, J).Value)
       Next
    Next

GetRange()获取标题值(存储在“数据”表的第1行)并返回范围名称(存储在同一工作簿中的单独工作表中):

Function GetRange(cell As Variant) As String    
       If cell.Value = "Column One Name" Then
          GetRange = "RangeOne"
       ElseIf cell.Value = "Column Two Name" Then
          GetRange = "RangeTwo"
       Else
          GetRange = ""
       End If
End Sub

当我运行代码时,它有时会因应用程序定义的错误1004而失败。这里的特殊之处在于不同数据集的不同点。数据集越大,它格式化的列越少。对于小数据集(即1/2行),它可以工作 - 因为它循环遍历所有范围并相应地添加列表。

更多信息:数据表未锁定。调试时,rng具有正确的值。在调试模式下执行“添加监视”并检查范围的范围值属性时,会确认这一点。命名范围在工作簿范围内,但包含在单独的工作表中。

首次运行相同数据集时,它始终停在同一位置。它在列的一半处有时会使用正确的范围值填充单元格,然后只是因错误1004而停止。

在第一次失败后立即第二次运行时 - 它有时会在需要验证的第一个单元格中停止并显示1004错误。发生这种情况时,它会在第一个单元格中停止,需要为任何数据集添加验证。就像它在这一点上打破了工作表一样。

1 个答案:

答案 0 :(得分:1)

Sub ApplyValidation()

    Dim c As Range

    For Each c In Worksheets("Data").Cells(1, 1).Resize(1, totalCols).Cells
        With c.Offset(1, 0).Resize(totalRows - 1, 1).Validation
            .Delete
            .Add Type:=xlValidateList, Formula1:="=" & GetRange(c)
            .ShowError = False
        End With
    Next c

End Sub

Function GetRange(cell As Variant) As String
    If cell.Value = "Column One Name" Then
       GetRange = "RangeOne"
    ElseIf cell.Value = "Column Two Name" Then
       GetRange = "RangeTwo"
    Else
       GetRange = ""
    End If
End Function