excel vba 范围从一个 sheet 复制到另一个(错误 1004)

excel vba range copy from one sheet to another (error 1004)

我知道有很多主题与错误 1004(对象或应用程序错误)有关,当您尝试将粘贴范围从一个 sheet 复制到另一个时,但我不明白某些事情(我我还是 VBA 的初学者)。

我有一个包含 2 sheet 的 Excel 文件:

要了解我的问题,请查看我的代码

    Dim a As Integer
    Dim b As Integer
    Dim val4 as integer

    val4 = 4 
    a = 2
    b = 1

    For i = 1 To val4

        Worksheets("Worksheet1").Range(Worksheets("Worksheet1").Cells(a, 1), Cells(a + 2999, 1)).Copy Destination:=Worksheets("Feuil1").Range(Worksheets("Feuil1").Cells(2, b), Cells(a + 2999, b))

        a = a + 3000
        b = b + 1

    Next i

注意:在完整代码中,在此部分之前已经使用了 val4。

当我尝试 运行 它时,我收到错误 1004(对象或应用程序错误)。 根据我的阅读,我认为问题来自 "Cells" 属性 必须指定工作 sheet (与范围不同),但我不明白为什么我的代码无法复制。

谁能给我解释一下?

您能否按以下方式交换并完全限定 sheet 引用,因为这是导致问题的原因

Option Explicit

Sub test()

    Dim a As Long
    Dim b As Long
    Dim val4 As Long

    val4 = 4
    a = 2
    b = 1

    Dim i As Long

    For i = 1 To val4

        With Worksheets("Worksheet1")
            Worksheets("Feuil1").Range(Worksheets("Feuil1").Cells(2, b), Worksheets("Feuil1").Cells(a + 2999, b)) = .Range(.Cells(a, 1), .Cells(a + 2999, 1))
        End With
        a = a + 3000
        b = b + 1

    Next i

End Sub

您只是指定了一个父工作表对定义范围的单元格的引用。我建议使用 With .... End With 块,您只需要 top-left 单元格作为复制的目的地。

with Worksheets("Worksheet1")
    For i = 1 To val4
        .Range(.Cells(a, 1), .Cells(a + 2999, 1)).Copy _
            Destination:=Worksheets("Feuil1").Cells(2, b)
        a = a + 3000
        b = b + 1
    Next i
end with

试试这个:

Dim a As Integer
Dim b As Integer
Dim val4 As Integer

val4 = 4
a = 2
b = 1

For i = 1 To val4

    Worksheets("Worksheet1").Range(Cells(a, 1), Cells(a + 2999, 1)).Copy Worksheets("Feuil1").Cells(2, b)

    a = a + 3000
    b = b + 1

Next i
Option Explicit

Sub test()
  Dim a As Integer
  Dim b As Integer
  Dim i As Integer
  Dim val4 As Integer

  val4 = 4
  a = 2
  b = 1

  For i = 1 To val4
    WorkSheet1.Range(WorkSheet1.Cells(a, 1), WorkSheet1.Cells(a + 2999, 1)).Copy Feuil1.Range(Feuil1.Cells(2, b), Feuil1.Cells(a + 2999, b))
    a = a + 3000
    b = b + 1
  Next i
End Sub

你说的 Cells 有点搞砸了,你说的对。 range(cells.....) 必须正确引用内部单元格位。因此,每次使用 cells 一词都应更改为 worksheets(enter worksheet name in here).cells ,然后它就会起作用。 我认为我上面发布的解决方案稍微简洁一些,因为它没有使用用户可以更改的选项卡标签。因此,在 VBA 编辑器的属性 window 中,您可以为 sheet 对象命名。我将第一个 sheet worksheet1 和第二个 Feuil1 命名为(注意..这不是选项卡名称)现在您可以在代码中直接引用这些对象,如上所示。 它应该一切正常......

您可能希望通过仅粘贴值而不是范围来加快速度

Sub test()
    Const chunksLength = 3000 ' define here your "chunks" length

    Dim i As Long
    With Worksheets("Feuil1").UsedRange.Columns(1)
        For i = 1 To .Rows.Count \ chunksLength + IIf(.Rows.Count Mod chunksLength > 0, 1, 0)
            .Offset(, i).Resize(chunksLength).Value = .Resize(chunksLength).Offset((i - 1) * chunksLength).Value
        Next
    End With
End Sub