<pre name="code" class="plain">
using Microsoft.Office.Tools.Ribbon;
using Microsoft.Office.Interop.Excel;
using System.Diagnostics;
namespace MyTools
{
public partial class MainRibbon
{
//定义成员
private Worksheet ws;
private Range rgA;
private Range rgB;
private void MainRibbon_Load(object sender, RibbonUIEventArgs e)
{
}
确定 Range A 的范围
private void btnRangeA_Click(object sender, RibbonControlEventArgs e)
{
ws = Globals.ThisAddIn.Application.ActiveSheet;
edBoxRangeA.Text = ws.Application.Selection.Address;
}
确定 Range B 的范围
private void btnRangeB_Click(object sender, RibbonControlEventArgs e)
{
ws = Globals.ThisAddIn.Application.ActiveSheet;
edBoxRangeB.Text = ws.Application.Selection.Address;
}
//返回结果 A - B,即在A中但是不在B中的元素
private void btnCompare_Click(object sender, RibbonControlEventArgs e)
{
int i, j, curRow, curCol;
object[] objA, objB;
//输入 rgA 和 rgB
rgA = ws.Application.get_Range(edBoxRangeA.Text);
rgB = ws.Application.get_Range(edBoxRangeB.Text);
//传入到数组objA, objB
objA = new object[rgA.Count];
objB = new object[rgB.Count];
for (i = 0; i < objA.Length; i++)
{
objA[i] = rgA[i + 1, 1].Value;
}
for (i = 0; i < objB.Length; i++)
{
objB[i] = rgB[i + 1, 1].Value;
}
//记录活动单元格的位置
curRow = ws.Application.ActiveCell.Row;
curCol = ws.Application.ActiveCell.Column;
try
{
//在rgA中但是不在rgB中的元素
for (i = 0; i < objA.Length; i++)
{
for (j = 0; j < objB.Length; j++)
{
if (objA[i].GetType() == objB[j].GetType())
{
if (objA[i].ToString() == objB[j].ToString())
{
break;
}
}
}
if (j >= objB.Length)
{
//在Activated cell中输出结果
ws.Application.Cells[curRow, curCol].Value = objA[i];
curRow += 1;
}
}
if (curRow==ws.Application.ActiveCell.Row)
{
ws.Application.Cells[curRow, curCol].Value = "No element is in A but not in B ! ";
}
}
catch (System.Exception exception)
{
ws.Application.ActiveCell.Value = exception.Message;
}
}
//交换 A 和 B 的范围
private void btnSwap_Click(object sender, RibbonControlEventArgs e)
{
string tempAddress;
ws = Globals.ThisAddIn.Application.ActiveSheet;
tempAddress = edBoxRangeA.Text;
edBoxRangeA.Text = edBoxRangeB.Text;
edBoxRangeB.Text = tempAddress;
}
}
}