【问题标题】:merge Excel sheets as values将 Excel 工作表合并为值
【发布时间】:2015-10-27 08:46:36
【问题描述】:

我正在使用一些代码(通过:http://www.extendoffice.com/documents/excel/1184-excel-merge-multiple-worksheets-into-one.html 找到)来合并 5 张工作表,每张工作表有 1000 行。

Sub Combine()
Dim J As Integer
On Error Resume Next
Sheets(1).Select
Worksheets.Add
Sheets(1).Name = "Combined"
Sheets(2).Activate
Range("A1").EntireRow.Select
Selection.Copy Destination:=Sheets(1).Range("A1")
For J = 2 To Sheets.Count
Sheets(J).Activate
Range("A1").Select
Selection.CurrentRegion.Select
Selection.Offset(1, 0).Resize(Selection.Rows.Count - 1).Select
Selection.Copy Destination:=Sheets(1).Range("A65536").End(xlUp)(2)
Next
End Sub

这似乎工作得很好,除了我需要使用“粘贴为值”方法来组合工作表(因为我的个人工作表有很多公式,我只想将它们组合为文本版本)。

此代码能否轻松更改为“粘贴为值”?

谢谢。

【问题讨论】:

    标签: excel merge vba


    【解决方案1】:
    Sub Combine()
    Dim J As Integer
    On Error Resume Next
    Sheets(1).Select
    Worksheets.Add
    Sheets(1).name = "Combined"
    Sheets(2).Activate
    Range("A1").EntireRow.Select
    Selection.Copy Destination:=Sheets(1).Range("A1")
    For J = 2 To Sheets.Count
    Sheets(J).Activate
    Range("A1").Select
    Selection.CurrentRegion.Select
    Selection.Offset(1, 0).Resize(Selection.Rows.Count - 1).Copy
    Sheets(1).Range("A65536").End(xlUp)(2).PasteSpecial xlPasteValues
    Next
    End Sub
    

    这行得通吗?如果是这样,我们可以着手处理removing .select 以使其更加“紧凑”。我已经在.Copy 线上做了(你能看到我做了什么吗?)

    编辑:这几乎可以实现 - 我认为您会在粘贴部分遇到问题,但我可以解决这个问题。请告诉我,在您的原始代码中,您选择的 CurrentRegion 是什么?试图复制/粘贴什么?

    编辑 2:好的,我想我终于明白了。问题是您使用Sheets(1)Sheets(2)。我不知道您的文档如何,但以下假设适用于这些假设:您有“不变”的工作表处于活动状态(这是带有您的神奇公式的工作表)。只需激活它并运行下面的宏。

    Sub Combine()
    Dim J As Integer, noRows As Integer
    Dim ws1 As Worksheet, ws2 As Worksheet, magicWS As Worksheet
    
    ' Note, you need to have the worksheet where you do all of your formulas open and be the active sheet.
    Set magicWS = ActiveSheet
    
    Set ws1 = Sheets.Add(after:=magicWS)
    ws1.Name = "Combined"
    
    On Error Resume Next
    
    'Now, I assume that your main (unchanging) worksheet is the FAR LEFT most
    'Then, the second worksheet is the new "Combined".  If you look along the bottom, every worksheet RIGHT of "Combined" will need
    'to be added to this WS.
    
    'First, let's get the headers from the third sheet:
    ws1.Cells.Rows(1).Value = Sheets(3).Cells.Rows(1).Value
    
    'Now, let's add the data to "Combined"!
    For J = 3 To Sheets.Count
        noRows = Sheets(J).Range("A1").CurrentRegion.Rows.Count
        Sheets(J).Range("A1").CurrentRegion.Offset(1, 0).Resize(noRows - 1).Copy
        ws1.Range("A65536").End(xlUp)(2).PasteSpecial xlPasteValues
    Next J
    
    Application.CutCopyMode = False
    
    End Sub
    

    【讨论】:

    • 但也许您可以告诉...我对vba一无所知-所以不了解删除.select等的影响...我相信您的判断! :)
    • 基本上,.Select 从字面上选择单元格/无论它是什么(范围、单元格等)。如果您使用 F8 单步执行宏,您会看到这种情况。每次使用 .select 时,Excel 都会实际选择该单元格。如果您在宏运行时使用鼠标执行任何操作,或者想要切换工作表等,这可能会导致问题。最好使用对数据的直接引用。我将尽可能更新我的解决方案以消除.select。但非常值得检查该线程(和谷歌“避免选择并使用 VBA 激活”)。
    • 非常感谢蝙蝠侠!确实,我会检查一下...我觉得这将是我在 Excel VBA 中全新冒险的开始:)
    • 关于最新的更新,老实说,我不知道当前区域.. 除了它有效。基本上我有 5 张纸,每张都有相同的结构和相同数量的行等。每张纸都是为不同的语言定制的(用于网站上传)。原始宏神奇地拉动每张纸并合并为一张。说实话……你会比我更了解其他的……
    • 嘿@egg,.select 问题是我自己的错误。如果您计划在未来大量使用 VBA,我强烈建议您考虑一下。现在我明白你在做什么了 - 我会重新审视我的代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-07
    相关资源
    最近更新 更多