excel for each循环中的错误1004的解决方案是什么

qfe3c7zg  于 2023-04-07  发布在  其他
关注(0)|答案(1)|浏览(151)
Sub create_category()

Dim cell As Range

Dim wsname As Worksheet

Dim test As Boolean

For Each cell In Sheets("Data").Range("d4", Range("d" & Rows.Count).End(xlUp))
   test = False

        For Each wsname In ThisWorkbook.Sheets
        If wsname.name = cell Then test = True
        Next wsname
    
    If test = False Then Sheets.Add after:=Sheets(Sheets.Count)
    ActiveSheet.name = cell
        
    Sheets(cell.name).Range("d3").End(xlDown).Offset(1, 0) = cell         
Next cell

Sheets("Data").Select

End Sub

我的代码应该创建额外的工作表,并根据单元格中的数据相应地复制数据。
程序在执行代码时没有问题,直到我在Next cell之前添加了一行代码,有趣的是,错误被指示为第4行代码For Each cell IN Sheets("Data").Range.....
正如你所想象的,我很困惑,特别是考虑到我是一个初学者。
显示的错误为1004
我试过用不同的思维过程在副本上重写它,但我以同样的结果结束。非常感谢帮助

o75abkj4

o75abkj41#

当你写的时候

Sheets("Data").Range("d4", Range("d" & Rows.Count).End(xlUp))

VBA将尝试在您的工作表“Data”上创建一个Range。Range的起点是单元格D4。对于Range的终点,您可以写入Range("d" & Rows.Count).End(xlUp),但您没有告诉VBA要从哪个工作表访问此单元格。虽然这对您来说似乎很明显,但它不是VBA。它将从活动工作表读取单元格,并且这将导致显示1004的无效范围定义。

**每次 * 访问RangeCells时,始终指定要在哪个工作表上工作。

我会建议使用中间变量,使其更容易调试。注意RangeRows前面的点(.)。

Dim lastCell as Range, dataRange as Range
With ThisWorkbook.Sheets("Data")
    Set lastCell = .Range("d" & .Rows.Count).End(xlUp)
    Set dataRange = .Range("D4", lastCell)
End With
For Each cell in dataRange
    ...
Next cell

更新您下面的代码也有问题,将循环改为

For Each cell In dataRange
    Dim ws As Worksheet
    Set ws = getWorksheet(cell.Value)
    ws.Range("d3").End(xlDown).Offset(1, 0) = cell.Value
Next cell

并添加以下函数

Function getWorksheet(sheetname As String) As Worksheet
    On Error Resume Next
    Set getWorksheet = ThisWorkbook.Sheets(sheetname)
    On Error GoTo 0
    If getWorksheet Is Nothing Then
        Set getWorksheet = ThisWorkbook.Worksheets.Add
        getWorksheet.Name = sheetname
    End If
End Function

但我不太清楚其中的逻辑:当前代码将把工作表的名称(单元格.值)写入工作表--我怀疑这是你想要的。

相关问题