根据列数据加入excel记录

时间:2011-10-19 19:44:36

标签: excel

我有3个具有相同列和(据称)相同数据的excel电子表格。我需要排列所有3个文档并查找数据中的不一致。数据是数据中心的服务器信息,我希望服务器位置(行/出租车)和资产标签水平匹配,以便轻松查看3个文档之间的差异。如果文档缺少服务器(没有匹配的资产标签或位置为空),那么我希望在其他2个文档中插入一个空白行,表明它不存在。希望一切都有意义。

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

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

感谢您的帮助。

2 个答案:

答案 0 :(得分: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;

(注意,您经常会在连接字符串中看到“HDR = Yes”,但这是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

SQL中的UNION运算符仅返回不同的记录,因此此查询为我们提供了所有三个电子表格中没有重复项的资产标记的完整列表。我使用“Master”作为列名来防止以后出现任何歧义

现在我们需要将来自三张单张纸的数据与主列表合并。创建一个新的空白表并调用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 Tag”等),所有格式都会丢失但至少你可以看到哪些表缺少数据

答案 1 :(得分:-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