Vba if语句中的应用程序定义或对象定义错误

Vba if语句中的应用程序定义或对象定义错误,vba,excel,Vba,Excel,我是VBA新手,正在尝试设计一个程序,该程序将遍历一个包含字符串的列,并为每个唯一的字符串名称创建一个新的工作表对象,将该字符串值作为其名称,然后将该行中的值复制并粘贴到新工作表中。然后,所有相同字符串的行中的值也应复制到新工作表中。数据不是根据字符串排序的,所以我可能在一列中有字符串a、字符串b、字符串a,我希望两个字符串a都是同一个新工作表的一部分。在我添加几行代码来解释这一点之前,一切都很正常,但是现在我在if语句中得到了一个应用程序定义的或对象定义的错误,它不应该与添加的代码相关。这是:

我是VBA新手,正在尝试设计一个程序,该程序将遍历一个包含字符串的列,并为每个唯一的字符串名称创建一个新的工作表对象,将该字符串值作为其名称,然后将该行中的值复制并粘贴到新工作表中。然后,所有相同字符串的行中的值也应复制到新工作表中。数据不是根据字符串排序的,所以我可能在一列中有字符串a、字符串b、字符串a,我希望两个字符串a都是同一个新工作表的一部分。在我添加几行代码来解释这一点之前,一切都很正常,但是现在我在if语句中得到了一个应用程序定义的或对象定义的错误,它不应该与添加的代码相关。这是:

Sub FilterByClass()
Dim i As Long
Dim j As Long
Dim sheetName As String
Dim sheet As Worksheet
Dim book As Workbook
Dim k As Integer

ActiveSheet.Name = "AllClasses"
sheetName = Worksheets("AllClasses").Cells(2, 1).Value
Worksheets.Add
ActiveSheet.Name = sheetName
Worksheets("AllClasses").Activate
ActiveSheet.Rows("1:2").Copy
Worksheets(sheetName).Paste
j = 3
k = 0
For i = 3 To Rows.Count
    If Worksheets("AllClasses").Cells(i, 1).Value <> Worksheets("AllClasses").Cells(i - 1, 1).Value     Then        //site of error
        Worksheets("AllClasses").Range("1:1," & j & ":" & (i - 1)).Copy
        Worksheets(Worksheets("AllClasses").Cells((i - 1), 1).Value).Paste
        j = i
        sheetName = Worksheets("AllClasses").Cells(i, 1).Value
        For Each sheet In ActiveWorkbook         //new added code block
            If sheetName = sheet.Name Then k = 1
            Next sheet
         If k = 1 Then k = 0
         Else
             Worksheets.Add
             ActiveSheet.Name = sheetName
             Worksheets("AllClasses").Activate
         End If
  Next i
  End Sub
任何帮助都将不胜感激。
¸

我注意到您的代码中有一些错误,在回答中比在注释中更容易指出

1.代码无效-忽略此错误- 在你发布的代码中,你似乎缺少了两个结束条件。我只能假设这只是一个复制粘贴错误,所以我将很快继续。

2.带有注释的行新添加的代码块 你的密码是:

For Each sheet In ActiveWorkbook
您应该将其替换为以下内容:

For Each sheet In ActiveWorkbook.Worksheets
工作簿不是工作表的集合,工作簿的.Worksheets函数是

3.外部For循环的终止 在评论中,您说最初的错误发生在If语句中循环的第一次迭代中,但我不相信。在快速使用代码之后,我认为您看到的错误是“1004”:应用程序定义的错误或对象定义的错误是另一个问题的结果

在我的代码演练中,如果k=1,则在Else块中的这一行:

导致错误的原因。这是因为这一行:

sheetName = Worksheets("AllClasses").Cells(i, 1).Value
返回的sheetName=

当位于Cellsi,1位置的单元格为空时,就会出现这种情况,这在代码中是完全可能的,因为外部For循环正在迭代AllClasses工作表中的所有行—Excel 2007和更高版本中的所有1048576行。除非在每一行的第1列中都有一个值,我对此表示怀疑,否则在某个时刻,您将遇到一个空白单元格。将该空白字符串指定给ActiveSheet.Name将导致您看到的错误


您可以硬编码外部For循环终止条件的值,也可以使用动态确定该值,例如Sheet.UsedRange.Rows.Count或Sheet.cells148576,col.EndxlUp.row。

您的最终目标与此处提出的挑战非常相似,其中包括来自许多参与者的多个建议:如果i的值为1,则WorksheetsAllClasses.Cellsi-1,1为未定义/无效,这将引发错误。谢谢Dan,我会看一看。但是我马上将I的值定义为3,这样不应该避免错误吗?你们两位能帮助我理解为什么只有在添加指定的新代码块后才会发生此错误吗?我已经修复了第2点和第3点,谢谢,但第1点实际上不是复制粘贴错误,而我仍然得到同样的错误。当我试图添加更多end If语句时,VBA编译器会给我一个错误,说明我需要一个匹配的If块。从我在网上看到的情况来看,我的印象是没有else的if语句并不需要end if。但我现在注意到,我在出错之前的代码的结果似乎是将我的第一条if语句与最后的那条else语句配对。请原谅我对这样一个基本问题的无知,但从语法上来说,我该如何解决这个问题?我认为我的第一点是无效的。我被单行If语句误导了。通常,为了清晰起见,我喜欢在多行中分离我的Ifs,然后匹配一个End If,但这不是一个要求。编辑了我的答案以避免混淆。关于为什么仍然会出现错误,很难说清楚,因为我没有您的数据,所以只能大致了解代码的行为。但是,如果您确保所有Ifs都有一个关联的End if,那么您可能会找到它。看看你的代码,我对它的作用理解有限,我认为如果k=1,那么k=0这一行应该与它后面的Else匹配,但它目前不匹配,它与突出显示为错误的If匹配,就在外部For循环的下面。因此,如果k=1,则将k设置为0,否则将工作表添加,等等。。
sheetName = Worksheets("AllClasses").Cells(i, 1).Value