excel - VBA copy.range 不明白为什么不起作用
问题描述
我有一个简单的需要,将范围从一张纸复制到另一张纸,我可以用不同的方式做,但我想了解为什么这段代码不起作用。请问,你能解释一下吗?
Sub cioy()
Dim wb As Workbook
Dim sh1 As Worksheet
Dim sh2 As Worksheet
Set wb = ActiveWorkbook
Set sh1 = wb.Sheets("sh1")
Set sh2 = wb.Sheets("sh2")
sh2.Cells.ClearContents
sh1.Range(Cells(1, 1), Cells(12, 8)).Copy Destination:=sh2.Range(Cells(1, 1))
End Sub
解决方案
这是因为object 的Range()
属性Worksheet
将接受两个Range
参数(所需范围的开始和结束范围引用),而您只给出一个 ( Range(Cells(1, 1)
)。
所以你会编码:
sh1.Range(Cells(1, 1), Cells(12, 8)).Copy Destination:=sh2.Cells(1, 1)
或者:
sh1.Range(Cells(1, 1), Cells(12, 8)).Copy Destination:=sh2.Range("A1")
以上应该修复错误
另外,请注意,如果没有显式Sheet
引用,Range
对象会隐含地将其视为ActiveSheet
,因此您的代码将与以下内容相同:
sh1.Range(ActiveSheet.Cells(1, 1), ActiveSheet.Cells(12, 8)).Copy Destination:=sh2.Cells(1, 1)
sh1
如果不是当前的Active ,这可能不是您需要的sheet
。
因此你会更正确地写:
sh1.Range(sh1.Cells(1, 1), sh1.Cells(12, 8)).Copy Destination:=sh2.Cells(1, 1)
或者:
Range(sh1.Cells(1, 1), sh1.Cells(12, 8)).Copy Destination:=sh2.Cells(1, 1)
您可以注意到您可以省略外部工作表引用,因为使用限定Range
引用作为Range
属性的参数会导致返回的Range
引用与两个参数的引用相同
Range(string address, string address)
最后,您可以通过使用Range 属性的表示法和简单的代码来避免所有这些负担:
sh1.Range("A1:H12").Copy Destination:=sh2.Cells(1, 1)
或者:
sh1.Range("A1:H12").Copy Destination:=sh2.Range("A1")
推荐阅读
- maven - 如何让 Quarkus 使用本地库类
- java - 我不明白我做错了什么。如何将 int 存储在 String 中而不出错?
- c# - 从列表字典创建新的字符串列表(即从具有字符串列表作为值的字典)
- php - php工匠服务失败
- asp.net - 使用 TOP (N) 和 OPTION(FAST N) 会干扰 GridView 的内置优化吗?
- node.js - 在 React 中获取 Mongoose 验证错误消息
- javascript - webpack TTF 加载器未加载字体
- jquery - 条件将不匹配其他
- android - Firebase C++ SDK:解决失败:Lcom/google/android/gms/common/api/Api$zzf
- vue.js - 如果没有“url”选项,Vue-Dropzone 无法工作