乐于分享
好东西不私藏

体制内同事都在问:WPS怎么一键将总表按列标题拆为工作簿?代码直接复制用

体制内同事都在问:WPS怎么一键将总表按列标题拆为工作簿?代码直接复制用

你的.xlsm文件,是不是打不开了?

这两年,体制内的”国产替代”不是口号,是每天都在发生的事。麒麟系统、统信UOS、WPS Office——新电脑到手,旧工具全废。

过去攒的那些VBA神器,现在打不开。辛辛苦苦写的宏,眼看就要吃灰。

别慌,救星来了。

WPS自带的JS宏(JSA),基于JavaScript,国产机完美运行,前端同学一看就懂。我把最常用的功能重新写了一遍,今天先上第一个:按列拆分工作簿

总表在手,一键拆成几十个独立文件。部门、地区、月份——你想按什么拆,就按什么拆。

一、这个宏,到底强在哪?

功能
说明
按列拆分
按部门、地区、月份等任意列,自动分成多个工作簿
格式全保留
列宽、标题样式、背景色,原封不动搬过去
智能命名
文件名自动用该列的值命名,非法字符自动替换
文本防变形
身份证号、长数字强制文本格式,告别”E+”噩梦
零门槛
3个弹窗输入参数,不用改一行代码

一句话:复制代码,粘贴运行,剩下的交给电脑。

二、怎么用?5步搞定

Step 1:打开总表,光标放在数据区域任意单元格。

Step 2:按 Alt + F11 打开WPS宏编辑器。

Step 3:左侧”模块”右键 → 插入 → 模块,把文末代码完整复制进去。

Step 4:关闭编辑器,按 Alt + F8,选中 SplitToWorkbookWithDialog,点击”执行”。

Step 5:依次输入:

  • 拆分列字母:如 Ad(第1列或第4列)
  • 标题行数:标题占几行就填几
  • 保存位置:选一个文件夹,拆分后的文件全放这里

等几秒,去文件夹验收成果。

三、完整代码(直接复制,不用改)

functionSplitToWorkbookWithDialog() {with(Application) {ScreenUpdating = false;DisplayAlerts = false;AskToUpdateLinks = false;  }try {// 1. 输入拆分列字母(大小写均可)var colLetter = InputBox("请输入拆分依据的列字母(如 A、B):""拆分列""A");if (!colLetter) {MsgBox("已取消操作");return;    }    colLetter = colLetter.toUpperCase();var splitCol = colLetter.charCodeAt(0) - 65// A -> 0if (splitCol < 0 || splitCol > 25) {MsgBox("请输入有效的单个英文字母(A-Z)!");return;    }// 2. 输入标题行数var btStr = InputBox("请输入标题行的行数(数字):""标题行数""1");if (!btStr) {MsgBox("已取消操作");return;    }var bt = parseInt(btStr);if (isNaN(bt) || bt < 1) {MsgBox("请输入大于0的有效数字!");return;    }// 3. 选择保存文件夹var fd = Application.FileDialog(msoFileDialogFolderPicker);    fd.Title = "请选择拆分后工作簿的保存位置";if (fd.Show() !== -1) {MsgBox("未选择文件夹,操作取消");return;    }var savePath = fd.SelectedItems.Item(1);// 4. 获取当前表数据var sourceSheet = ActiveSheet;var rng = sourceSheet.Range("A1").CurrentRegion;var allData = rng.Value2;var colCount = allData[0].length;if (bt >= allData.length) {MsgBox("标题行数不能大于等于数据总行数!");return;    }var titles = allData.slice(0, bt);var dataRows = allData.slice(bt);// 5. 按列分组var dict = {};for (var i = 0; i < dataRows.length; i++) {var row = dataRows[i];var key = row[splitCol];if (key === undefined || key === null) {        key = "(空白)";      }if (!dict.hasOwnProperty(key)) {        dict[key] = [];      }      dict[key].push(row);    }// 6. 逐个生成工作簿var startTime = Date.now();for (var k in dict) {var groupData = dict[k];// 复制源表(保留格式)      sourceSheet.Copy();var newSheet = ActiveSheet;var newBook = ActiveWorkbook;// 清除原有数据区(保留标题行)var usedRng = newSheet.Range("A1").CurrentRegion;if (usedRng.Rows.Count > bt) {        newSheet.Range(          newSheet.Cells(bt + 11),          newSheet.Cells(usedRng.Rows.Count, usedRng.Columns.Count)        ).ClearContents();      }// 写入分组数据if (groupData.length > 0) {var outRng = newSheet.Cells(bt + 11).Resize(groupData.length, colCount);        outRng.NumberFormat = "@"// 强制文本格式        outRng.Value2 = groupData;      }// 工作表命名(替换非法字符)var sheetName = String(k).replace(/[\\\/?*\[\]:]/g"-");if (sheetName.length > 31) sheetName = sheetName.substring(031);      newSheet.Name = sheetName;// 文件名处理var fileName = String(k).replace(/[\\\/?*\[\]:]/g"-");if (fileName.length > 200) fileName = fileName.substring(0200);var fullPath = savePath + "\\" + fileName + ".xlsx";      newBook.SaveAs(fullPath);      newBook.Close(false);    }var elapsed = ((Date.now() - startTime) / 1000).toFixed(2);MsgBox("拆分完成!\n用时 " + elapsed + " 秒\n文件保存在:\n" + savePath);  } catch (e) {MsgBox("程序出错:" + e.message);  } finally {with(Application) {ScreenUpdating = true;DisplayAlerts = true;AskToUpdateLinks = true;    }  }}

四、避坑指南(必看)

解决方案
只对当前活动表生效
运行前确保总表是激活状态
空白值会生成”(空白)”文件
拆分前列数据尽量补全
文件名非法字符
自动替换为-,无需担心
长数字变科学计数法
已强制文本格式,身份证号安全
Excel用户
此代码仅WPS适用,Excel请用VBA版

测试环境:WPS 2023专业版/个人版,国产系统完美运行。

五、还有更多

这只是一个开始。接下来我会把经典VBA案例全部”翻译”成JSA,

几十个实用功能,陆续上线。

如果你有特别想迁移的VBA功能,评论区留言,我优先安排。


觉得有用? 转发给同样在国产化办公环境里挣扎的伙伴。点击”在看”,让更多人看到这份指南。