应用程序定义或对象定义的代码错误

时间:2014-06-18 12:54:22

标签: excel vba excel-vba

我的代码中的这一行出错,任何想法可能是什么问题?

Intersect(.UsedRange, .UsedRange.Offset(1)).SpecialCells(12).EntireRow.Delete

以下是代码的其余部分:

Sub DefineDL_IDL()

Dim wbTHMacro As Workbook, wsRegulares As Worksheet, wsRegularesDemitidos As Worksheet, wsTempActivos As Worksheet, _
wsTempJA As Worksheet, wsTempFit As Worksheet, wsTempDemitidos As Worksheet, wsPS As Worksheet, wsResultados As Worksheet, _
wsDLList As Worksheet, wssheet As Worksheet, count_DL As Integer, count_IDL As Integer
Dim x&, r As Long

'*************REGULARES***********

    Sheets("Regulares").Select

'Debug.Print xlToRight
'Sheets("Raw").Copy before:=Sheets(2)
With Sheets("Regulares")
    '.Name = "Final2"
    .UsedRange.AutoFilter 9, "INATIVE"
    Intersect(.UsedRange, .UsedRange.Offset(1)).SpecialCells(12).EntireRow.Delete
    r = WorksheetFunction.CountA(.Range("A:A"))
    .UsedRange.AutoFilter
    .Range("J:J").Insert xlToRight
    .Range("J1").Value = "Real MO"
    .Range("K:K").Cut
    .Range("I:I").Insert xlToRight
    .Range("Q:Q").Cut
    .Range("I:I").Insert xlToRight
    .Range("L2:L" & r).FormulaR1C1 = "=VLOOKUP(RC[-3],'DL List'!C[-11]:C[-10],2,0)"
    .Range("L2:L" & r).Value = .Range("L2:L" & r).Value
    For x = 2 To r
        If Range("L" & x).Text = "#N/A" Then
            'If Range("K" & x).Value = "DL" Then
            '    Range("L" & x).Value = "DL"
            'Else: Range("L" & x).Value = "IDL": End If
            Range("L" & x).Value = "IDL"
        End If
    Next x
End With

    count_DL = Application.WorksheetFunction.CountIf(ActiveSheet.Range("L:L"), "DL")
    count_IDL = Application.WorksheetFunction.CountIf(ActiveSheet.Range("L:L"), "IDL")

    Worksheets("Resultados").Range("B17") = count_DL
    Worksheets("Resultados").Range("C17") = count_IDL

1 个答案:

答案 0 :(得分:1)

您的表达式适用于我的测试工作表,因此问题必须与您的数据有关。

我不喜欢像这样将属性串在一起,因为目标变得非常不清楚。更糟糕的是,如果它失败了,你就不知道哪里失败了。

尝试用以下语句替换语句:

Dim rng As Range

Debug.Print .UsedRange.Address
Debug.Print .UsedRange.Offset(1).Address
Set rng = Intersect(.UsedRange, .UsedRange.Offset(1))
Debug.Print rng.Address
Debug.Print rng.SpecialCells(12).Address
Debug.Print rng.SpecialCells(12).EntireRow.Address
rng.SpecialCells(12).EntireRow.Delete

逐步执行此代码以确保每个范围都符合您的预期。

我猜测范围内没有可见的单元格,因此您尝试删除Nothing

修改有关查找工作表最后一行的更多信息。

有多种方法可以找到工作表的最后使用的行或列。在所有情况下都不起作用,但UsedRange是最不可能给出预期结果的方法。

最常见的查找最后一行的方法是:

RowLast = .Cells(Rows.Count,9).End(xlUp).Row 

这是VBA,相当于将光标放在第9列的底部单元格中,然后单击 Ctrl + Up 。除非您在底部单元格中有值,否则RowLast将设置为第9行中的值的最后一行。要使此方法有用,在最后使用的行的指定列中必须有一个值。

Find是通过行或列查找最后一个值的可靠方法。

SpecialCells是另一种有用的方法。

我的这个答案VBA Dynamic Ranges包含一个宏FindFinal,它演示了这些方法如何无法提供您可能期望的结果。如果您希望完全理解这些问题,请通过此宏来研究会发生什么。