【问题标题】:Copy to a dynamic range without the clipboard复制到没有剪贴板的动态范围
【发布时间】:2017-10-12 17:42:10
【问题描述】:

我试图在不使用剪贴板的情况下将值粘贴到不同工作表上的动态范围。当代码到达 Range=Range 部分时,它会出错,指出“应用程序定义的或对象定义的错误”。有什么想法吗?

Sub Test2()
Dim Start As Worksheet
Dim ED As Worksheet
Dim r As Integer, c As Integer, r1 As Integer, c1 As Integer

Set Start = Sheets("Start")
Set ED = Sheets("End")

r = 1
c = ActiveSheet.UsedRange.Columns.Count



With Start
    Do Until .Cells(r, c).Value = ""
        r = r + 1

    Loop
    r = r - 1

End With
 r1 = 1
 c1 = ActiveSheet.UsedRange.Columns.Count

With ED

    Do Until .Cells(r1, c1).Value = ""
        r1 = r1 + 1

    Loop
    r1 = r1

 Range(Cells(r1, 1), Cells(r1 + r - 1, c1)) = Start.Range(Cells(r, c), Cells(1, 1))

 Start.Activate

【问题讨论】:

  • .Range(.Cells(r1, 1), .Cells(r1 + r - 1, c1)).Value = Start.Range(Start.Cells(r, c), Start.Cells(1, 1)).Value 限定 EVERY 范围对象及其父工作表。

标签: vba excel


【解决方案1】:
  1. 总是将每个父级限定为每个 Range 对象。 Range() 中的Cells() 需要指向同一个父对象:

Start.Range(Start.Cells(r, c), Start.Cells(1, 1))

  1. 我们不需要循环,但可以使用END() 来查找最后的列和行。

替换:

Do Until .Cells(r, c).Value = ""
    r = r + 1

Loop
r = r - 1

与:

c = .Cells(1, .Columns.Count).End(xlToLeft).Column
r = .Cells(.Rows.Count, c).End(xlUp).Row
  1. 使用 Resize,它更短更易于维护:

.Cells(r1+1, 1).Resize(r, c).Value = Start.Cells(1, 1).Resize(r, c).Value

所以:

Sub Test2()
Dim Start As Worksheet
Dim ED As Worksheet
Dim r As Long, c As Long, r1 As Long, c1 As Long

Set Start = Sheets("Start")
Set ED = Sheets("End")

With Start
    c = .Cells(1, .Columns.Count).End(xlToLeft).Column
    r = .Cells(.Rows.Count, c).End(xlUp).Row
End With
With ED
    c1 = .Cells(1, .Columns.Count).End(xlToLeft).Column
    r1 = .Cells(.Rows.Count, c1).End(xlUp).Row
    .Cells(r1+1, 1).Resize(r, c).Value = Start.Cells(1, 1).Resize(r, c).Value
End With

【讨论】:

  • 成功!我知道这是一个像那样的小细节。感谢您的帮助/反馈!
猜你喜欢
  • 1970-01-01
  • 2017-03-19
  • 2021-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-01
  • 2022-05-24
  • 2016-08-30
相关资源
最近更新 更多