结果:
因为原表不能动,于是新建副本在里面操作。
/**
* 筛选出每个月新增的不重复项目,先排序后去重,目的是留下的是月份最小的项目。
*/
function 查找新增项目(){
Console.clear();
AddSheet();
Sort("月份"); //排序
Unique("建设单位"); //去重
}
function Sort(a)
{
var target_name = a;
//查找值
/**知识点:定位单元格位置*/
let cell = Cells.Find(target_name).Select();
var col = ActiveCell.Cells.Column;
var row = ActiveCell.Cells.Row;
let rangeCell = Range(Cells(row,col),Cells(row,col));
var rowend = Cells(Rows.Count,1).End(xlUp).Row;
// 按列进行升序排序
Columns(col).Select();
(obj=>{
(obj=>{
obj.Clear();
// xlDescending降序;xlAscending升序
obj.Add(rangeCell, undefined, xlAscending, undefined, undefined);
})(obj.SortFields);
obj.Header = xlYes; // 首行标题行
obj.MatchCase = false; // 不区分大小写
obj.SortMethod = xlPinYin; // 拼音
obj.Orientation = xlSortColumns;// 排序方向 按列
obj.SetRange(Range(Rows(1),Rows(rowend)));
obj.Apply();
})(ActiveSheet.Sort);
//alert("排序完成");
Debug.Print("排序完成");
}
function Unique(b)
{
var target_name = b;
//查找值
let cell = Cells.Find(target_name).Select();
var col = ActiveCell.Cells.Column;
var row = ActiveCell.Cells.Row;
let rangeCell = Range(Cells(row,col),Cells(row,col));
var rowend = Cells(Rows.Count,1).End(xlUp).Row;
//去重
Range(Rows(1),Rows(rowend)).Select();
Selection.RemoveDuplicates(col, xlYes);
Debug.Print("去重完成");
}
function AddSheet()
{
ActiveSheet.Copy(null, Application.Sheets.Item("其他费用估算表"));
Debug.Print("新增完成");
}
/** 在点击目标表时自动弹出执行窗口
*/
function Workbook_SheetActivate()
{
/**知识点:获取表名*/
var sh = ActiveSheet.Name;
if(sh == "项目分项估算表"){
if(MsgBox("查找新增项目",jsOKCancel)==1)
{
查找新增项目();
}
}
}
下一步的问题:
- 想将代码封装,给不懂代码的人每次运行的时候有个按钮一点就行,有什么好方法吗?用户窗体显示的话好像不能一块封装。