不同excel工作表中的Concat表

时间:2017-12-27 10:09:38

标签: excel vba excel-vba

问题

我尝试使用Excel做一些非常简单的事情,但我无法找到如何做到这一点。

我有几个工作表,每个工作表都包含一个表。举个例子,这是我的两个工作表:

enter image description here 第一个工作表。请注意,线条是绿色的。 一些数据。没有'对不起: - )

enter image description here 第二个。线条是灰色的,但细胞可以是红色。标题不一样

我想:

  • 将这些表合并到另一个工作表
  • 保持样式格式(线条颜色等)
  • 当我更新表时,合并的表也应该更新(可能是宏)

这是一个可能的输出:

enter image description here

请注意,相同的标头已正确合并。

我可以用Excel执行此操作吗?我知道我可以进行查询(UNION ALL),但这样做并不能保留样式格式。

编辑1

我尝试使用微软查询构建表格。这是我的疑问:

SELECT * FROM `C:\Users\cflodrops\Downloads\comptes.xlsx`.`Purchases$` `Purchases$`  
UNION ALL  
SELECT * FROM `C:\Users\cflodrops\Downloads\comptes.xlsx`.`Sales$` `Sales$`
UNION ALL  
SELECT * FROM `C:\Users\cflodrops\Downloads\comptes.xlsx`.`Trades$` `Trades$`
UNION ALL  
SELECT * FROM `C:\Users\cflodrops\Downloads\comptes.xlsx`.`Transfers$` `Transfers$`

此请求效果很好,结果如下:

enter image description here

但我仍有问题:

  • 样式格式不正确(背景颜色和数字格式)
  • 数组在数组之间不同步。这不是问题,每当我点击按钮时,我都可以创建一个宏来执行请求。

3 个答案:

答案 0 :(得分:1)

你有一些问题......工会可以工作。假设第一次编辑的联合路径。

在两个工作表上添加占位符列以允许正确的联合,或者使用t-sql查询强制占位符列。

向表示源的每个工作表添加列,或者使用t-sql查询添加这些列。例如'Sheet 1中'

在带有结果的工会工作表上,添加条件格式,其中评估具有源类型单元格的行,然后根据需要格式化整行。例如单元格A2具有“Sheet1”,然后行A显示为绿色。

答案 1 :(得分:1)

如果我理解你,你想:

  1. 复制数据,保留现有工作表中的格式并将其放入另一个工作表(新的或现有的;让我们称之为"合并的数据"),
  2. 在源表和"合并表"之间保持单向同步,这意味着当源表正在更改时,"合并表"也发生了变化。
  3. 这两个问题的答案都是肯定的,具体取决于您选择合并/同步/显示数据的方式......

    方法#1 - 使用copy&将数据粘贴到另一个下面

    此方法将保留格式,但在更改源数据时,无法更新目标表(工作表)。每次要查看合并数据时,您都需要创建它。

    方法#2 - 将Range.CopyFromRecordset method UNION声明一起使用

    如果要使用此方法,则必须将数据集更改为relational database的模型。没有机会保留源格式,但"合并表格"可以快速重新加载(更新)。

    这两种在您在此处找到的工作表之间复制数据的方法:Copy Data Between Excel Sheets using VBA,但此提示不提供有关在其原始格式内复制数据的信息。因此,我决定澄清如何实现这一点并显示/提供创建具有合并数据的目标表的代码。

    在我的例子中我有3张。第一张和第二张用作数据源,第一张用于显示合并数据。只有3列(A-C)包含数据,因此要复制的范围是硬编码的。

    Option Explicit
    
    'method #1
    Private Sub CopyWithFormatting(srcSh As Worksheet, dstSh As Worksheet, Optional sCol As String = "A")
    Dim e1 As Long, e2 As Long
    
    On Error GoTo Err_CopyWithFormatting
    'last row in src and dst sheet
    e1 = srcSh.Range(sCol & srcSh.Rows.Count - 1).End(xlUp).Row
    e2 = dstSh.Range(sCol & dstSh.Rows.Count - 1).End(xlUp).Row + 1
    'do not refresh screen
    Application.ScreenUpdating = False
    
    'copy defined range
    srcSh.Range("A2:C" & e1).Copy
    'paste below existing data
    With dstSh.Range("A" & e2)
        .PasteSpecial xlPasteAllUsingSourceTheme
        .PasteSpecial xlPasteFormats
        .PasteSpecial xlPasteValidation
    End With
    
    Exit_CopyWithFormatting:
        On Error Resume Next
        'restore default settings
        With Application
            .CutCopyMode = False
            .ScreenUpdating = True
        End With
        Exit Sub
    
    Err_CopyWithFormatting:
        MsgBox Err.Description, vbExclamation, "Err no. " & Err.Number
        Resume Exit_CopyWithFormatting
    
    End Sub
    

    如何使用它?

    Sub TestMethod1()
    Dim CopiedSheet As Worksheet, DestSheet As Worksheet
    
    'as i mentioned -> 3. sheet is used to merge data 
    'you can change it by using sheet's name or its index
    Set DestSheet = ThisWorkbook.Worksheets(3)
    
    'copy data from sheets into destination sheet
    For Each CopiedSheet In ThisWorkbook.Worksheets
        'ignore destination sheet
        If CopiedSheet Is DestSheet Then GoTo SkipNext
        CopyWithFormatting CopiedSheet, DestSheet
    SkipNext:
    Next
    
    End Sub
    

    Finall note :您可以根据自己的需要更改上述代码。

答案 2 :(得分:0)

在第三张表格中,我将在Activate事件中有一个宏,它从前两张纸张中提取数据。我会在第三张表中添加一个隐藏列,其中包含原始工作表。在第三张表的条件格式中,您需要将格式设置为隐藏列中的值。如果您愿意,我可以发布样本以澄清。

编辑:添加样本

Private Sub Worksheet_Activate()
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    Dim Sheet1 As Worksheet
    Dim Sheet2 As Worksheet
    Dim Sheet3 As Worksheet
    Set Sheet1 = Worksheets(1)
    Set Sheet2 = Worksheets(2)
    Set Sheet3 = Worksheets(3)
    Sheet1.Range("A2:D101").Copy
    Sheet3.Cells(2, 1).Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    Sheet2.Range("A2:D101").Copy
    Sheet3.Cells(102, 1).Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    Sheet3.Cells(1, 1).Select
    ActiveWorkbook.Worksheets("Sheet3").AutoFilter.Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Sheet3").AutoFilter.Sort.SortFields.Add Key:=Range _
        ("A1:A201"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
        xlSortNormal
    With ActiveWorkbook.Worksheets("Sheet3").AutoFilter.Sort
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
End Sub

这是一个示例文件。 ConcatSheets Example.xlsm