今天为大家带来一个小功能,提取唯一值,也即按单元格去除重复值,对于经常玩数据的同学来说应当是必备功能。
话不多说,请看实际需求:
Excel中国合伙人:Igor-曾,其人不仅仅一表人才、更加让人妒忌的是编程水平达到了很高的境界,且为人谦和、乐于助人;能有幸看到这篇文章的读者,你们是幸运的!
一、对需求做几点说明:
1. 按单元格提取唯一值,忽略空白单元格;
2. 注意文本型数字。(考虑到EXCEL默认数值输出);
二、考虑输入输出的方式:
1. 考虑到操作的方便性,当前选择区域作为输入(参见EXCEL常见的输入方式);
2. 考虑到应用环境的多样性,将输出位置的选择权交给用户;
三、开发方式:
1. 作为一个通用功能,显然插件形式(AddIn)是最合适的方式;
2. 考虑到专业、高端、安全,本次开发采用VS C#完成(主要还是装逼);
四、解决思路
使用字典储存唯一值,文本型数值存储前,前置单引号强制文本。
五、开发流程:
1. 新建项目
2. 新建功能区
3. 新建菜单按钮
4. 撸代码
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using Microsoft.Office.Interop.Excel;
using Microsoft.Office.Tools.Ribbon;
private void button1_Click(object sender, RibbonControlEventArgs e)
{
//功能:提取唯一值
object[,] Myarr; //定义数组Myarr,object类似VBA中的Variant()同时存储文本/数值。
double Number;
Dictionary
if (Globals.ThisAddIn.Application.Selection.count==1) //如果当前选择只有一个单元格则返回
{
return;
}
Myarr = Globals.ThisAddIn.Application.Selection.Value; //将当前选择区域赋值给数组
foreach(object a in Myarr) //遍历数组元素
{
if (a!=null&&!MyDic.ContainsKey(a)) //忽略空值
{
if(a.GetType()==typeof(string)&&double.TryParse(a.ToString(),out Number)) //判断字符型数字
{
MyDic.Add(''' + a, 0); //字符型数字加单引号强制转换成文本
}
else
{
MyDic.Add(a, 0);
}
}
}
if (MyDic.Count==0) //如果单元格全为空,退出
{
MessageBox.Show('区域内没有有效数据,程序退出');
return;
}
//输出字典Keys
Range MyRng;
//选择结果放置区域
MyRng = Globals.ThisAddIn.Application.InputBox('请选择放置区域', Title: '选择', Type: 8);
//MyDic.Keys.ToArray()将Keys转换为数组
//WorksheetFunction.Transpose数组转置,方便按列输出
//Resize扩展区域
MyRng.Resize[MyDic.Count,1].Value = Globals.ThisAddIn.Application.WorksheetFunction.
Transpose(MyDic.Keys.ToArray());
}
Excel中国合伙人近期推出了大量关于Excel编程的文章,
联系客服