Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于列数据连接excel记录_Excel - Fatal编程技术网

基于列数据连接excel记录

基于列数据连接excel记录,excel,Excel,我有3个excel电子表格,它们有相同的列和(假设)相同的数据。我需要整理所有3个文档,并查找数据中的不一致之处。数据是数据中心的服务器信息,我希望服务器位置(row/cab)和资产标签水平匹配,以便轻松查看3个文档之间的差异。如果一个文档缺少服务器(没有匹配的资产标签或位置为空),那么我希望在其他两个文档中插入一个空行,表明它不存在。希望这一切都有意义 这是所有3张纸放在一起的图像。(忽略颜色) 谢谢您的帮助。使用宏,您可以做到这一点 Sub Insert_Rows_Loop() Dim

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

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


谢谢您的帮助。

使用宏,您可以做到这一点

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