excel vba 范围从一个 sheet 复制到另一个(错误 1004)
excel vba range copy from one sheet to another (error 1004)
我知道有很多主题与错误 1004(对象或应用程序错误)有关,当您尝试将粘贴范围从一个 sheet 复制到另一个时,但我不明白某些事情(我我还是 VBA 的初学者)。
我有一个包含 2 sheet 的 Excel 文件:
- "Worksheet1"加上我要复制的数据
- "Feuil1" 我想粘贴具有特定布局的数据
要了解我的问题,请查看我的代码
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
我知道有很多主题与错误 1004(对象或应用程序错误)有关,当您尝试将粘贴范围从一个 sheet 复制到另一个时,但我不明白某些事情(我我还是 VBA 的初学者)。
我有一个包含 2 sheet 的 Excel 文件:
- "Worksheet1"加上我要复制的数据
- "Feuil1" 我想粘贴具有特定布局的数据
要了解我的问题,请查看我的代码
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