为了账号安全,请及时绑定邮箱和手机立即绑定

将2个Excel表合并为一个附加数据?

/ 猿问

将2个Excel表合并为一个附加数据?

慕田峪4524236 2019-10-21 14:51:18

我在MS Excel 2007工作簿的2张单独的纸上有2张表,如下所示:


===========================

no.   f_name     l_name  

===========================

13   Little     Timmy

1   John       Doe

17   Baby       Jessica

---------------------------



===========================

no.   f_name     l_name  

===========================

1   john       Tim

16   kyle       joe

14   Baby       katy

22   qbcd       wsde

---------------------------

两者都具有相同的列,但是它们可以具有不同的数据。


我想垂直合并两个表的数据,即单个表与第三个单独工作表中的所有数据。如果可能的话,我想添加另一列与行来自的工作表名称。


===================================

SheetName   no.   f_name     l_name  

===================================

Sheet1      13   Little     Timmy

Sheet1      1   John       Doe

Sheet1      17   Baby       Jessica

Sheet2      1   john       Tim

Sheet2      16   kyle       joe

Sheet2      14   Baby       katy

Sheet2      22   qbcd       wsde

-----------------------------------

不用宏就可以做到吗?


查看完整描述

3 回答

?
慕虎7371278

您可以激活Office剪贴板(“功能区主页”选项卡上剪贴板部分右下角的箭头)。复制两个范围,然后使用“ 全部粘贴”命令,如下所示。


您仍然需要首先在额外的列中填写工作表名称,尽管可以通过双击填充手柄来完成。


//img4.sycdn.imooc.com/5dad55d00001554607760316.jpg

更新资料


为了获得与公式相同的结果,请尝试填写工作表名称:


=IF(ROW()<=COUNTA(Sheet1!A:A),"Sheet1",IF(ROW()<COUNTA(Sheet1:Sheet2!A:A),"Sheet2",""))

然后填写该公式并填写表格中的值:


=IF(ROW()<=COUNTA(Sheet1!A:A),Sheet1!A2,IF(ROW()<COUNTA(Sheet1:Sheet2!A:A),INDEX(Sheet2!A:A,ROW()-COUNTA(Sheet1!A:A)+1),""))


查看完整回答
反对 2019-10-21
?
慕斯709654

对Jeeped的代码略作修改。


如果您碰巧使用类似的方法,但是有多个表(例如,超过10个),那么尝试手动添加每个表的每个名称将非常麻烦。如果您更改表的名称,这也是一个问题,因为名称在VBA中是固定连接的。为了避免其他工作,请考虑以下事项:


因此,假设以下内容:


在每个工作表上都有一个或几个表,但是它们具有相似的结构。

工作表上只有表格-没有其他ListObjects集合成员。

每次我们在工作表上编辑表格时,这都会触发主表(表3)中的更新。

然后,上例中的Workbook_SheetChange Sub可能如下所示:


     Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

     Dim tbl As ListObject

     For Each tbl In ActiveSheet.ListObjects

        If Not Intersect(Target, tbl.Range.Offset(1, 0)) Is Nothing Then

            On Error GoTo bm_Safe_Exit

            Application.EnableEvents = False

            Call update_Table

        End If

        Next tbl

        bm_Safe_Exit:

        Application.EnableEvents = True

     End Sub

编辑。第二个例程如下所示:


   Private Sub update_Table()

    Dim iTBL3rws As Long, rng As Range, rngOLDBDY As Range

    Dim tbl As ListObject

    Dim sht As Worksheet

    iTBL3rws = 0


    ' consider all tables, excluding master table

    For Each sht In ThisWorkbook.Worksheets

        For Each tbl In sht.ListObjects

            If tbl.Name <> "Table3" Then

                iTBL3rws = iTBL3rws + tbl.DataBodyRange.Rows.Count

            End If

        Next tbl

    Next sht


    iTBL3rws = iTBL3rws + Sheet3.ListObjects("Table3").DataBodyRange.Cells(1, 1).Row - Sheet3.ListObjects("Table3").Range.Cells(1, 1).Row

        With Sheet3.ListObjects("Table3")


            Set rngOLDBDY = .DataBodyRange


            .Resize .Range.Cells(1, 1).Resize(iTBL3rws, .DataBodyRange.Columns.Count)


            If rngOLDBDY.Rows.Count > .DataBodyRange.Rows.Count Then

                For Each rng In rngOLDBDY

                    If Intersect(rng, .DataBodyRange) Is Nothing Then

                        rng.Clear

                    End If

                Next rng

            End If

        End With


End Sub

此例程与先前的例程有所不同,因为它消除了预编程的情况。当活动工作表上注册了更改时,该工作表中任何将要更改的表都将触发update_Table过程。


查看完整回答
反对 2019-10-21

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信