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

时间:2014-07-17 19:11:30

标签: vba excel-vba excel

我是VBA的新手,我正在尝试设计一个程序,该程序将通过一个包含字符串的列,并为每个唯一的String名称创建一个新的工作表对象,并将该String值作为其名称,然后复制并粘贴该行中的值到新工作表。然后,所有相同的字符串也应将其行中的值复制到新工作表中。数据不是基于字符串排序的,所以我可能在列中有字符串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 个答案:

答案 0 :(得分:0)

我注意到您的代码有些问题,在答案中更容易指出而不是评论。

<击>

<击>

<击> 1。代码无效 --Ignore this -

您发布的代码中似乎缺少2 End If个。我只能假设它只是一个复制粘贴错误,所以我会迅速继续前进。

2。添加评论“新添加的代码块”

您的代码说:

For Each sheet In ActiveWorkbook

你应该用这个代替:

For Each sheet In ActiveWorkbook.Worksheets

工作簿不是工作表的集合,工作簿的.Worksheets功能是。

3。终止外部For循环

在评论中,您说原始错误发生在If语句中循环的第一次迭代中,但我不相信。快速使用您的代码后,我认为您看到的错误('1004':“应用程序定义或对象定义的错误”)是一个不同问题的结果。

在我的代码运行中,Else If k = 1ActiveSheet.Name = sheetName 块中的

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

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

sheetName = ""

返回Cells(i, 1)

当位置For中的单元格为空时会发生这种情况,这在您的代码中是完全可能的,因为您的外部"AllClasses"循环正在迭代ActiveSheet.Name表中的所有行 - 所有1048576(在Excel 2007及更高版本中)。除非你在每一行的第1列(我怀疑)中得到一个值,否则在某些时候你会遇到一个空白的单元格。将该空白字符串分配给For将导致您看到的错误。

您可以对外部Sheet.UsedRange.Rows.Count循环终止条件的值进行硬编码,也可以使用the various "tricks"动态确定该值,例如: Sheet.Cells(1048576, col).End(xlUp).row或{{1}}。