尝试删除VBA中的区域a单元格时出错

尝试删除VBA中的区域a单元格时出错,vba,excel,Vba,Excel,我创建了一个小代码,从两个单独的工作表和以字母N开头的工作表中删除一系列单元格,但我的代码总是给我错误或Excel崩溃。ClearContents方法的第一行和第二行代码给出了这些错误 我的代码: 'clearing ranges ThisWorkbook.Worksheets("Sheet1").range("A4", range("AY4").End(xlDown)).ClearContents ThisWorkbook.Worksheets("Sheet2").range("A3", r

我创建了一个小代码,从两个单独的工作表和以字母N开头的工作表中删除一系列单元格,但我的代码总是给我错误或Excel崩溃。ClearContents方法的第一行和第二行代码给出了这些错误

我的代码:

'clearing ranges
ThisWorkbook.Worksheets("Sheet1").range("A4", range("AY4").End(xlDown)).ClearContents
ThisWorkbook.Worksheets("Sheet2").range("A3", range("AK3").End(xlDown)).ClearContents

'deleting sheets
For Each sh In ThisWorkbook.Worksheets
    If Left(sh.Name, 1) = "N" Then
        ThisWorkbook.Worksheets(sh.Name).Delete
    End If
Next sh

谢谢你的帮助

出现错误是因为不允许为每个循环删除当前
中的对象。尝试使用
for
循环,如下所示:

For i = ThisWorkbook.Worksheets.Count to 1 Step -1
  If Left(ThisWorkbook.Worksheets(i).name, 1) = "N" Then
    ThisWorkbook.Worksheets(i).Delete
  End If
Next i

范围定义错误,在内部范围方法调用中,您无法访问特定工作表的范围,因此它使用默认工作表的范围。第二个问题:如果删除集合中的某个内容,则应该在集合上向后循环,因为否则,删除操作会导致索引在循环过程中发生更改

Dim wsheet1 As Worksheet
Dim wsheet2 As Worksheet

Set wsheet1 = ThisWorkbook.Worksheets("Sheet1")
Set wsheet2 = ThisWorkbook.Worksheets("Sheet2")

wsheet1.Columns("A:AY").ClearContents
wsheet2.Columns("A:AK").ClearContents

For i = ThisWorkbook.Worksheets.Count To 1 Step -1
  If Left(ThisWorkbook.Worksheets(i).Name, 1) = "N" Then
    ThisWorkbook.Worksheets(i).Delete
  End If
Next i

编辑
ClearContents
问题添加一些代码


ClearContents问题

你写的

我想删除从A4到AY4右下角的范围

现在,这取决于“AY4的右下角”

如果它是AY列上的最后一个非空值,则使用:

With ThisWorkbook.Worksheets("Sheet001")
    .Range("A4", .Cells(.Rows.Count, "AY").End(xlUp)).ClearContents
End With
您可能需要更多的代码来处理“AY”列中的第一个非空单元格位于第4行上方的情况


工作表删除

您可能希望尝试“数组”方法来利用
工作表
集合的
属性的数组风格,并一次性删除工作表:

Option Explicit

Sub ws()
    Dim sh As Worksheet
    Dim shtsToDelete As String

    With ThisWorkbook
        For Each sh In .Worksheets
            If Left(sh.name, 1) = "N" Then shtsToDelete = shtsToDelete & sh.name & "\" '<-_| store sht names in a string delimiting them with an invalid character for sheet names
        Next sh
        If shtsToDelete <> "" Then '<--| if any sheet to be deleted has been found
            Application.DisplayAlerts = False '<--| disable alerts to prevent popping out of msgbox prompting you to confirm sheets deletion
            .Worksheets(Split(Left(shtsToDelete, Len(shtsToDelete) - 1), "\")).Delete '<--| delete list-sheets in one shot
            Application.DisplayAlerts = True '<--| enable alerts back
        End If
    End With
End Sub
选项显式
副秘书长()
将sh设置为工作表
Dim shtsToDelete作为字符串
使用此工作簿
对于每个sh In.工作表

如果左(sh.name,1)=“N”,则shtsToDelete=shtsToDelete&sh.name&“\”,对每个
循环使用一个
来删除图纸对我有效。可能是不同的Excel版本?我在删除当前的“for each”对象时经常出错,所以我尽量避免在for each循环中删除,也许工作表是可以的。@t除非您确切知道for each循环如何处理集合(我不知道)这可能是个好主意。您的代码中有一个名为
range
的变量吗?不,我没有一个名为range的变量。不清楚您要清除的范围是什么,但是如果您试图清除第3行和第4行,您可以尝试
xlToRight
而不是
xlDown
或只是
此工作簿。工作表(“Sheet1”)。range("3:4").ClearContents
我想删除A4的范围,直到AY4的右下角仍然崩溃我的excel文件,我将此代码与一个按钮关联。我运行代码时没有for循环,也只有第一张工作表的ClearContents。按下它后,excel没有响应,我必须关闭文件并从范围开始,如果y,它是否工作你用这段代码创建了一个新的excel文件吗?你是否在vba代码中的某个地方设置了Application.screenUpdate=false?我简化了代码(使用列而不是范围)我的代码在这些范围的前两个clearcontents方法中崩溃或响应不好。现在我意识到我的for-each循环不是一个好的实践,但运行良好