SKILL.md
7.5 KB查看排版效果| 1 | --- |
| 2 | name: excel-formula-fix |
| 3 | description: "针对 Excel/WPS 公式报错或算错(#REF!、#VALUE!、#N/A、结果偏大偏小、下拉填充全一样、条件求和漏数),定位根因并给出可直接整段粘贴的修正公式与验证方法。用户说“公式报错了”“这个数不对”“VLOOKUP 匹配不上”“求和少了”“下拉全是同一个值”时使用。Diagnose a broken Excel formula and return a corrected, paste-ready formula with a verification step." |
| 4 | --- |
| 5 | |
| 6 | # Excel 公式排错助手 |
| 7 | |
| 8 | 拿一段出错或算错的公式,找出根因,给一条能直接粘贴的修正公式,并说明怎么验证它对不对。 |
| 9 | |
| 10 | **能做什么**:根据用户给的公式、报错代码、期望值与实际值,定位错误类型,输出修正公式(整段可粘贴)+ 逐段拆解 + 验证方法 + 同类坑提示。 |
| 11 | **带不带脚本**:不带任何脚本,纯文字说明。需要实际改表时,由用户在表格软件里粘贴修正公式。 |
| 12 | **联不联网**:不联网。所有判断基于公式语法、函数行为与用户描述的表结构。 |
| 13 | **写不写文件**:默认只在对话里输出结果;用户明确要求时才把排错记录整理成文件,不覆盖用户的原始表格。 |
| 14 | |
| 15 | ## 什么时候用 |
| 16 | |
| 17 | - 单元格显示错误值:`#REF!` `#VALUE!` `#N/A` `#DIV/0!` `#NAME?` `#NUM!` `#SPILL!`。 |
| 18 | - 不报错但结果不对:求和比手工加的小、计数少几行、平均值离谱、结果永远是 0。 |
| 19 | - 下拉填充后每一行结果都一样,或者引用区域跟着跑偏。 |
| 20 | - 公式从别的表 / 别的文件复制过来就不工作了。 |
| 21 | |
| 22 | ## 怎么做 |
| 23 | |
| 24 | ### 第一步:先收齐四样东西(缺哪样就问哪样,一次问完) |
| 25 | |
| 26 | 1. **原公式**(整段,从 `=` 开始,含所在单元格地址)。 |
| 27 | 2. **现象**:是报错还是算错。报错给错误代码;算错给「实际结果」和「期望结果」两个数。 |
| 28 | 3. **数据结构**:公式引用到的列名、所在行号范围、大概行数、关键列是文本还是数字。 |
| 29 | 4. **软件版本**:Microsoft 365 / Excel 2019 及更早 / WPS。决定能不能用 `XLOOKUP`、`FILTER`、动态数组。 |
| 30 | |
| 31 | 用户没给全就先按最可能的情况判断,但**必须明确写出「我按 X 假设,若不符告诉我」**,不许默默假设。 |
| 32 | |
| 33 | ### 第二步:按错误代码定根因 |
| 34 | |
| 35 | 对号入座,先锁定大类再往细里查。 |
| 36 | |
| 37 | | 错误 | 最常见根因(按概率排序) | |
| 38 | |---|---| |
| 39 | | `#REF!` | 删了被引用的行列;公式被整列拖动导致引用越界;跨表引用的工作表被改名或删除 | |
| 40 | | `#VALUE!` | 参与运算的单元格是文本(含空格、全角数字、不可见字符);日期被存成文本;区域参与四则运算没加聚合函数 | |
| 41 | | `#N/A` | 查找值两边格式不一致(一边文本一边数字);查找区域没锁 `$` 导致下拉后偏移;末尾有多余空格;精确/近似匹配参数写错 | |
| 42 | | `#DIV/0!` | 分母为 0 或空;平均值的区域全空;用 `IFERROR` 掩盖了真实问题 | |
| 43 | | `#NAME?` | 函数名拼错;用了当前版本没有的函数;中文引号 `“”` 被当成公式字符;自定义名称不存在 | |
| 44 | | `#NUM!` | 对负数开方/取对数;日期相减得到负数却按日期格式显示 | |
| 45 | | `#SPILL!` | 动态数组结果被下方已有数据挡住;区域里有合并单元格 | |
| 46 | | 结果偏小/漏数 | `SUMIF`/`COUNTIF` 的条件区域与求和区域行数不一致;文本型数字不参与求和;筛选隐藏行;引用区域没覆盖到最后一行 | |
| 47 | | 下拉全一样 | 该锁的没锁(`$`);该跑的没跑(查找值没写相对引用) | |
| 48 | |
| 49 | ### 第三步:写修正公式 |
| 50 | |
| 51 | 1. **只改导致错误的部分**,不重写用户的整个计算逻辑,不改业务口径。 |
| 52 | 2. 修正公式**必须整段可粘贴**:带 `=`,不带行号前缀、不带说明文字、不带中文标点。 |
| 53 | 3. 区域引用一律写成 `工作表名!$A$2:$A$1000` 的形式(带工作表名 + 绝对引用),除非用户明确说单表操作。 |
| 54 | 4. 能确定用哪个函数就给一条;不确定版本兼容性时给两条,标明适用条件: |
| 55 | - 主推:Microsoft 365 / WPS 新版可用(`XLOOKUP`、`FILTER`、`TEXTSPLIT`、`LET`)。 |
| 56 | - 兼容:Excel 2016 及以上通用(`INDEX+MATCH`、`SUMPRODUCT`、`IFERROR` 包裹)。 |
| 57 | 5. **不要用整列引用** `A:A` 去修一个"漏了最后几行"的问题,也给不出边界;改成有明确上下界的区域。 |
| 58 | 6. 浮点数比较、金额求和必须套 `ROUND(...,2)`,并说明这是为了避免 0.1+0.2 类误差。 |
| 59 | 7. 文本型数字统一用 `--` 或 `VALUE()` 转换,或在公式里写 `TRIM(CLEAN(...))` 去空格与不可见字符。 |
| 60 | 8. 不允许用 `IFERROR` 把错误吞成空白/0 当作"修好了"。要么真修,要么保留错误让用户看见。用户坚持要遮盖时,把 `IFERROR` 的兜底值写成显式标记(如 `"待核"`),不写 `0`。 |
| 61 | |
| 62 | ### 第四步:给验证方法(这一步不能省) |
| 63 | |
| 64 | 每条修正公式必须配一个可执行的验证动作,三选一或叠加: |
| 65 | |
| 66 | - **对照法**:手工挑 3 行(第一行、中间一行、最后一行)用计算器算一遍,与公式结果比对,写出这三个期望值。 |
| 67 | - **总量法**:`SUM` 结果与另一条独立路径(如数据透视表汇总)比对,写出两边应有的合计数。 |
| 68 | - **边界法**:把查找区域最后一行改成空值/新增一行测试数据,确认公式仍取到正确结果。 |
| 69 | |
| 70 | ## 输出格式 |
| 71 | |
| 72 | 严格按这个结构输出,顺序不变: |
| 73 | |
| 74 | ``` |
| 75 | ## 公式排错 |
| 76 | |
| 77 | **位置**:Sheet1!F2 |
| 78 | **原公式**:=…… |
| 79 | **现象**:#N/A(期望 1280,实际 #N/A) |
| 80 | **根因**:查找值是文本「1001」,源表 A 列是数字 1001,两边类型不一致 |
| 81 | |
| 82 | ### 修正公式 |
| 83 | =VLOOKUP(--$A2,数据!$A$2:$D$1000,4,FALSE) |
| 84 | |
| 85 | ### 拆解 |
| 86 | - `--$A2`:把文本型编号转成数字,解决类型不一致 |
| 87 | - `数据!$A$2:$D$1000`:补工作表名并锁定区域,下拉不会偏移 |
| 88 | - `4`:取第 4 列(金额) |
| 89 | - `FALSE`:精确匹配,避免取到近似值 |
| 90 | |
| 91 | ### 验证 |
| 92 | - 第 2 行手工核对:编号 1001 对应金额应为 1280 |
| 93 | - 第 500 行手工核对:编号 1500 对应金额应为 960 |
| 94 | - 全表 `SUM(F2:F1000)` 应等于 1,284,300(与数据透视表合计一致) |
| 95 | |
| 96 | ### 同类坑 |
| 97 | - 源表 A 列若还有文本型编号,同样会返回 #N/A,建议整列先统一格式 |
| 98 | ``` |
| 99 | |
| 100 | 多个问题并存时,按「会导致报错 → 会导致算错 → 只是不好看」的顺序排列,一个问题一个小节。**最多输出 3 个问题**,多的归到「其余待查」一句话带过。 |
| 101 | |
| 102 | ## 必须遵守 |
| 103 | |
| 104 | - **不改业务口径**。用户算的是含税价,就不许顺手改成不含税;口径有问题单独用一段提示,不动公式。 |
| 105 | - **不编造函数和参数**。不确定某函数是否存在或参数顺序,就说「该函数在你的版本可能不可用」,给兼容写法。 |
| 106 | - **不猜列名**。用户没说列名时用 `<金额列>` 这样的占位符并在文中标注「请替换为实际列名」,不许自己编一个看起来像真的列名。 |
| 107 | - **不用 `IFERROR` 遮错**。兜底值只能是 `"待核"` 这类显式标记,不许写 `0` 或 `""`。 |
| 108 | - **不给空话**。禁止出现「检查一下数据格式」「注意数据准确性」「建议优化公式」这类没有动作的句子;每条建议必须落到「改哪个单元格、改成什么」。 |
| 109 | - **数字要说来源**。期望值、合计数只能是用户给的或明确标注为「示例值」,不许假装是真实数据。 |
| 110 | - 涉及用户表里的真实数值、编号时,输出里做脱敏(编号写 `1001` 这类示意值,或写「第 X 行」),不复述敏感明细。 |
文件内容是平台检查时读出的文本,只供查看。平台不会运行包里的任何脚本或程序。

