【JS宏实战案例】自动核对报表报送情况,表姐表妹的福音来了
创作者俱乐部成员
【案例】某乡镇有20个村,表妹需要收集所有村的人员信息,现已收集了17个村的信息,但是由于各村报表人员素质不一,文件命名混乱,单从文件名,无法看出是哪个村的表,也不知道还差哪些村没报送。只有打开每个文件,才能从D2单元格中看出村名。
【结果】表妹需要得到下面的结果,A列是20个村的名称,B列是报送情况,凡是已报送的村,不管它的文件名是否规范,都能从后台提取其D2单元格的村名,在B列相应位置标记“已报送”,未报送的村,则不作标记,这样就能看出哪些村报送了,哪些村没报送。
【操作效果】具体操作效果如下:
【代码】具体代码如下,可按ALT+F11打开WPS宏编辑器,复制下面的代码粘贴到编辑器中。
function 核对报送情况() {
Application.ScreenUpdating=false //关闭屏幕刷新
obj={} //定义字典,存放报送单位
n=Range('a'+Rows.Count).End(xlUp).Row //获取最后行号
ar=Range('a4:a'+n).Value2 //将单位区域写入数组
ar.forEach(v=>obj[v]='') //将单位写入字典
dw=Range('c1').Value2 //将C1单元格的单位名称赋值给变量dw
let fd = Application.FileDialog(msoFileDialogFilePicker) //打开文件选择器
fd.Filters.Clear() //清除文件选择器内容
fd.Filters.Add('Excel文件', '*.xls;*.xlsx;*.xlsm') //显示EXCEL文件
fd.Title = '请选文件' //设置文件选择器标题
if (fd.Show() != -1) { //如果不选择任何文件
alert('你没选中文件!') //弹出提示
return; //结束退出函数
}
for (let i = 0; i < fd.SelectedItems.Count; i++) { //遍历文件
let f=fd.SelectedItems.Item(i + 1) //将文件名赋值给变量f
let wb = Workbooks.Open(f) //打开工作簿,赋值给对象wb
let dw1 = wb.ActiveSheet.Range(dw).Value2 //获取每张表格中的单位名称
wb.Close(false) //关闭工作簿(不保存)
obj[dw1]=='' ? obj[dw1]='已报送' : obj[dw1]='' //判断单位名称在字典中是否存在,存在则表示已报送
}
for(i=4;i<=n;i++){ //按单位名称循环
t=Cells.Item(i,1).Value2 //将单位名称写入变量t
if(obj[t]){ //判断送报单位在字典中是否存在
Cells.Item(i,2).Value2=obj[t] //如果存在就在B列写入“已报送”
}
}
Application.ScreenUpdating=true //关闭屏幕刷新
}
【素材下载】点击下方链接,下载文件到本地文件夹,在本地文件夹中打开,A列输入自己的单位名称,点击“查看报送情况”按钮,选择表格文件,即可实现自动核对。
https://kdocs.cn/l/clfrcEUJ43zn
创作者俱乐部成员
创作者俱乐部大管家
创作者俱乐部成员
创作者俱乐部成员
WPS函数专家
创作者俱乐部成员
创作者俱乐部成员