将一个 Excel 工作表中的命名范围复制到另一个工作表中的命名范围

时间:2021-01-13 01:03:28

标签: excel vba copy paste

我一直试图将一个 Excel 工作表中的命名范围复制到另一个工作表中的命名范围

Sub Update()
'update availability and utilisation to SMU Tracking sheet

Application.ScreenUpdating = False
Dim ws1 As Worksheet:
    Set ws1 = Worksheets("Delays_a") 'source

Dim ws2 As Worksheet:
    Set ws2 = Worksheets("SMU Tracking") 'destination

'copy
ws1.Range("Productivity").Copy
ws2.Range("ProductivitySMU").Select
ws2.Range("ProductivitySMU").Paste

Application.CutCopyMode = False
Application.ScreenUpdating = True

End Sub

感谢任何帮助。

更新:

我也试过这个代码

Sub CommandButton2_Click()
'update availability and utilisatioon to SMU Tracking sheet

Dim ws1 As Worksheet:
    Set ws1 = Worksheets("Delays_a") 'source

Dim ws2 As Worksheet:
    Set ws2 = Worksheets("SMU Tracking") 'destination

'copy
ws1.Range("Productivity").Copy 'cells to copy

lrow = 1500000
For i = 5 To lrow
    If Cells(i, 7) = "" Then 'If cell is empty then paste new value
    ws2.Range("ProductivitySMU").PasteSpecial xlPasteValues
    End If
Next i
End Sub

问题是这些值被粘贴到 Range("ProductivitySMU") 中的所有空单元格中。

1 个答案:

答案 0 :(得分:0)

请试试这个代码。它将新数据附加到目标范围的预先存在的内容中。

Private Sub CommandButton2_Click()
    'update availability and utilisatioon to SMU Tracking sheet
    
    Dim ws1     As Worksheet                    ' source
    Dim ws2     As Worksheet                    ' destination
    Dim Rt      As Long                         ' target row
    Dim Ct      As Long                         ' target column
    
    Set ws1 = Worksheets("Delays_a")
    Set ws2 = Worksheets("SMU Tracking")
    
    With ws2.Range("ProductivitySMU")
        Ct = .Column
        Rt = ws2.Cells(.Row, Ct).End(xlDown).Row + 1
        If Rt > ws2.Rows.Count Then Rt = .Row
    End With
    ws1.Range("Productivity").Copy
    With ws2.Cells(Rt, Ct)
        .PasteSpecial xlPasteAll
        .PasteSpecial xlPasteColumnWidths
        ' https://docs.microsoft.com/en-us/office/vba/api/excel.xlpastetype
    End With
    Application.CutCopyMode = False
End Sub

本质上,目标范围不需要命名,因为代码只是使用名称来查找目标单元格。事实上,如果列中的总行数超过指定的行数,则名称将变得无关紧要。就我的代码而言,目标范围的相关成员是其第一个单元格。如果您在项目中对该范围有其他用途,您可以使其动态化,自动扩展到列的末尾,而不会影响此代码的功能。