2011-10-19 73 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