【问题标题】:Copy and moving an entire sheet to another workbook. 1mil rows to 65536 rows将整个工作表复制并移动到另一个工作簿。 100 万行到 65536 行
【发布时间】:2016-09-01 12:17:53
【问题描述】:

以下是我的代码的一部分,它涉及将整个命名工作表从一个主文件复制到一个正在处理的新未保存文件:

ActiveWorkbook.Sheets("VehicleList").Copy _
   After:=Workbooks(2).Sheets(1)

因此,将工作表放入工作簿 2 效果很好,但现在我们正在处理的文件处于旧 excel 模式,由于旧 excel 的行数较少,会引发以下错误:

“Excel 无法将工作表插入到目标工作簿中,因为它包含的行和列较少”

如何在不破坏代码的情况下调整复制和粘贴到Workbooks(2)?我认为定义一个 1000 行的范围来复制和移动会起作用,但这也给出了一个错误。感谢您的帮助。

【问题讨论】:

  • 1000 行位的代码在哪里?
  • 我修改为; ActiveWorkbook.Sheets("VehicleList").Range(A1:F1000).Copy _ After:=Workbooks(2).Sheets(1)
  • 而且……它成功了吗?
  • @user3598756 我认为这意味着它没有。这就是他尝试过的,我让他加入。
  • 更正,因此给出了“预期的变量或过程”错误。我想知道是否有一种简单的方法可以像我一样复制整个工作表,但要考虑到 Excel 版本之间的行数差异。

标签: vba excel compatibility


【解决方案1】:

假设您只需要这些值(即我通过不进行复制粘贴来加快速度),您可以这样做:

Workbooks(2).Sheets.Add After:=Sheets(1)
Workbooks(2).Sheets(2).Range("A1:F1000").Value = ActiveWorkbook.Sheets("VehicleList").Range("A1:F1000").Value

【讨论】:

    【解决方案2】:

    我会像下面这样去

    Option Explicit
    
    Sub main()
        Dim targetWs As Worksheet
    
        With Workbooks("MyWorkbookname").Sheets("VehicleList") '<--| fully qualify reference wanted worksheet in the wanted workbook
            Set targetWs = SetOrGetSheet(Workbooks(2), .name) '<--| get the (new) target worksheet on the target workbook named after referenced sheet
            Intersect(.Range("A1:F1000"), .UsedRange).Copy targetWs.Cells(1, 1) '<--| copy range to target worksheet on the target workbook
            If targetWs.name <> .name Then MsgBox "a new sheet has been created in " & targetWs.Parent.name & " with name " & targetWs.name
        End With
    End Sub
    
    Function SetOrGetSheet(targetWb As Workbook, shtName As String) As Worksheet
        targetWb.Worksheets.Add '<--| add a new sheet in the target workbook
    
        On Error Resume Next
        Set SetOrGetSheet = targetWb.Worksheets(shtName) '<--| try and get any possible target workbook sheet with the passed name
        If SetOrGetSheet Is Nothing Then targetWb.ActiveSheet.name = shtName '<--| if target workbook has no worksheet with passed name then name the new one after it
        Set SetOrGetSheet = targetWb.ActiveSheet 'return the new worksheet
    End Function
    

    如果您担心要复制的范围可能超过 65 行和/或 256 列,那么您应该添加其大小检查


    编辑仅用于粘贴值

    如果你对粘贴值感兴趣,那么你可以像下面这样:

    Sub main()
        SetOrGetSheet(Workbooks(2), "VehicleList").Range("A1:F1000").value = ActiveWorkbook.Sheets("VehicleList").Range("A1:F1000").value '<--| copy values form source to target worksheet
    End Sub
    

    SetOrGetSheet() 函数与上述相同

    正如您可能已经猜到的那样,function 有一个更通用的方法,您可能希望(或只是拥有)处理 target 工作簿的可能性一个以“VehicleList”命名的工作表

    【讨论】:

    • 有用,谢谢。我选择了蒂姆的答案,因为移动值很简单。
    • 不客气。我编辑了我的答案,以考虑到纯值粘贴和 1)向您展示您的主代码中的单纯实现非常短(1 行代码) 2)为您提供信息,让您对@987654325 的使用做出决定@函数
    猜你喜欢
    • 2023-02-04
    • 1970-01-01
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多