这是我的代码
using Excel = Microsoft.Office.Interop.Excel;
Excel.Range col1 = r1.Columns[i];
Excel.Range col2 = r2.Columns[j];
有没有一种快速的方法来比较以上两个范围的 value2?</p>
什么是r1?什么是r2?是这些单元格值或一系列单元格值。
在任何情况下,Excel API 都会以未装箱的方式(作为对象而不是特定类型)向您返回多维数组或单元格值。
没有简单的方法来比较这些值,因为电子表格中的值可以是任何类型,您有责任根据您正在使用的电子表格确定它们的类型。有些事,我们帮不了你。
除此之外,一旦你从 Value2 获得回报,你必须像对待两个数组一样对待它,并逐一比较每个项目。
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();
}
}
您可以使用 Excel 数组公式在不循环的情况下比较两个范围。以下代码在单元格 A20 中临时存储一个值,然后生成一个值 True 或 False 以确认范围是否包含相同的值。它们是用 Excel VBA编写的,但应该可以将它们转换为使用 Interop。varCalc
(在第二个例子中)将是一个对象而不是变体。
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
,但我看不出这是比较所必需的。