ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 2031|回复: 4

[求助] VSTO写Ribbon AddIn:如何将AB两列导入ArrayList,然后比对差异

[复制链接]

TA的精华主题

TA的得分主题

发表于 2016-2-28 22:46 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 civl 于 2016-2-28 22:48 编辑

想做一个小工具Ribbon按钮,实现AB两列数据的比对,把结果输出到D列=A列特有;E列=B列特有;
网上看了一段C#的代码,不明白object对象该如何放入ArrayList?
  1. private void button1_Click(object sender, RibbonControlEventArgs e)
  2.         {
  3.             Excel.Workbook wkActive = (Excel.Workbook)Globals.ThisAddIn.Application.ActiveWorkbook;
  4.             Excel.Worksheet wsActive = wkActive.ActiveSheet;
  5.             Int32 rowA = wsActive.Range["A1048576"].End[Excel.XlDirection.xlUp].Row;
  6.             Int32 rowB = wsActive.Range["B1048576"].End[Excel.XlDirection.xlUp].Row;
  7.             Int32 rowC = 1;
  8.             Int32 rowD = 1;
  9.             object[,] a = wsActive.Range["A1:A" + rowA].Value2;
  10.             object[,] b = wsActive.Range["B1:B" + rowB].Value2;
  11.             ArrayList alist = new ArrayList();
  12.             ArrayList blist = new ArrayList();
  13.             //不明白为什么报错误?
  14.             alist = a;
  15.             blist = b;
  16.             MessageBox.Show(rowA + "," + rowB);
  17.             ArrayList same = new ArrayList();
  18.             ArrayList aDifference = new ArrayList();
  19.             ArrayList bDifference = new ArrayList();
  20.             wsActive.Range["D1"].Value2 = "A列特有";
  21.             wsActive.Range["E1"].Value2 = "B列特有";
  22.             foreach (object o in alist)
  23.             {
  24.                 if (blist.Contains(o))
  25.                 {
  26.                     same.Add(o);
  27.                 }
  28.                 else
  29.                 {
  30.                     aDifference.Add(o);
  31.                 }
  32.             }
  33.             foreach (object o in blist)
  34.             {
  35.                 if (!same.Contains(o))
  36.                 {
  37.                     bDifference.Add(o);
  38.                 }
  39.             }
  40.             //输出
  41.             foreach (Object o in aDifference)
  42.             {
  43.                 wsActive.Range["D" + ++rowC].Value2 = o.ToString();
  44.             }
  45.             foreach (Object o in bDifference)
  46.             {
  47.                 wsActive.Range["E" + ++rowD].Value2 = o.ToString();
  48.             }
  49.         }
复制代码


TA的精华主题

TA的得分主题

发表于 2016-2-29 15:03 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
a和b是二维数组,是不能转换成arraylist类型的,这个会导致编译错误的

TA的精华主题

TA的得分主题

发表于 2016-3-9 20:03 | 显示全部楼层
直接读取某列数据是二维数组,且跟C#的二维数组有差别(读取excel单元格区域的二维数组是从1开始的,C#创建的二维数组是从0开始的)
你只能遍历A\B,才能装入arrylist

TA的精华主题

TA的得分主题

发表于 2016-3-9 23:08 | 显示全部楼层
mjzxlmg 发表于 2016-3-9 20:03
直接读取某列数据是二维数组,且跟C#的二维数组有差别(读取excel单元格区域的二维数组是从1开始的,C#创建 ...

呃,其实C#也可以创建1基的二维数组

TA的精华主题

TA的得分主题

发表于 2016-3-9 23:32 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
上次回复太匆忙,没有给出具体的解决思路,只能说声抱歉.这里稍微补充一下个人建议,即使楼主可能也解决了问题.
1,既然你是判断列的文本内容,那就直接用String好了,别用object.
2,注意在许多集合的数据结构中,很大部分的Contains类的方法,内部都是通过遍历来实现,如果集合数据量比较大,查找次数多了,效率就会低.包含1楼代码中的ArrayList的Contains方法.
3,根据要求,功能就是判断一个元素在一个集合中是否存在.应该使用HashSet泛型集合.而不是使用ArrayList
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2025-1-12 15:56 , Processed in 0.018715 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表