【发布时间】:2015-05-13 02:21:06
【问题描述】:
我正在比较两张这样的表格:
一个工作表比另一个工作表新,可以删除、添加或更新一行。
我的用于检测是否在两者之间删除/添加行的代码对我不起作用,这就是我所拥有的:
Private Sub CompareSpreadsheets()
Dim xlApp1 As Excel.Application = New Microsoft.Office.Interop.Excel.Application()
Dim xlApp2 As Excel.Application = New Microsoft.Office.Interop.Excel.Application()
Dim xlApp3 As Excel.Application = New Microsoft.Office.Interop.Excel.Application()
Dim xlWorkBook1, xlWorkBook2, xlWorkBook3 As Excel.Workbook
Dim xlWorkSheet1, xlWorkSheet2, xlWorkSheet3 As Excel.Worksheet
Dim misValue As Object = System.Reflection.Missing.Value
Dim xlRange1 As Excel.Range
Dim maxRows As Short
Dim qtyChange, mtlChange, newItem, delItem As Boolean
Dim newRowCount As Short = 1
Dim w3row As Short = 1
'Check if Excel is installed on system
If xlApp1 Is Nothing Then
MessageBox.Show("Excel is missing/not properly installed on your system.", "ERROR")
Return
End If
xlApp1.Workbooks.Open(path1)
xlWorkBook1 = xlApp1.ActiveWorkbook
xlWorkSheet1 = xlWorkBook1.ActiveSheet
xlApp2.Workbooks.Open(path2)
xlWorkBook2 = xlApp2.ActiveWorkbook
xlWorkSheet2 = xlWorkBook2.ActiveSheet
'Get maximum number of columns and rows from new spreadsheet
maxRows = xlWorkSheet2.UsedRange.Rows.Count
pbStatus.Minimum = 1
pbStatus.Maximum = maxRows
xlWorkBook3 = xlApp3.Workbooks.Add(misValue)
xlWorkSheet3 = xlWorkBook3.Sheets("sheet1")
qtyChange = False
mtlChange = False
newItem = False
delItem = False
Dim counter = 0 '/temp
For i As Short = 1 To maxRows
pbStatus.Value = i
'[-- Green = Quantity change
'Yellow = Material change
'Blue = New item
'Red = Deleted item --]
If GetCellData(xlWorkSheet1, newRowCount, 3) = GetCellData(xlWorkSheet2, i, 3) And _
GetCellData(xlWorkSheet1, newRowCount, 4) = GetCellData(xlWorkSheet2, i, 4) And _
GetCellData(xlWorkSheet1, newRowCount, 5) = GetCellData(xlWorkSheet2, i, 5) And _
GetCellData(xlWorkSheet1, newRowCount, 6) = GetCellData(xlWorkSheet2, i, 6) And _
GetCellData(xlWorkSheet1, newRowCount, 7) = GetCellData(xlWorkSheet2, i, 7) And _
GetCellData(xlWorkSheet1, newRowCount, 8) = GetCellData(xlWorkSheet2, i, 8) Then
'DONE
qtyChange = False
mtlChange = False
newItem = False
delItem = False
newRowCount += 1
ElseIf GetCellData(xlWorkSheet1, newRowCount, 3) = GetCellData(xlWorkSheet2, i, 3) And _
GetCellData(xlWorkSheet1, newRowCount, 4) = GetCellData(xlWorkSheet2, i, 4) And _
GetCellData(xlWorkSheet1, newRowCount, 5) = GetCellData(xlWorkSheet2, i, 5) And _
GetCellData(xlWorkSheet1, newRowCount, 6) <> GetCellData(xlWorkSheet2, i, 6) And _
GetCellData(xlWorkSheet1, newRowCount, 7) = GetCellData(xlWorkSheet2, i, 7) And _
GetCellData(xlWorkSheet1, newRowCount, 8) = GetCellData(xlWorkSheet2, i, 8) Then
'DONE
qtyChange = True
ElseIf GetCellData(xlWorkSheet1, newRowCount, 1) = GetCellData(xlWorkSheet2, i, 1) And _
GetCellData(xlWorkSheet1, newRowCount, 2) = GetCellData(xlWorkSheet2, i, 2) And _
GetCellData(xlWorkSheet1, newRowCount, 3) = GetCellData(xlWorkSheet2, i, 3) And _
GetCellData(xlWorkSheet1, newRowCount, 4) <> GetCellData(xlWorkSheet2, i, 4) And _
GetCellData(xlWorkSheet1, newRowCount, 5) = GetCellData(xlWorkSheet2, i, 5) And _
GetCellData(xlWorkSheet1, newRowCount, 6) = GetCellData(xlWorkSheet2, i, 6) And _
GetCellData(xlWorkSheet1, newRowCount, 7) = GetCellData(xlWorkSheet2, i, 7) And _
GetCellData(xlWorkSheet1, newRowCount, 8) = GetCellData(xlWorkSheet2, i, 8) Then
'DONE
mtlChange = True
ElseIf GetCellData(xlWorkSheet1, newRowCount, 3) <> GetCellData(xlWorkSheet2, i, 3) And _
GetCellData(xlWorkSheet1, newRowCount, 4) <> GetCellData(xlWorkSheet2, i, 4) Then
If GetCellData(xlWorkSheet1, newRowCount + 1, 4) <> GetCellData(xlWorkSheet2, i, 4) Then
newItem = True
ElseIf GetCellData(xlWorkSheet1, newRowCount, 4) <> GetCellData(xlWorkSheet2, i + 1, 4) Then
delItem = True
End If
End If
'Procedure for each case
If qtyChange Then
xlWorkSheet3.Cells(w3row, 1) = GetCellData(xlWorkSheet2, i, 1)
xlRange1 = CType(xlWorkSheet3.Cells(w3row, 1), Excel.Range)
xlRange1.Font.Color = System.Drawing.Color.Green
xlWorkSheet3.Cells(w3row, 2) = GetCellData(xlWorkSheet2, i, 2)
xlRange1 = CType(xlWorkSheet3.Cells(w3row, 2), Excel.Range)
xlRange1.Font.Color = System.Drawing.Color.Green
xlWorkSheet3.Cells(w3row, 3) = GetCellData(xlWorkSheet2, i, 3)
xlRange1 = CType(xlWorkSheet3.Cells(w3row, 3), Excel.Range)
xlRange1.Font.Color = System.Drawing.Color.Green
xlWorkSheet3.Cells(w3row, 4) = GetCellData(xlWorkSheet2, i, 4)
xlRange1 = CType(xlWorkSheet3.Cells(w3row, 4), Excel.Range)
xlRange1.Font.Color = System.Drawing.Color.Green
xlWorkSheet3.Cells(w3row, 5) = GetCellData(xlWorkSheet2, i, 5)
xlRange1 = CType(xlWorkSheet3.Cells(w3row, 5), Excel.Range)
xlRange1.Font.Color = System.Drawing.Color.Green
xlWorkSheet3.Cells(w3row, 6) = GetCellData(xlWorkSheet2, i, 6)
xlRange1 = CType(xlWorkSheet3.Cells(w3row, 6), Excel.Range)
xlRange1.Font.Color = System.Drawing.Color.Green
xlWorkSheet3.Cells(w3row, 7) = GetCellData(xlWorkSheet2, i, 7)
xlRange1 = CType(xlWorkSheet3.Cells(w3row, 7), Excel.Range)
xlRange1.Font.Color = System.Drawing.Color.Green
xlWorkSheet3.Cells(w3row, 8) = GetCellData(xlWorkSheet2, i, 8)
xlRange1 = CType(xlWorkSheet3.Cells(w3row, 8), Excel.Range)
xlRange1.Font.Color = System.Drawing.Color.Green
newRowCount += 1
w3row += 1
ElseIf mtlChange Then
xlWorkSheet3.Cells(w3row, 1) = GetCellData(xlWorkSheet2, i, 1)
xlRange1 = CType(xlWorkSheet3.Cells(w3row, 1), Excel.Range)
xlRange1.Font.Color = System.Drawing.Color.Yellow
xlWorkSheet3.Cells(w3row, 2) = GetCellData(xlWorkSheet2, i, 2)
xlRange1 = CType(xlWorkSheet3.Cells(w3row, 2), Excel.Range)
xlRange1.Font.Color = System.Drawing.Color.Yellow
xlWorkSheet3.Cells(w3row, 3) = GetCellData(xlWorkSheet2, i, 3)
xlRange1 = CType(xlWorkSheet3.Cells(w3row, 3), Excel.Range)
xlRange1.Font.Color = System.Drawing.Color.Yellow
xlWorkSheet3.Cells(w3row, 4) = GetCellData(xlWorkSheet2, i, 4)
xlRange1 = CType(xlWorkSheet3.Cells(w3row, 4), Excel.Range)
xlRange1.Font.Color = System.Drawing.Color.Yellow
xlWorkSheet3.Cells(w3row, 5) = GetCellData(xlWorkSheet2, i, 5)
xlRange1 = CType(xlWorkSheet3.Cells(w3row, 5), Excel.Range)
xlRange1.Font.Color = System.Drawing.Color.Yellow
xlWorkSheet3.Cells(w3row, 6) = GetCellData(xlWorkSheet2, i, 6)
xlRange1 = CType(xlWorkSheet3.Cells(w3row, 6), Excel.Range)
xlRange1.Font.Color = System.Drawing.Color.Yellow
xlWorkSheet3.Cells(w3row, 7) = GetCellData(xlWorkSheet2, i, 7)
xlRange1 = CType(xlWorkSheet3.Cells(w3row, 7), Excel.Range)
xlRange1.Font.Color = System.Drawing.Color.Yellow
xlWorkSheet3.Cells(w3row, 8) = GetCellData(xlWorkSheet2, i, 8)
xlRange1 = CType(xlWorkSheet3.Cells(w3row, 8), Excel.Range)
xlRange1.Font.Color = System.Drawing.Color.Yellow
newRowCount += 1
w3row += 1
ElseIf delItem Then
xlWorkSheet3.Cells(w3row, 1) = GetCellData(xlWorkSheet1, newRowCount, 1)
xlRange1 = CType(xlWorkSheet3.Cells(w3row, 1), Excel.Range)
xlRange1.Font.Color = System.Drawing.Color.Red
xlWorkSheet3.Cells(w3row, 2) = GetCellData(xlWorkSheet1, newRowCount, 2)
xlRange1 = CType(xlWorkSheet3.Cells(w3row, 2), Excel.Range)
xlRange1.Font.Color = System.Drawing.Color.Red
xlWorkSheet3.Cells(w3row, 3) = GetCellData(xlWorkSheet1, newRowCount, 3)
xlRange1 = CType(xlWorkSheet3.Cells(w3row, 3), Excel.Range)
xlRange1.Font.Color = System.Drawing.Color.Red
xlWorkSheet3.Cells(w3row, 4) = GetCellData(xlWorkSheet1, newRowCount, 4)
xlRange1 = CType(xlWorkSheet3.Cells(w3row, 4), Excel.Range)
xlRange1.Font.Color = System.Drawing.Color.Red
xlWorkSheet3.Cells(w3row, 5) = GetCellData(xlWorkSheet1, newRowCount, 5)
xlRange1 = CType(xlWorkSheet3.Cells(w3row, 5), Excel.Range)
xlRange1.Font.Color = System.Drawing.Color.Red
xlWorkSheet3.Cells(w3row, 6) = GetCellData(xlWorkSheet1, newRowCount, 6)
xlRange1 = CType(xlWorkSheet3.Cells(w3row, 6), Excel.Range)
xlRange1.Font.Color = System.Drawing.Color.Red
xlWorkSheet3.Cells(w3row, 7) = GetCellData(xlWorkSheet1, newRowCount, 7)
xlRange1 = CType(xlWorkSheet3.Cells(w3row, 7), Excel.Range)
xlRange1.Font.Color = System.Drawing.Color.Red
xlWorkSheet3.Cells(w3row, 8) = GetCellData(xlWorkSheet1, newRowCount, 8)
xlRange1 = CType(xlWorkSheet3.Cells(w3row, 8), Excel.Range)
xlRange1.Font.Color = System.Drawing.Color.Red
newRowCount += 1
i -= 1
w3row += 1
ElseIf newItem Then
xlWorkSheet3.Cells(w3row, 1) = GetCellData(xlWorkSheet2, i, 1)
xlRange1 = CType(xlWorkSheet3.Cells(w3row, 1), Excel.Range)
xlRange1.Font.Color = System.Drawing.Color.Blue
xlWorkSheet3.Cells(w3row, 2) = GetCellData(xlWorkSheet2, i, 2)
xlRange1 = CType(xlWorkSheet3.Cells(w3row, 2), Excel.Range)
xlRange1.Font.Color = System.Drawing.Color.Blue
xlWorkSheet3.Cells(w3row, 3) = GetCellData(xlWorkSheet2, i, 3)
xlRange1 = CType(xlWorkSheet3.Cells(w3row, 3), Excel.Range)
xlRange1.Font.Color = System.Drawing.Color.Blue
xlWorkSheet3.Cells(w3row, 4) = GetCellData(xlWorkSheet2, i, 4)
xlRange1 = CType(xlWorkSheet3.Cells(w3row, 4), Excel.Range)
xlRange1.Font.Color = System.Drawing.Color.Blue
xlWorkSheet3.Cells(w3row, 5) = GetCellData(xlWorkSheet2, i, 5)
xlRange1 = CType(xlWorkSheet3.Cells(w3row, 5), Excel.Range)
xlRange1.Font.Color = System.Drawing.Color.Blue
xlWorkSheet3.Cells(w3row, 6) = GetCellData(xlWorkSheet2, i, 6)
xlRange1 = CType(xlWorkSheet3.Cells(w3row, 6), Excel.Range)
xlRange1.Font.Color = System.Drawing.Color.Blue
xlWorkSheet3.Cells(w3row, 7) = GetCellData(xlWorkSheet2, i, 7)
xlRange1 = CType(xlWorkSheet3.Cells(w3row, 7), Excel.Range)
xlRange1.Font.Color = System.Drawing.Color.Blue
xlWorkSheet3.Cells(w3row, 8) = GetCellData(xlWorkSheet2, i, 8)
xlRange1 = CType(xlWorkSheet3.Cells(w3row, 8), Excel.Range)
xlRange1.Font.Color = System.Drawing.Color.Blue
w3row += 1
End If
qtyChange = False
mtlChange = False
newItem = False
delItem = False
Next
'Save new spreadsheet [TEMP NAME]
xlWorkBook3.SaveAs("C:\Users\Windows\Documents\Visual Studio 2013\Projects\test.xls", Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, _
Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue)
xlWorkBook3.Close(True, misValue, misValue)
xlApp3.Quit()
'----------------------------------
'End of process, cleaning up CPU---
xlWorkBook1.Close(True, misValue, misValue)
xlApp1.Quit()
xlWorkBook2.Close(True, misValue, misValue)
xlApp2.Quit()
ReleaseObject(xlWorkSheet1)
ReleaseObject(xlWorkBook1)
ReleaseObject(xlApp1)
ReleaseObject(xlWorkSheet2)
ReleaseObject(xlWorkBook2)
ReleaseObject(xlApp2)
ReleaseObject(xlWorkSheet3)
ReleaseObject(xlWorkBook3)
ReleaseObject(xlApp3)
cmdFormat.Text = "Process complete. Compare new files?"
End Sub
编辑:什么不起作用?它会很好地跳过相同的行并检测单元格更改(我设置了第 4 列和第 6 列,它们将它们返回为绿色/黄色)但是一旦我的代码在旧工作表中找到已删除的条目/新工作表中的新条目,它就会搞砸.
这就是我认为它搞砸的地方:
ElseIf GetCellData(xlWorkSheet1, newRowCount, 3) <> GetCellData(xlWorkSheet2, i, 3) And _
GetCellData(xlWorkSheet1, newRowCount, 4) <> GetCellData(xlWorkSheet2, i, 4) Then
If GetCellData(xlWorkSheet1, newRowCount + 1, 4) <> GetCellData(xlWorkSheet2, i, 4) Then
newItem = True
ElseIf GetCellData(xlWorkSheet1, newRowCount, 4) <> GetCellData(xlWorkSheet2, i + 1, 4) Then
delItem = True
End If
End If
如果有人能看到这个问题,请告诉我。或者,如果您对此有其他解决方案。谢谢!
【问题讨论】:
-
怎么不工作了?我们需要细节。你的文字墙很吓人。
-
我会用更好的解释来编辑它,并添加整个代码子。 @ryanyuyu
-
任何时候你像这样修改 for 循环计数器,它可能会变得很奇怪。您的逻辑说“如果 Sheet1 的下一行不等于 Sheet2 的当前行,那么它是一个新项目。如果 Sheet1 的当前行不等于 Sheet2 的下一行,那么它是一个已删除的项目。这似乎有点倒退。另外,假设您有一个新项目,然后是一个已删除的项目。这不会破坏一切吗?
-
@user1274820 关于到达一个新项目,然后是一个已删除项目......你是对的。这就是破坏一切的原因。