【问题标题】:Concat tables in different excel worksheet不同Excel工作表中的Concat表
【发布时间】:2018-01-06 00:39:31
【问题描述】:

问题

我正在尝试使用 Excel 做一些可能非常简单的事情,但我找不到如何去做。

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

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

第二个。线条是灰色的,但单元格可以是红色的。标题不一样

我想:

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

这是一个可能的输出:

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

我可以用 Excel 做到这一点吗?我知道我可以进行查询 (UNION ALL),但这样做不会保留样式格式。

编辑 1

我尝试使用 microsoft 查询来构建表。这是我的查询:

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$`

这个请求效果很好,结果如下:

但我仍然有问题:

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

【问题讨论】:

  • 我不确定这是合并还是附加?您有不同的列,因此不确定 UNION ALL 在不向每个表中添加相同列名的情况下如何工作。我认为如果这是一个追加操作并且有匹配的标题和行数,你可以有一个帮助列来标识原始行来自哪个表,然后使用应用原始源格式的 IF 语句将条件格式应用于合并表取决于辅助列值?
  • 如果是合并,我想您可能会考虑使用标题来识别列来自哪个表,并使用它来应用正确的格式。然后我不确定的是如何在没有 VBA 的情况下做到这一点。此外,还需要确定 JOIN 类型。不确定,是否可以覆盖 powerquery 表合并的条件格式。
  • 你的问题太宽泛了。您需要澄清表之间的关系,更重要的是一些代码可以展示您自己解决问题所付出的努力。您应该先担心数据,然后再处理格式。
  • 你为什么不录制一个宏在Total之后将“Destination”列添加到Worksheet1中,然后在Amount之后将“Price”列添加到Worksheet2中。然后继续宏,将源格式从 Worksheet1 和 Worksheet2 复制并粘贴到 NEW Worksheet3。并且每次运行第一个宏之前还记录一个宏来清除Worksheet3中的所有数据。还有另一个宏,用于在最后的第一个宏之后(在填充工作表 3 之后)从 Worksheet1 和 2 中删除“Destination”和“Price”列。
  • 一方面,如果你尝试了一些东西会很好,这样其他人可以跟进。另一方面,合并操作似乎定义不明确。您应该为行/列中重合/不重合值的各种可能组合指定要获得的结果。

标签: vba excel


【解决方案1】:

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

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

向代表源的每个工作表添加列,或者将这些列添加到您的 t-sql 查询中。例如'表 1'

在包含结果的联合工作表上,添加条件格式,其中对包含源类型单元格的行进行评估,然后根据需要对整行进行格式化。例如单元格 A2 有“Sheet1”,然后 A 行颜色为绿色。

【讨论】:

    【解决方案2】:

    如果我理解你,你想:

    1. 从现有工作表复制数据保留格式并将它们放入另一个工作表(新的或现有的;我们称之为“合并数据”),
    2. 在源工作表和“合并工作表”之间保持单向同步,这意味着当源工作表发生变化时,“合并工作表”也会发生变化。

    这两个问题的答案都是肯定的,具体取决于您选择合并/同步/显示数据的方式...

    方法 #1 - 将数据复制粘贴到另一个下方

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

    方法#2 - 使用Range.CopyFromRecordset method UNION 语句

    如果你想使用这个方法,你必须把你的数据集改成relational database的模型。没有机会保留源格式,但“合并的工作表”可能会很快重新加载(a'ka 更新)。

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

    在我的示例中,我有 3 张纸。第一张和第二张表用作数据源,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
    

    最后说明:请随意更改以上代码以满足您的需要。

    【讨论】:

      【解决方案3】:

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

      编辑:添加示例

      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

      【讨论】:

        猜你喜欢
        • 2022-01-26
        • 1970-01-01
        • 2015-07-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-06
        相关资源
        最近更新 更多