2017-10-12 85 views
0

我试图在不使用剪贴板的情况下将值粘贴到不同工作表上的动态范围。当代码到达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 
+1

'.Range(.Cells(R1,1),.Cells(R1 + R1,C1))值= Start.Range(Start.Cells(R ,c),Start.Cells(1,1))。Value' Qualify *** EVERY *** Range object with its parent sheet。 –

回答

3
  1. ALWAYS每一个家长有资格每Range对象。该范围()内的Cells()需要在同一母公司必须指出:

Start.Range(Start.Cells(r, c), Start.Cells(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 
    
  • 使用调整大小,它是较短的,更易于维护:
  • .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 
    
    +0

    成功!我知道这是一个小细节。感谢帮助/反馈! – Zach