如何在 Excel 中合并具有相同列的两个表?

Aje*_*i32 11 microsoft-excel-2007 microsoft-excel

在 Excel 中,我有一个电子表格,可将数据从 SQL 数据库提取到表中,然后根据该数据生成报告。不幸的是,这个 SQL 数据库中的数据不完整,我想在结果集中包含额外的行,这些行是手动输入到电子表格中的。

正如我所愿,我不能只是手动将这些额外的行插入表中,因为只要 Excel 从 SQL 数据库中提取新数据,它们就会被删除。因此,相反,我正在考虑在新工作表上创建一个具有相同列标题的单独表并在那里输入数据,然后在另一个工作表上创建第三个表,该表以某种方式组合从 SQL 中提取数据的表中的行和我手动输入数据的表。我怎样才能做到这一点?(或者,有没有更好的方法来做到这一点,但我不知何故失踪了?)


例子:

Table 1 (From Database):

  | Person | Week Of | Task | Hours |
  | Bob    | 1/6/13  | Foo  | 12    |
  | Mary   | 1/6/13  | Foo  | 7     |
  | Mary   | 1/6/13  | Bar  | 5     |
  | John   | 1/6/13  | Foo  | 5     |
  | John   | 1/13/13 | Foo  | 13    |
Run Code Online (Sandbox Code Playgroud)

——

Table 2 (Entered Manually): 
  | Person | Week Of | Task | Hours |
  | Bob    | 1/6/13  | Baz  | 3     |
  | Mary   | 1/6/13  | Baz  | 2     |
  | John   | 1/13/13 | Baz  | 5     |
Run Code Online (Sandbox Code Playgroud)

——

Result:
  | Person | Week Of | Task | Hours |
  | Bob    | 1/6/13  | Foo  | 12    |
  | Mary   | 1/6/13  | Foo  | 7     |
  | Mary   | 1/6/13  | Bar  | 5     |
  | John   | 1/6/13  | Foo  | 5     |
  | John   | 1/13/13 | Foo  | 13    |
  | Bob    | 1/6/13  | Baz  | 3     |
  | Mary   | 1/6/13  | Baz  | 2     |
  | John   | 1/13/13 | Baz  | 5     |
Run Code Online (Sandbox Code Playgroud)

Aje*_*i32 5

我找到了一种方法。这个解决方案有点棘手,它需要两个表都有自己的单独工作表(上面没有其他任何东西),但除此之外,它几乎完全符合我的要求。(这里似乎也有很多潜力可以进行更复杂的操作,例如连接。)

转到功能区上的数据选项卡,单击“来自其他来源”和“来自 Microsoft Query”。然后单击 Excel 文件,选择您当前正在使用的文件,然后单击确定。然后,点击取消,并在提示您是否要继续在 Microsoft Query 中编辑时,点击“是”。从这里您可以单击 SQL 按钮并在电子表格的任何工作表上编写自定义 SQL 查询。就我而言:

SELECT *
FROM `'Sheet1$'` `'Sheet1$'`
UNION ALL
SELECT *
FROM `'Sheet2$'` `'Sheet2$'`
Run Code Online (Sandbox Code Playgroud)

注意:对我来说,此方法在我关闭文件并再次打开后停止工作。无论如何,我还是将它张贴在这里,以防万一它只是我的计算机出现问题或其他人可以让它工作。


chu*_*uff 2

这是一个没有 VBA 的纯 Excel 解决方案。它的工作原理是使用 INDEX 函数逐步降低 SQL 数据的行和列,直到用尽值并产生错误条件。IFERROR 函数捕获错误并使用第二个 INDEX 函数逐步向下移动手动输入数据的行和列,直到这些值耗尽并产生错误条件。第二个 IFERROR 函数捕获错误并返回破折号(“-”)。(必须通过功能区刷新 SQL 数据,公式才能产生正确的结果。)

使用以下公式为 Sheet1 中的 SQL 数据创建动态命名范围 SQLDB:

=OFFSET(Sheet1!$A$2,0,0,COUNTA(Sheet1!$A:$A)-1,COUNTA(Sheet1!$1:$1))
Run Code Online (Sandbox Code Playgroud)

使用以下公式为 Sheet2 中手动输入的数据创建第二个动态命名范围 EXCELRNG:

=OFFSET(Sheet2!$A$1,1,0,COUNTA(Sheet2!$A:$A)-1,COUNTA(Sheet2!$1:$1))
Run Code Online (Sandbox Code Playgroud)

这两个命名范围均假定变量名称已输入到两个工作表每一个的第 1 行中。

在 Sheet3 的第 1 行(从单元格 A1 开始)中输入变量名称。

在 Sheet3 的单元格 A2 中输入以下公式:

=IFERROR(INDEX(SQLDB,ROWS(A$2:A2),COLUMN(A2)),IFERROR(INDEX(EXCELRNG,ROWS(A$2:A2)-ROWS(SQLDB),COLUMN(A2)),"-"))
Run Code Online (Sandbox Code Playgroud)

将公式复制到变量名称列中,然后向下复制到行中,直到公式结果全部为破折号(“-”)。

下一步可以在另一个工作表中创建数据透视表以进行分析和组织。

同样,第一步是创建一个动态命名范围,例如 RESULTRNG,在命名范围的名称管理器输入框中插入以下公式:

=OFFSET(Sheet3!$A$1,0,0,COUNTA(Sheet1!$A:$A)+COUNTA(Sheet2!$A:$A)-1,COUNTA(Sheet1!$1:$1))
Run Code Online (Sandbox Code Playgroud)

然后在新工作表中创建数据透视表,将 RESULTRNG 设置为要分析的表。这将从 Sheet3 的公式表中过滤掉所有尾随破折号。

这是有效的,因为 RESULTRNG 公式计算 Sheet1 和 Sheet2 中的总行数(不包括 Sheet2 中的标题)以及 Sheet1 中的总列数,并根据这些计数设置其范围,不包括任何尾随行中的任何破折号( Sheet3 公式表中的列)。