我尝试使用Excel做一些非常简单的事情,但我无法找到如何做到这一点。
我有几个工作表,每个工作表都包含一个表。举个例子,这是我的两个工作表:
第一个工作表。请注意,线条是绿色的。 一些数据。没有'对不起: - )
我想:
这是一个可能的输出:
请注意,相同的标头已正确合并。
我可以用Excel执行此操作吗?我知道我可以进行查询(UNION ALL),但这样做并不能保留样式格式。
我尝试使用微软查询构建表格。这是我的疑问:
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$`
此请求效果很好,结果如下:
但我仍有问题:
答案 0 :(得分:1)
你有一些问题......工会可以工作。假设第一次编辑的联合路径。
在两个工作表上添加占位符列以允许正确的联合,或者使用t-sql查询强制占位符列。
向表示源的每个工作表添加列,或者使用t-sql查询添加这些列。例如'Sheet 1中'
在带有结果的工会工作表上,添加条件格式,其中评估具有源类型单元格的行,然后根据需要格式化整行。例如单元格A2具有“Sheet1”,然后行A显示为绿色。
答案 1 :(得分:1)
如果我理解你,你想:
这两个问题的答案都是肯定的,具体取决于您选择合并/同步/显示数据的方式......
方法#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