根据列数据joinExcellogging

我有3个Excel电子表格与相同的列和(据说)相同的数据。 我需要排列所有3个文件,并查找数据中的不一致性。 数据是在数据中心的服务器信息,我希望服务器位置(行/出租车)和资产标签水平匹配,以便于查看3个文件之间的差异。 如果一个文档会丢失服务器(没有匹配的资产标签或位置是空的),那么我会想在其他两个文档中插入一个空白行,显示它不存在。 希望这一切都有道理。

这是所有3张拼在一起的图像。 (忽略颜色)

Excel Image http://img833.imageshack.us/img833/2937/unledcco.png

谢谢您的帮助。

这是一个使用Excel和VBA的基于ADO的解决scheme。 如果您需要更多有关在Excel / VBA中使用ADO的信息,请尝试http://support.microsoft.com/kb/257819

我假定所有三个电子表格都在一个工作簿中,并且它们被命名为Sheet1,Sheet2和Sheet3。 显然根据需要调整代码。

若要使用ADO,请转到Visual Basic编辑器(通过菜单或通过AltF11 ),然后通过工具>引用(或其相当于更高版本)添加引用:“Microsoft ActiveX数据对象2.8库”

我正在使用Excel 2003及更早版本的提供程序和连接string,因为这是我拥有的版本。 对于Excel 2007及更高版本,请使用它们(replace当然的文件名):

Provider=Microsoft.ACE.OLEDB.12.0

Data Source=filename;Extended Properties=Excel 12.0 Xml;

(注意在连接string中经常会看到“HDR = Yes”,但这是Excel的默认设置,因此可以省略)

首先,我们将创build原始三个电子表格的资产标签的主列表。 创build一个空白工作表并将其称为Sheet4,以便我们有地方放置列表。

在一个正常的模块中,添加以下内容然后运行它:

 Sub master_list() Dim cn As ADODB.Connection Set cn = New ADODB.Connection With cn .Provider = "Microsoft.Jet.OLEDB.4.0" .ConnectionString = "Data Source=" & ThisWorkbook.FullName & ";" & _ "Extended Properties=Excel 8.0;" .Open End With Dim rs As ADODB.Recordset Set rs = New ADODB.Recordset rs.Open "SELECT [Asset Tag] FROM [Sheet1$] UNION SELECT [Asset Tag] FROM [Sheet2$] UNION SELECT [Asset Tag] FROM [Sheet3$];", cn With Worksheets("Sheet4") .Cells(1, 1).Value = "Master" .Cells(2, 1).CopyFromRecordset rs End With rs.Close cn.Close End Sub 

SQL中的UNION运算符只返回不同的logging,所以这个查询在所有三个电子表格中都给出了完整的资产标签列表,没有重复。 我已经使用“Master”作为列名,以防止以后出现任何歧义

现在我们需要将三个单独的表格中的数据与主列表结合起来。 创build一个新的空白表并调用Sheet5。 现在添加并运行以下内容:

 Sub compare_sheets() Dim cn As ADODB.Connection Set cn = New ADODB.Connection With cn .Provider = "Microsoft.Jet.OLEDB.4.0" .ConnectionString = "Data Source=" & ThisWorkbook.FullName & ";" & _ "Extended Properties=Excel 8.0;" .Open End With Dim rs As ADODB.Recordset Set rs = New ADODB.Recordset rs.Open "SELECT * FROM (([Sheet4$] LEFT JOIN [Sheet1$] ON [Sheet4$].[Master] = [Sheet1$].[Asset Tag]) " & _ "LEFT JOIN [Sheet2$] ON [Sheet4$].[Master] = [Sheet2$].[Asset Tag]) " & _ "LEFT JOIN [Sheet3$] ON [Sheet4$].[Master] = [Sheet3$].[Asset Tag];", cn Dim fld As ADODB.Field Dim i As Integer i = 0 With Worksheets("Sheet5") For Each fld In rs.Fields i = i + 1 .Cells(1, i).Value = fld.Name Next fld .Cells(2, 1).CopyFromRecordset rs End With rs.Close cn.Close End Sub 

这应该有希望为您提供来自所有三个电子表格的资料标签主列表的数据。 列名可能会有点奇怪(例如“Sheet1 $ .Asset标签”等),所有的格式将会丢失,但至less你可以看到哪些表丢失数据

使用macros,你可以做到这一点。

 Sub Insert_Rows_Loop() Dim CurrentSheet As Object ' Loop through all selected sheets. For Each CurrentSheet In ActiveWindow.SelectedSheets ' Insert n rows depending on values // **** // Write your conditions // **** // Insert a row as below CurrentSheet.Range("b:b").EntireRow.Insert // Do other stuffs.... Next CurrentSheet End Sub