我是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
非常感谢任何帮助。 ¸
答案 0 :(得分:0)
我注意到您的代码有些问题,在答案中更容易指出而不是评论。
<击> 撞击>
<击> 击> 您发布的代码中似乎缺少2 End If
个。我只能假设它只是一个复制粘贴错误,所以我会迅速继续前进。
击>
您的代码说:
For Each sheet In ActiveWorkbook
你应该用这个代替:
For Each sheet In ActiveWorkbook.Worksheets
工作簿不是工作表的集合,工作簿的.Worksheets
功能是。
For
循环在评论中,您说原始错误发生在If
语句中循环的第一次迭代中,但我不相信。快速使用您的代码后,我认为您看到的错误('1004':“应用程序定义或对象定义的错误”)是一个不同问题的结果。
在我的代码运行中,Else
If k = 1
的ActiveSheet.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}}。