做过基层报表的人都有个体验,两个一样的数据在不同的网站填报表,然后下载出来进行校对,两个表格数据必须一致。但表两内容十分多,必须一行一行地进行人工校验,看得你眼花缭乱,最后还没有信心确认数据是否完全一致。
表封面:
设计思路
1、、将两个工作薄表合并到一个工作薄,这样方便于数据的观察。实现代码如下:
将另一个工作表导入进来。用Copy()方法将另一个工作薄的工作复制进来。
sh.Copy(null,wb1.Sheets("工作台"));
完整代码如下:
function 导入核对数据(){
var wb1=ThisWorkbook;
var pah=wb1.Path+"\\导入文件\\*.xls";
var i=1
var file=Dir(pah);
while (true){
try{
var pah1=wb1.Path+"\\导入文件\\"+file;
var wb2=Workbooks.Open(pah1);
for (var sh of wb2.Sheets){
if(sh.Name !="目录"){
sh.Copy(null,wb1.Sheets("工作台"));
}
}
wb2.Close();
file=Dir()
}catch(err){
alert("己导入核对数据!")
break;
}
}
Sheets("工作台").Activate();
}
2、合并完成后,为了方便到各个工作中去查看数据和后继操作,将工作表名制作成目录。
在这里进行工作名遍历,将每个工作表名写入指定单元。
for (var ws of Sheets)
完整代码如下:
var wsf=WorksheetFunction;
function 获取工作目录(){
let Sh1=ActiveWorkbook.Sheets.Item("工作台")
var i=1;
var RgEnd=Sh1.Range("k9999").End(xlUp);
EedRow=RgEnd.Row+1;
Sh1.Range("k2","k"+EedRow).ClearContents()
for (var ws of Sheets){
if (ws.Name!="工作台"){
Sh1.Cells(i,11).Value2=ws.Name;
//Cells(i,2).Value2=ws.Range("a1").Value2
}
i++;
}
}
3、为了实现目录效果,必须使用工作薄的单元格双击事件,点击工作表目录单元格即可以跳转到对应的表格。
单元格双击事件函数如下:
function Application_SheetBeforeDoubleClick(Sh, rg, cancel)
为了不影响其他单元格的使用,对双击范围必须进行设定:
if((rg.Row>1 && rg.Row<=EedRow) && rg.Column==11 || rg.Column==12 || rg.Column==13){
Sheets.Item(rg.Value2).Activate();
完整代码如下:
function Application_SheetBeforeDoubleClick(Sh, rg, cancel)
{
if(Sh.Name=="工作台"){
var RgEnd=Range("k9999").End(xlUp)
EedRow=RgEnd.Row
if((rg.Row>1 && rg.Row<=EedRow) && rg.Column==11 || rg.Column==12 || rg.Column==13){
Sheets.Item(rg.Value2).Activate();
}
}
}
4、为了方便设置两表的校对对应的工作表,对工作表进行排序,可以多进行几次排序使效果接近设计目录。
使用Move()方法进行移动工作:
Sheets(Rg.Offset(1,0).Value2).Move(null,Sheets(Rg.Value2))
完整代码如下:
function 排序工作表(){
let Sh1=ActiveWorkbook.Sheets.Item("工作台")
let RgEnd=Sh1.Range("k9999").End(xlUp);
let RgEnd1=Sh1.Range("L9999").End(xlUp);
for(let Rg of Sh1.Range("k2",RgEnd)){
if(Rg.Offset(1,0).Value2!=undefined){
Sheets(Rg.Offset(1,0).Value2).Move(null,Sheets(Rg.Value2))
}
}
for(let Rg of Sh1.Range("k2",RgEnd)){
if(Rg.Offset(0,1).Value2!=undefined){
Sheets(Rg.Offset(0,1).Value2).Move(null,Sheets(Rg.Value2))
}
}
for(let Rg of Sh1.Range("L2",RgEnd1)){
if(Rg.Offset(0,1).Value2!=undefined){
Sheets(Rg.Offset(0,1).Value2).Move(null,Sheets(Rg.Value2))
}
}
Sheets("工作台").Activate();
alert("排序完成!")
}
5、前面的准备工作完成后,接下来就可以进行 两表之间的数据核对了。对不一致的数据标记红色。
if(typeof(x)=="string" && x.length==0){
x=undefined;
}
以上代码是因为网站下载的数据有很多是空字符串,是字符类型,但长度又为0,对他必须重新进行赋值定义为 undefined类型,否则校对就要出错。
对不一致数据标记为红色:
sh1.Cells(Rg.Row,Rg.Column).Interior.ColorIndex=7;
对一致数据清除颜色:
sh1.Cells(Rg.Row,Rg.Column).Interior.ColorIndex=xlColorIndexNone;
完整代码如下:
function 校验小学数据(){
let sh0=ActiveWorkbook.Sheets.Item("工作台")
var RgEnd=sh0.Range("h9999").End(xlUp)
for (let Rg4 of sh0.Range("h2",RgEnd)){
let sh=ActiveWorkbook.Sheets.Item(Rg4.Offset(0,3).Value2)
let sh1=ActiveWorkbook.Sheets.Item(Rg4.Offset(0,4).Value2)
let Rg0=sh.Range(Rg4.Value2)
let Rg1=sh.Range(Rg4.Offset(0,1).Value2)
let Arr1=sh.Range(Rg0,Rg1)
for(var Rg of Arr1 ){
let x=Rg.Value2
let y=sh1.Cells(Rg.Row,Rg.Column).Value2
if(typeof(x)=="string" && x.length==0){
x=undefined;
}
if(typeof(y)=="string" && y.length==0){
y=undefined;
}
if(x!=y){
Rg.Interior.ColorIndex=7;
sh1.Cells(Rg.Row,Rg.Column).Interior.ColorIndex=7;
}else{
Rg.Interior.ColorIndex=xlColorIndexNone;
sh1.Cells(Rg.Row,Rg.Column).Interior.ColorIndex=xlColorIndexNone;
//Range().Offset
}
}
}
alert("已全部校验所有表格")
}
为了让工作表重复使用,可以进行工作表删除,初始化工作本表。
使用Delete()方法删除导入的工作表。
function 删除工作表(){
//On Error Resume Next '忽略错误
let Sh1=ActiveWorkbook.Sheets.Item("工作台")
// var RgEnd=Sh1.Range("k9999").End(xlUp);
// var EedRow=RgEnd.Row+1;
//Sh1.Range("k2","k"+EedRow).ClearContents()
Application.DisplayAlerts =false
for (var ws of Sheets){
if(ws.Name !="工作台"){
ws.Delete()
}
}
Application.DisplayAlerts = true;
alert("初始化完成!")
}
虽然JS宏目前还不是很完善,但已经能够满足日常大部分数据处理工作的需要,也不比VBA差,比python使用也更加方便。大家不防使用试试。需要完整表格的可到本博主上传的资源去下载。