【问题标题】:Merging excel spreadsheets into one spreadsheet将 Excel 电子表格合并到一个电子表格中
【发布时间】:2012-12-03 15:25:39
【问题描述】:

好的,我试图寻找类似的问题,但我不太了解所讨论的内容,因为这是我第一次查看 Excel 的 VBA 编辑器。

简单来说,我有 2 个电子表格:“Sheet1”和“Sheet2”

表 1:

    A         B
1 Header1   Header2
2 Text1     Info1
3 Text2     Info2

表 2:

    A         B
1 Header1   Header2
2 Text3     Info3
3 Text4     Info4

我想有一个宏将两张表合并成一个新表(Sheet3),如下所示:

    A         B
1 Header1   Header2
2 Text1     Info1
3 Text2     Info2
4 Text3     Info3
5 Text4     Info4

我已尝试录制宏并将其保存以备后用。为此,我创建了一个新工作表,将 Sheet1 中的所有内容复制/粘贴到 Sheet3,然后将除标题之外的所有信息从 Sheet2 复制到 Sheet3。

好吧,宏适用于该数据,但我发现 excel 生成的代码使其在粘贴数据之前选择单元格 A4(此处)。虽然这适用于此数据,但如果每张工作表中的记录数不时更改,它将不起作用。基本上,

1) 我想知道是否有一个函数可以在粘贴下一组数据之前自动转到最后一个相关单元格(在本例中为单元格 A4,如果我还有一个表格,则为单元格 A6)。

2) 我已经看到函数“ActiveCell.SpecialCells(xlLastCell).Select”(在我使用 Ctrl+End 时激活),但这会将我带到工作表的末尾。使用该功能后,我需要类似于“Home”和“Down”箭头键的东西才能发挥最佳效果。

这些选项中的任何一个都适合我。 ^_^

这是我当前从 excel 2010 中的宏记录器记录的 VBA 代码:

Sub Collate_Sheets()

    Sheets.Add After:=Sheets(Sheets.Count)
    Sheets(Sheets.Count).Select
    Sheets(Sheets.Count).Name = "Sheet3"
    Sheets("Sheet1").Select
    Range("A1").Select
    Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select
    Selection.Copy
    Sheets("Sheet3").Select
    ActiveSheet.Paste
    ActiveCell.SpecialCells(xlLastCell).Select
    ' I need to select one cell below, and the cell in column A at this point
    Sheets("Sheet2").Select
    Range("A2").Select
    Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("Sheet3").Select
    ActiveSheet.Paste
End Sub

我希望我没有忘记任何有用的信息。如果我这样做了,请告诉我!

【问题讨论】:

  • 哦,谢谢道格!我不知道论坛选择了足够的语法突出显示^^;
  • 要获取最后一个真正使用的单元格下面的行,您可以写Range("A" & Rows.Count).End(xlup).Offset(1)。将"A" 替换为您需要的任何列。
  • 不客气,杰瑞。要突出显示,只需突出显示您的代码,然后单击顶部的代码图标。看起来像{}
  • 嗯,我收到一个错误:“编译错误:属性使用无效”,它突出显示“偏移”。嗯,我刚刚注意到我在原来的帖子中犯了一个错误。它应该是 Excel 2010 而不是 2007。不确定这是否是问题所在。我马上改正。
  • 杰瑞,关于如何实现我所引用的原则的更详细代码,请参见下面的答案。

标签: vba excel


【解决方案1】:

杰瑞,试试这个代码。我稍微清理了你的代码,让它更高效地做你想做的事。我根据您的代码所说的我认为是正确的做了一些假设。如果没有,请对此答案发表评论,如果需要,我会进行调整。

Option Explicit

Sub Collate_Sheets()


   Sheets.Add After:=Sheets(Sheets.Count)
   Dim wks As Worksheet
   Set wks = Sheets(Sheets.Count)

   wks.Name = "Sheet3"

   With Sheets("Sheet1")

    Dim lastrow As Long
    lastrow = .Range("B" & .Rows.Count).End(xlUp).Row

    .Range("A1:B" & lastrow).Copy wks.Range("A" & wks.Rows.Count).End(xlUp)

   End With

   With Sheets("Sheet2")

    lastrow = .Range("B" & .Rows.Count).End(xlUp).Row

    .Range("A2:B" & lastrow).Copy wks.Range("A" & wks.Rows.Count).End(xlUp).Offset(1)

   End With


End Sub

【讨论】:

  • 好的,我用上面的示例数据(相同的记录)进行了尝试,它给了我这个:“Cell A2 = Header1”“Cell A3 = Header1”“Cell A4 = Text3”以及所有另一个空白这里有点晚了,我要去睡觉了。如果你还没有,我明天会试着看看代码中可能有什么问题。感谢您到目前为止的帮助 =)
  • @Jerry -> 我已经编辑了代码并使其适用于您的数据集。如果你需要为你的真实数据集吹出这个,技巧是只在第一次复制/粘贴时选择标题,并确保你使用的列在你的数据集中不包含空白来捕获最后一行.
  • 谢谢!它现在完美运行,我已经将代码调整为多张纸(我需要的数量)和相关列的数量。再次感谢! ^_^
【解决方案2】:

如果有人想在创建之前删除 Shee3 以避免错误

   'Delete Sheet 3
   Application.DisplayAlerts = False
   Sheets("Sheet3").Delete

感谢斯科特·霍尔茨曼!!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-27
    • 2022-01-22
    • 1970-01-01
    • 2013-07-03
    • 1970-01-01
    • 1970-01-01
    • 2017-10-12
    相关资源
    最近更新 更多