Vba 代码上的应用程序定义或对象定义错误
我的代码中这一行有错误,你知道问题是什么吗Vba 代码上的应用程序定义或对象定义错误,vba,excel,Vba,Excel,我的代码中这一行有错误,你知道问题是什么吗 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, _
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
您的表达式适用于我的测试工作表,因此问题一定与您的数据有关 我不喜欢这样将属性串在一起,因为目标变得非常不明确。更糟糕的是,如果它失败了,你不知道它在哪里失败 尝试用以下内容替换该语句:
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
逐步执行此代码以确保每个范围都符合预期
我猜该范围内没有可见的单元格,因此您尝试删除无内容
编辑有关查找工作表最后一行的额外信息
查找工作表最后使用的行或列有多种方法。没有一种方法在任何情况下都有效,但UsedRange
是最不可能给出预期结果的方法
根据这里的答案判断,查找最后一行最常用的方法是:
RowLast = .Cells(Rows.Count,9).End(xlUp).Row
这相当于将光标放置在第9列的底部单元格中,然后单击Ctrl+UpRowLast
将设置为第9列中的最后一行,除非底部单元格中有值。要使此方法具有任何用途,必须在上次使用的行的指定列中有一个值
Find
是按行或列查找最后一个值的可靠方法
SpecialCells
是另一种有用的方法
我的回答包括一个宏,
FindFinal
,它演示了这些方法如何无法给出您可能期望的结果。如果您希望完全理解这些问题,请逐步完成此宏,研究会发生什么。对问题进行了一些编辑,但基本上代码应该对工作簿上的工作表进行更改,并计算DL与IDL之间的员工数……您是否了解了intersect的用法?我在代码的第二行得到了相同的错误:Debug.Print.UsedRange.Offset(1).Address
基本上宏需要做的是从前一行.UsedRange.AutoFilter 9,“INATIVE”
中删除它筛选为“INATIVE”的所有行UsedRange.Offset(1)
将1添加到UsedRange
的起始行和结束行。如果UsedRange
包含在工作表的底行,则不允许这样做UsedRange
包含每一行的非默认格式。例如,如果您选择了全部,然后设置字体,UsedRange
将是整个工作表。基本上,从一个月到另一个月的范围将不同。。。更改代码以基于“INATIVE”删除第9列中的所有行,而不是进行筛选,是否更好?如果是这样的话,怎么做?