2012-12-03 241 views
5

好吧,我尝试寻找类似的问题,但由于这是我第一次查看Excel的VBA编辑器,所以我不太了解正在讨论的内容。将excel电子表格合并到一个电子表格中

简单来说,我有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 )。我已经看到了“ActiveCell.SpecialCells(xlLastCell).Select”(当我使用Ctrl + End时激活)功能,但是将我带到了工作表的末尾。使用该功能后,我需要类似于“Home”和“Down”箭头键的功能,才能使其效果最佳。

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

这里是在2010年从Excel的宏录制记录我目前的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 

我希望我没有忘记任何信息的有用部分。让我知道,如果我做到了!

+0

哦谢谢Doug!我不知道论坛选择了足够的语法高亮^^; – Jerry

+0

要获取最后一个真正使用的单元格下面的行,可以编写'Range(“A”&Rows.Count).End(xlup).Offset(1)'。用你需要的任何列替换“A”。 –

+0

不客气杰里。要突出显示,只需突出显示您的代码,然后单击顶部的代码图标即可。它看起来像'{}'。 –

回答

6

杰里,试试这个代码。我清理了一下你的代码,使它能够更有效地做你想做的事情。我根据你的代码所说的我认为是正确的做出了一些假设。如果没有,评论这个答案,我会调整,如果需要的话。

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 
+0

好吧,我试着用上面的样本数据(相同记录),它给了我这个: “单元格A2 =标题1” “单元格A3 =标题1” “单元格A4 =文本3” 而所有其他空白 这里有点晚了,我会上床睡觉。如果你还没有看到明天的代码,那么我会试着去看看代码中可能会出现什么问题。感谢您的帮助到目前为止=) – Jerry

+0

@Jerry - >我编辑了代码并使其适用于您的数据集。如果您需要为真实数据集提供这些信息,则技巧是仅在第一个复制/粘贴中选择标题,并确保您使用的数据集中不包含空白的列来捕获最后一行。 –

+0

谢谢!它现在完美工作,我已经将代码调整为多个表单(我需要的数字)以及相关列的数量。再次感谢!^_ ^ – Jerry

0

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

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

感谢斯科特·霍尔茨曼!