【问题标题】:How to Compare two range's Range.Value2 with C#如何将两个范围的 Range.Value2 与 C# 进行比较
【发布时间】:2026-02-06 04:30:01
【问题描述】:

这是我的代码

using Excel = Microsoft.Office.Interop.Excel;
Excel.Range col1 = r1.Columns[i];
Excel.Range col2 = r2.Columns[j];

有没有一种快速的方法来比较以上两个范围的 value2?

【问题讨论】:

  • 在哪些方面比较它们?等于?共享元素?总和?
  • @Sayse 比较 Range.Value2

标签: c# excel compare


【解决方案1】:

什么是r1?什么是r2?是这些单元格值还是一系列单元格值。

在任何情况下,Excel API 都会以未装箱的方式(作为对象而不是特定类型)向您返回多维数组或单元格值。

没有简单的方法来比较这些值,因为电子表格中的值可以是任何类型,您有责任根据您正在使用的电子表格确定它们的类型。有些事,我们帮不了你。

除此之外,一旦您从 Value2 获得回报,您必须像对待两个数组一样对待它,并逐一比较每个项目。

【讨论】:

  • ,r1 和 r2 都是单元格值的范围。现在我逐项比较每个项目,有没有更快或更简单的方法?
  • 我不认为有,即使有它也会在下面做同样的事情。您当然可以尝试并行化它并并行比较一些项目。
【解决方案2】:
using System;
using System.Collections.Generic;
using System.Linq;

public class Program
{
    public static void Main()
    {
        var firstRange = Enumerable.Range(1, 100);
        var secondRange = Enumerable.Range(1, 200);
        var thirdRange = Enumerable.Range(180, 300);
        var fourthRange = Enumerable.Range(301, 400);

        Console.WriteLine(!IsContainInRange(firstRange, secondRange));      
        Console.WriteLine(!IsContainInRange(thirdRange, secondRange));
        Console.WriteLine(!IsContainInRange(fourthRange, secondRange));
    }

    private static bool IsContainInRange(IEnumerable<int> range1, IEnumerable<int> range2)
    {
        return (from r1 in range1
                 join r2 in range2 on r1 equals r2 
                 select r1).Any();
    }
}

【讨论】:

    【解决方案3】:

    您可以使用 Excel 数组公式在不循环的情况下比较两个范围。以下代码将一个值临时存储在单元格 A20 中,然后生成一个值 True 或 False 以确认范围是否包含相同的值。它们是用 Excel VBA 编写的,但应该可以将它们转换为使用 Interop。 varCalc(在第二个示例中)将是 Object 而不是 Variant。

    Sub TestCompare()
        '{=SUM(IF($A$1:$A$4=$B$1:$B$4,1,0))=ROWS($A$1:$A$4)}
        Dim rngA As Range
        Dim rngB As Range
        Dim blnTheSame As Boolean
    
        Set rngA = Range("$A$1:$A$4")
        Set rngB = Range("$B$1:$B$4")
        Range("A20").FormulaArray = "=SUM(IF(" & rngA.Address & "=" _
            & rngB.Address & ",1,0))=ROWS(" & rngA.Address & ")"
        blnTheSame = Range("A20").Value
        Range("A20").Clear
        MsgBox "Are they the same? " & blnTheSame
    End Sub
    

    以下版本的功能相同,但完全在代码中工作,不需要使用单元格来存储临时结果:

    Sub TestCompare2()
        '{=SUM(IF($A$1:$A$4=$B$1:$B$4,1,0))=ROWS($A$1:$A$4)}
        Dim rngA As Range
        Dim rngB As Range
        Dim varCalc As Variant
        Dim blnTheSame As Boolean
    
        Set rngA = Range("$A$1:$A$4")
        Set rngB = Range("$B$1:$B$4")
        varCalc = "=SUM(IF(" & rngA.Address & "=" _
            & rngB.Address & ",1,0))=ROWS(" & rngA.Address & ")"
        blnTheSame = Evaluate(Array(varCalc))
        MsgBox "Are they the same? " & blnTheSame
    End Sub
    

    既不使用Value2,但我看不出这对于比较是必要的。

    【讨论】:

    • 我投了反对票,因为这个问题清楚地说是 C#,而不是 VB。
    最近更新 更多