这段代码一直收到运行时错误 1004。如果起始列名匹配,我会尝试将小块信息从一张表复制到另一张表。
For a = 8 To 17
For b = 7 To 21
If Sheets("Sheet1").Cells(a, 2).Value = Sheets("Sheet2").Cells(b, 1).Value Then
Sheets("Sheet2").Range(Cells(b, 1), Cells(b, 7)).Copy Sheets("Sheet1").Cells(a, 6)
End If
Next b
Next a
我如何调试我的代码?
答案1
简而言之,这条线有问题
Sheets("Sheet2").Range(Cells(b, 1), Cells(b, 7)).Copy Sheets("Sheet1").Cells(a, 6)
将其更改为以下内容应该可以解决您的问题。
Sheets("Sheet2").Range(Sheets("Sheet2").Cells(b, 1), Sheets("Sheet2").Cells(b, 7)).Copy Sheets("Sheet1").Cells(a, 6)
我如何调试:
运行代码时,弹出运行时错误 1004 时单击“调试”。第 4 行以黄色突出显示(即 VBA 在运行该行时遇到错误)。这就是我们的起点。
为了消除问题,我们可以将光标移到各个变量上来查看其值。 b
= 7,a
= 8,看起来不错。
删除函数的参数Copy
,只保留 ... 之前的所有内容.Copy
,问题仍然存在。所以应该有问题
Sheets("Sheet2").Range(Cells(b, 1), Cells(b, 7)).Copy
查看帮助.Range
并注意您还需要指定Sheet
。问题已解决。
答案2
确保两个工作表均未受到保护(不仅是您要复制的范围,而且整个工作表)。
另外,这个函数怎么调用?完整函数是什么?是在 Sheet1、ThisWorkbook 中,还是在单独的模块中?哪一行引发了错误?
尝试分别声明每个对象并查看是否可以隔离哪个步骤失败。
Dim src as Excel.Range
Set src = Sheets("Sheet1").Cells(a, 2)
Dim dst as Excel.Range
Set dst = Sheets("Sheet2").Cells(b, 1)
If src.Value = dst.Value Then
Dim src2 as Excel.Range
Set src2 = Sheets("Sheet2").Range(Cells(b, 1), Cells(b, 7))
Dim dst2 as Excel.Range
Set dst2 = Sheets("Sheet1").Cells(a, 6)
src2.Copy dst2
End If
答案3
我测试了不同的解决方案。阅读文档并在计算机上测试后,我记得:
- 默认情况下,Excel VBA 通过引用传递参数。
- 单元格初始化一次>仅一个实例
或者,您的解决方案Cells
在同一个过程中被调用了多次!您通过引用在具有相同实例的范围内传递了两次值。该范围两次获得相同的对象实例 > 结果无效。
您可以强制通过拜瓦尔带有封闭参数()。这与使用密钥时相同 WITH
Mime 代码为:
Dim shSrc as Excel.Worksheet, shDst as Excel.Worksheet
Set shSrc = Sheets("Sheet1")
Set shDst = Sheets("Sheet2")
'copy
With shSrc
.Range((.Cells(1, 1)), (.Cells(1, 7))).Copy
End With
'special paste need same range (number of rows and colums)
With shDst
.Range((.Cells(1, 1)), (.Cells(1, 7))).PasteSpecial xlPasteValues
End With