体制内同事都在问:WPS怎么一键将总表按列标题拆为工作簿?代码直接复制用
你的.xlsm文件,是不是打不开了?
这两年,体制内的”国产替代”不是口号,是每天都在发生的事。麒麟系统、统信UOS、WPS Office——新电脑到手,旧工具全废。
过去攒的那些VBA神器,现在打不开。辛辛苦苦写的宏,眼看就要吃灰。
别慌,救星来了。
WPS自带的JS宏(JSA),基于JavaScript,国产机完美运行,前端同学一看就懂。我把最常用的功能重新写了一遍,今天先上第一个:按列拆分工作簿。
总表在手,一键拆成几十个独立文件。部门、地区、月份——你想按什么拆,就按什么拆。
一、这个宏,到底强在哪?
|
|
|
|---|---|
| 按列拆分 |
|
| 格式全保留 |
|
| 智能命名 |
|
| 文本防变形 |
|
| 零门槛 |
|
一句话:复制代码,粘贴运行,剩下的交给电脑。
二、怎么用?5步搞定
Step 1:打开总表,光标放在数据区域任意单元格。
Step 2:按 Alt + F11 打开WPS宏编辑器。
Step 3:左侧”模块”右键 → 插入 → 模块,把文末代码完整复制进去。
Step 4:关闭编辑器,按 Alt + F8,选中 SplitToWorkbookWithDialog,点击”执行”。
Step 5:依次输入:
-
拆分列字母:如 A、d(第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 + 1, 1), newSheet.Cells(usedRng.Rows.Count, usedRng.Columns.Count) ).ClearContents(); }// 写入分组数据if (groupData.length > 0) {var outRng = newSheet.Cells(bt + 1, 1).Resize(groupData.length, colCount); outRng.NumberFormat = "@"; // 强制文本格式 outRng.Value2 = groupData; }// 工作表命名(替换非法字符)var sheetName = String(k).replace(/[\\\/?*\[\]:]/g, "-");if (sheetName.length > 31) sheetName = sheetName.substring(0, 31); newSheet.Name = sheetName;// 文件名处理var fileName = String(k).replace(/[\\\/?*\[\]:]/g, "-");if (fileName.length > 200) fileName = fileName.substring(0, 200);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; } }}
四、避坑指南(必看)
|
|
|
|---|---|
|
|
|
|
|
|
|
|
-,无需担心 |
|
|
|
|
|
|
测试环境:WPS 2023专业版/个人版,国产系统完美运行。
五、还有更多
这只是一个开始。接下来我会把经典VBA案例全部”翻译”成JSA,
几十个实用功能,陆续上线。
如果你有特别想迁移的VBA功能,评论区留言,我优先安排。
觉得有用? 转发给同样在国产化办公环境里挣扎的伙伴。点击”在看”,让更多人看到这份指南。
夜雨聆风