用VBS比较两个Excel文件的数据
2010-03-23 08:51
197 查看
relevantcodes.com的一篇文章《VBScript: Compare 2 Excel Files》中介绍了如何用VBScript来比较两个Excel文件的数据:
http://relevantcodes.com/vbscript-compare-2-excel-files/
主要是使用了Excel的COM接口的range对象来实现的。支持比较数据并且高亮显示差异:
Class clsComparer
'[--- Region Private Variables Start ---]
Private oExcel 'Excel.Application
Private arrRangeUno 'Range.Value (array) of the Primary Excel spreadsheet
Private arrRangeDos 'Range.Value (array) of the Secondary Excecl spreadsheet
Private oDict 'Scripting.Dictionary containing unmatched cells
'[--- Region Private Variables End ---]
'[--- Region Public Variables Start ---]
Public Operation '0: Only Compare 1: Compare & Highlight Differences
'[--- Region Public Variables End ---]
'--------------------------------------------------------
' Name: Function Compare [Public]
'
' Remarks: N/A
'
' Purpose: Compares differences between 2 Excel Spreadsheets
'
' Arguments:
' sWorkBookUno: Primary Excel WorkBook (with complete path)
' vSheetUno: Primary Excel Spreadsheet Name
' sWorkBookDos: Secondary Excel WorkBook (with complete path)
' vSheetDos: Secondary Excel Spreadsheet Name
'
' Return: Boolean
'
' Author: Anshoo Arora, Relevant Codes
'
' Date: 03/17/2010
'
' References: N/A
'--------------------------------------------------------
Public Function Compare(sWorkBookUno, vSheetUno, sWorkBookDos, vSheetDos)
Dim oWorkBookUno, oWorkBookDos
'New instance of Excel
Set oExcel = CreateObject("Excel.Application")
Compare = False
'Open Primary WorkBook
Set oWorkBookUno = oExcel.WorkBooks.Open(sWorkBookUno)
'Open Secondary WorkBook
Set oWorkBookDos = oExcel.WorkBooks.Open(sWorkBookDos)
'Primary WorkBook Range
arrRangeUno = oWorkBookUno.WorkSheets(vSheetUno).UsedRange.Value
'Secondary WorkBook Range
arrRangeDos = oWorkBookDos.WorkSheets(vSheetDos).UsedRange.Value
'Check using CellsFound (see below) and determine any unmatched cells
If Not CellsFound > 0 Then Compare = True
'If Operation = 0, function only runs a comparison
'If Operation = 1, function runs a comparison and highlights differences
If Not Compare Then
If Operation = 1 Then
Dim Keys, oSheetUno, oSheetDos, iRow, iCol
Keys = oDict.Keys
Set oSheetUno = oWorkBookUno.WorkSheets(vSheetUno)
Set oSheetDos = oWorkBookDos.WorkSheets(vSheetDos)
'Highlight each Row/Column combination from the dictionary
For Each iKey in Keys
iRow = CInt(Split(iKey, "|")(0))
iCol = CInt(Split(iKey, "|")(1))
'Highlight the difference in the Primary Sheet
oSheetUno.Rows(iRow).Columns(iCol).Interior.ColorIndex = 3
'Highlight the difference in the Secondary Sheet
oSheetDos.Rows(iRow).Columns(iCol).Interior.ColorIndex = 3
Next
'Save primary and secondary workbooks
oWorkBookUno.Save
oWorkBookDos.Save
'Dispose primary and secondary sheet objects
Set oSheetUno = Nothing
Set oSheetDos = Nothing
End If
End If
'Dispose primary and secondary workbook objects
oWorkBookUno.Close
oWorkBookDos.Close
End Function
'--------------------------------------------------------
' Name: Function CellsFound [Private]
'
' Remarks: N/A
'
' Purpose: Finds the dissimilar cells between 2 sheets
'
' Arguments: N/a
'
' Return: Integer
'
' Author: Anshoo Arora, Relevant Codes
'
' Date: 03/17/2010
'
' References: N/A
'--------------------------------------------------------
Private Function CellsFound()
Dim iBoundsUno, iBoundsDos, iCellUno, iCellDos
CellsFound = 0
'New instance of Scripting.Dictionary
Set oDict = CreateObject("Scripting.Dictionary")
'Get 2D upper bound for Primary Range
iBoundsUno = UBound(arrRangeUno, 2)
'Get 2D upper bound for Secondary Range
iBoundsDos = UBound(arrRangeDos, 2)
'If Range are not equal..
If iBoundsUno <> iBoundsDos Then
Reporter.ReportEvent micWarning, "Compare", "Unequal Range."
End If
'Build a Dictionary with all unmatched cells [Private oDict]
For iCellUno = 1 to UBound(arrRangeUno, 1)
For iCellDos = 1 to UBound(arrRangeUno, 2)
If arrRangeUno(iCellUno, iCellDos) <> arrRangeDos(iCellUno, iCellDos) Then
oDict.Add iCellUno & "|" & iCellDos, ""
End If
Next
Next
'Total dissimilar cells equal CellsFound
CellsFound = oDict.Count
End Function
'--------------------------------------------------------
' Name: Sub Class_Terminate [Private]
'
' Remarks: N/A
'
' Purpose: Disposes the Excel.Application object
'
' Arguments: N/A
'
' Author: Anshoo Arora, Relevant Codes
'
' Date: 03/17/2010
'
' References: N/A
'--------------------------------------------------------
Private Sub Class_Terminate()
If IsObject(oExcel) Then
If Not oExcel Is Nothing Then
Set oExcel = Nothing
End If
End If
If TypeName(oDict) = "Dictionary" Then
Set oDict = Nothing
End If
End Sub
End Class
'--------------------------------------------------------
' Name: Function CompareExcelSheets
'
' Remarks: N/A
'
' Purpose: Constructor for Class clsComparer
'
' Arguments:
' sWorkBookUno: Primary Excel WorkBook (with complete path)
' vSheetUno: Primary Excel Spreadsheet Name
' sWorkBookDos: Secondary Excel WorkBook (with complete path)
' vSheetDos: Secondary Excel Spreadsheet Name
' Operation: 0: Compare Only 1: Compare & Highlight Differences
'
' Return: Boolean
'
' Author: Anshoo Arora, Relevant Codes
'
' Date: 03/17/2010
'
' References: N/A
'--------------------------------------------------------
Function CompareExcelSheets(sWorkBookUno, vSheetUno, sWorkBookDos, vSheetDos, Operation)
Dim oClass
Set oClass = New clsComparer
oClass.Operation = Operation
CompareExcelSheets = oClass.Compare(sWorkBookUno, vSheetUno, sWorkBookDos, vSheetDos)
Set oClass = Nothing
End Function
相关文章推荐
- 比较两个文本中数据不同的行
- SQL比较两个表数据
- C# 两个datatable中的数据快速比较返回交集或差集
- 比较两个同名表在数据上的差异。
- 基于SQL Server中如何比较两个表的各组数据 图解说明
- 根据ID字段比较两个Access数据库中的数据表中的记录异同
- java方法重载实验:判断键盘输入的两个数据的类型后进行比较
- 比较出两个字符串数组中的不同的数据 并将其转化成为字符串
- php判断比较两个数组中的数据(得出删除的,和新增的)
- 使用Red Gate Sql Data Compare 数据库同步工具进行SQL Server的两个数据库的数据比较、同步
- 大数据量情况下高效比较两个list
- 明明两个数据看的一样,但比较的结果就是不相等 (内存对齐,debug没问题,release 有问题)
- 两个文件比较求交集或合并相同的数据
- 根据某一字段跨服务器比较两个表数据
- 两个数组比较,去掉重复的数据后生成第三个数组,这个怎么实现?
- 比较两个数据是否相等
- 两个list<object> 比较 得到相同数据 差异数据
- java中比较两个double类型的数据大小
- 几种从数据库读取数据生成excel文件的比较
- 利用expdp 和impdp来 导出,导入 oracle 数据(含比较 两个schema的表结构)