2011-10-19 34 views
1

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

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

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

感谢您的帮助。

+0

难道是正确的,查看电子表格作为主副本中的一个(即每一个资产标签出现在该电子表格),另外两个电子表格包含主副本中资产标签的一些子集?因此,如果每个资产标签都列在屏幕截图的C列中,那么列H和M中的资产标签列表将包含部分资产从C柱,但除了H和中号的标签将包含不存在于柱C.这是对行权的任何其他资产标签? – barrowc

+0

不完全是。C,H,M等也都含有不位于另一个资产标签标签列,我的目标是排列匹配的资产标签,以便我可以验证其余的信息是否正确。它还可以帮助按行/ cab排序,因为第一列是 –

+0

好的。所以,你会需要构建所有资产标签的主列表,然后从针对主列表中的每个电子表格排队的记录(在一个或多个C,H和M是否上市)找到其中的差距是 – barrowc

回答

1

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

我打算假设您的所有三个电子表格都在一个工作簿中,并且它们被命名为Sheet1,Sheet2和Sheet3。显然根据需要调整代码。要使用ADO,请转到Visual Basic编辑器(通过菜单或通过Alt - F11),然后通过工具>参考(或其在后续版本中的等效项)添加对以下项的引用:“Microsoft ActiveX Data Objects 2.8 Library “

我使用Excel 2003及更早版本的提供程序和连接字符串,因为这是我拥有的版本。对于Excel 2007及更高版本,使用这些替代(替换过程的文件名):

Provider=Microsoft.ACE.OLEDB.12.0

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

(NB,你会经常看到 “HDR =是” 在连接字符串但是这是默认设置为Excel,因此可以省略)

首先,我们会从原来的三个电子表格创建资产标签的主列表。创建一个空白工作表并将其称为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 

UNION运营商在SQL只返回不同的记录,以便该查询给我们的资产标签的完整列表中的所有三个电子表格与没有重复。我用“大师”作为列名,以避免任何含糊之处以后

现在我们需要将数据从主列表中的三个独立的片相结合。创建一个新的空白工作表并调用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 $。资产标签”等)和所有格式都将丢失,但至少你可以看到哪些表是丢失数据

+0

什么是连接字符串格式正确工作了一个例子吗?我不断收到语法错误/期望结束语句。 .ConnectionString =数据源= C:\用户\ hulc01 \桌面\ FinalView.xlsm;扩展属性= Excel中12.0的Xml –

+0

@克里斯赫尔 - 对不起,我失去一个';'关闭连接字符串的末尾。它应该是:'数据源=文件名;扩展属性= Excel 12.0 Xml;' – barrowc

+0

我必须在引号内关闭该部分以使其工作。其他一切都看起来很好,只需要让它看起来很漂亮,并把它给现在的其他人= D –

-2

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

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