我正在开发一个比较两个列表的应用程序:一个Excel工作簿包含列表的修订版1,第二个工作簿包含该列表的修订版2。两个列表都具有相同的结构,这意味着:它们在列中具有相同的信息:例如A列始终是主键PK,B列是温度,C列是压力等。单元格中没有公式 目标是在“新建”列表中找到与旧列表中的同一单元格不同的单元格。当旧列表中的PK为温度= 45并且在新列表中温度= 50时,新列表中的单元格将以黄色突出显示。这样可以更容易地在包含2000 * 120单元格的列表中查找更新。
它适用于两个测试文件,但是当我尝试使用真实列表时,我看到了奇怪的行为:在某些列中,两个列表中的单元格都是空的,但我的应用程序仍然将它们标识为不同并将它们标记为黄色。 / p>
以下是我用来循环列表的代码:
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);
}
}
}
如果有人能看到我哪里出错了,请告诉我!
**已解决** 当我深入挖掘并查看导致奇怪结果的细胞时,我注意到这些celes在一张纸上是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 :(得分:1)
在VBA中,您还可以使用以下测试:
if isempty(wsOldSheet.Cells(FoundInRow, mCol)) then ...
'or
if wsOldSheet.Cells(FoundInRow, mCol) is nothing then ...
答案 1 :(得分: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。