2014-02-13 50 views
1

我正在處理一個應用程序以比較兩個列表:一個Excel工作簿包含列表的修訂版本1,另一個工作簿包含同一列表的修訂版本2。兩個列表具有相同的結構,這意味着:它們在列中具有相同的信息:例如列A始終是主鍵PK,列B是溫度,列C是壓力等。單元格中沒有公式 目標是查找新列表中與同一單元格不同的單元格舊名單。當舊列表中的PK溫度= 45,新列表中的溫度= 50時,新列表中的單元格將以黃色突出顯示。這使得在包含2000 * 120個單元的列表中更容易找到更新。比較兩個單元格不能按預期方式工作

它適用於兩個測試文件,但是當我嘗試使用真正的列表時,我看到了奇怪的行爲:在某些列中,這兩個列表中的單元格都是空的,但我的應用仍然將它們標識爲不同並將它們標記爲黃色。

enter image description here

下面是我用循環直通名單代碼:

public void Run(int i) 
    { 

     wsOldSheet = oldWorkBook.Sheets[OldSheetName]; 

     // Define the range where to search 
     PrimaryKeys = wsOldSheet.get_Range(RangeStart, RangeEnd); 

     if (EzDiff.Program.Logging == true) 
     { 
      EzDiff.Program.__logger.Info(".Started working on row on: " + i); 
     } 

     CurValue = wsNewSheet.Cells[i, ColumnPK].value; 
     if (EzDiff.Program.Logging == true) 
     { 
      EzDiff.Program.__logger.Info("..Primary key = " + CurValue.ToString()); 
     } 

     //1. Check if PK exists in mydata. If not: it's a new PK -> we mark it as new and continue with the next PK 

     // Find 
     firstFind = PrimaryKeys.Find(CurValue, missing, 
         Excel.XlFindLookIn.xlValues, Excel.XlLookAt.xlPart, 
         Excel.XlSearchOrder.xlByRows, Excel.XlSearchDirection.xlNext, false, 
         missing, missing); 

     if (firstFind == null) 
     { 
      if (EzDiff.Program.Logging == true) 
      { 
       EzDiff.Program.__logger.Info("...Primary key was not found."); 
      } 
      wsNewSheet.Cells[i, ColumnPK].Font.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Red); 
     } 
     else 
     { 
      FoundInRow = firstFind.Row; 

      if (EzDiff.Program.Logging == true) 
      { 
       EzDiff.Program.__logger.Info("...Primary key was found in row: " + FoundInRow); 
      } 

      for (int mCol = 1; mCol < MaxColumnToWork; mCol++) 
      { 

       if (wsOldSheet.Cells[FoundInRow, mCol].Value == null) 
       //if (String.IsNullOrEmpty(wsOldSheet.Cells[FoundInRow, mCol].Value.ToString())) 
       { 
        if (!(wsNewSheet.Cells[i, mCol].Value == null)) 
        //if (String.IsNullOrEmpty(wsNewSheet.Cells[i, mCol].Value.ToString())) 
        { 
         // * * Here the cells are marked in error! * * // 
         wsNewSheet.Cells[i, mCol].Interior.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Yellow); 
        } 
       } 
       else 
       { 
        if (wsNewSheet.Cells[i, mCol].Value == null) 
        //if (String.IsNullOrEmpty(wsOldSheet.Cells[FoundInRow, mCol].Value.ToString())) 
        { 
         wsNewSheet.Cells[i, mCol].Interior.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Yellow); 
        } 
        else 
        { 
         String strOld = wsOldSheet.Cells[FoundInRow, mCol].Value.ToString(); 
         String strNew = wsNewSheet.Cells[i, mCol].Value.ToString(); 

         if (strNew.CompareTo(strOld) != 0) 
         { 
          wsNewSheet.Cells[i, mCol].Interior.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Yellow); 
         } 
        } 
       } 

      } 

      if (EzDiff.Program.Logging == true) 
      { 
       EzDiff.Program.__logger.Info("....finished comparing all columns from row: " + FoundInRow); 
      } 
     } 
    } 

如果任何人都可以看到我出問題了,請讓我知道!

**已解決** 當我深入挖掘並查看造成奇怪結果的單元格時,我注意到這些表單在一個表單中爲NULL,而在另一個表單中爲「(空)」。所以我解決了這個問題:

 private bool equiv(object obj1, object obj2, double tolerance) 
    { 
     if (((obj1 == null) && (obj2 == null)) || 
      ((obj1 == null) && (obj2 == "")) || 
      ((obj1 == "") && (obj2 == null))) 
     { 
      return true; 
     } 
     else if ((obj1 == null) || (obj2 == null)) 
     { 
      return false; 
     } 
    } 

也許不是很漂亮,但如果它做的工作,我很高興。

回答

0

在Excel中,空白單元格返回零長度字符串,而不是null。嘗試更換喜歡的實例:

if (wsOldSheet.Cells[FoundInRow, mCol].Value == null) 

有:

if (wsOldSheet.Cells[FoundInRow, mCol].Value == "") 

,看看有沒有什麼幫助。在VBA相當於是:

If wsOldSheet.Cells(FoundInRow, mCol).Value = "" Then 
    ... 
End If 

我提,因爲我不是一個C#程序員,但我知道,這部作品在VBA。

+1

雖然它不是實際的解決辦法,我還是把它標記爲這樣的,因爲它指出了我在正確的方向。 Thanx,布蘭登! – Ad123

+0

慷慨的你,謝謝。如何(或何時!)一個Excel單元格將返回一個「NULL」與零長度的字符串是超越我......從未在VBA中發生過。 –

1

在VBA中你還可以用像測試:

if isempty(wsOldSheet.Cells(FoundInRow, mCol)) then ... 

'or 

if wsOldSheet.Cells(FoundInRow, mCol) is nothing then ...