基于列数据连接excel记录
我有3个excel电子表格,它们有相同的列和(假设)相同的数据。我需要整理所有3个文档,并查找数据中的不一致之处。数据是数据中心的服务器信息,我希望服务器位置(row/cab)和资产标签水平匹配,以便轻松查看3个文档之间的差异。如果一个文档缺少服务器(没有匹配的资产标签或位置为空),那么我希望在其他两个文档中插入一个空行,表明它不存在。希望这一切都有意义 这是所有3张纸放在一起的图像。(忽略颜色)基于列数据连接excel记录,excel,Excel,我有3个excel电子表格,它们有相同的列和(假设)相同的数据。我需要整理所有3个文档,并查找数据中的不一致之处。数据是数据中心的服务器信息,我希望服务器位置(row/cab)和资产标签水平匹配,以便轻松查看3个文档之间的差异。如果一个文档缺少服务器(没有匹配的资产标签或位置为空),那么我希望在其他两个文档中插入一个空行,表明它不存在。希望这一切都有意义 这是所有3张纸放在一起的图像。(忽略颜色) 谢谢您的帮助。使用宏,您可以做到这一点 Sub Insert_Rows_Loop() Dim
谢谢您的帮助。使用宏,您可以做到这一点
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
下面是一个使用Excel和VBA的基于ADO的解决方案。如果您需要有关在Excel/VBA中使用ADO的更多信息,请尝试 我将假设您的三个电子表格都在一个工作簿中,它们分别命名为Sheet1、Sheet2和Sheet3。显然,根据需要调整代码 要使用ADO,请转到Visual Basic编辑器(通过菜单或通过
Alt
-F11
),然后通过工具>引用(或更高版本中的等效工具)添加对“Microsoft ActiveX数据对象2.8库”的引用
我正在使用Excel2003和更早版本的提供程序和连接字符串,因为这是我的版本。对于Excel 2007及更高版本,请改用以下文件名(当然要替换文件名):
Provider=Microsoft.ACE.OLEDB.12.0
数据源=文件名;扩展属性=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”等),所有格式都将丢失,但至少您可以看到哪些工作表缺少数据将其中一个电子表格视为主副本是否正确(即每个资产标记都出现在该电子表格中)另外两个电子表格包含主副本中资产标签的一些子集?因此,如果每个资产标签都列在屏幕截图的C列中,那么H列和M列中的资产标签列表将包含C列中的一些资产标签,但H列和M列都不会包含C列中不存在的任何其他资产标签。这是否在正确的行中?不完全正确。C、 H和M都可能包含不在另一个资产标签列中的标签,我的目标是排列匹配的资产标签,以便验证其余信息是否正确。将其作为第一列isOK按行/cab排序也会有所帮助。因此,您需要构建所有资产标签的主列表(无论是在C、H和M中的一个或多个中列出),然后将每个电子表格中的记录与主列表对齐,以找到差距所在,例如如果资产标签不等于其他资产标签,则创建一行,并循环遍历所有内容。。。我会看看我能想出什么。我也在讨论在SQL server中设置3个表,看看这是否会更容易。想法?连接字符串的正确格式是什么?我不断收到语法错误/expect end语句。ConnectionString=Data Source=C:\Users\hulc01\Desktop\FinalView.xlsm;扩展属性=Excel 12.0Xml@Chris赫尔-对不起,我丢了一个代码>关闭连接字符串的末尾。它应该是:数据源=文件名;扩展属性=Excel 12.0 Xml代码>我必须在引号中关闭该部分才能使其正常工作。其他一切看起来都很完美,只要把它弄得漂亮,现在就给别人看=D