这是一个使用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 $。资产标签”等)和所有格式都将丢失,但至少你可以看到哪些表是丢失数据
难道是正确的,查看电子表格作为主副本中的一个(即每一个资产标签出现在该电子表格),另外两个电子表格包含主副本中资产标签的一些子集?因此,如果每个资产标签都列在屏幕截图的C列中,那么列H和M中的资产标签列表将包含部分资产从C柱,但除了H和中号的标签将包含不存在于柱C.这是对行权的任何其他资产标签? – barrowc
不完全是。C,H,M等也都含有不位于另一个资产标签标签列,我的目标是排列匹配的资产标签,以便我可以验证其余的信息是否正确。它还可以帮助按行/ cab排序,因为第一列是 –
好的。所以,你会需要构建所有资产标签的主列表,然后从针对主列表中的每个电子表格排队的记录(在一个或多个C,H和M是否上市)找到其中的差距是 – barrowc