ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Excel奇偶数判断:MOD/ISODD/ISEVEN从性别识别到隔行汇总

Excel奇偶数判断:MOD/ISODD/ISEVEN从性别识别到隔行汇总 月初给业务部门处理考勤表时经理提了个需求把每行数据的奇数列和偶数列拆开单独生成两张报表。我以为是什么高深需求查了查发现核心就是Excel里再基础不过的奇偶数判断——但就是这看似简单的MOD、ISODD、ISEVEN配合身份证号能智能识别性别配合SUMIF能实现隔行汇总配合INDEX能完成一行拆两行。这篇指南就是把这些场景串起来完整讲清楚奇偶数机制在Excel里的所有实用玩法。适用人群很明确刚接触函数的新手可以照抄公式有基础的老手可以重点看看隔行汇总和奇偶列重组的优化思路。1. 奇偶判断函数怎么选MOD、ISODD、ISEVEN使用边界1.1 三个入口函数MOD与ISODD/ISEVEN的区别Excel里判断奇偶数绕不开三个函数MOD、ISODD、ISEVEN。很多人只会用一个MOD但实际应用时三个函数各有不可替代的位置。先看最基础的MOD函数。MOD(number, divisor)返回两数相除后的余数判断奇偶就用MOD(A2,2)。当数字是偶数时能被2整除余数为0当数字是奇数时余数为1。用生活类比就是把数字按2个一组打包剩下1个就是奇数刚刚好装完就是偶数。ISODD和ISEVEN则是专门为奇偶判断设计的函数ISODD(A2)判断是否为奇数是则返回TRUE否则返回FALSEISEVEN(A2)反之。从名字就能看出这两个函数可读性更强写公式时一眼就能看出意图。函数/方式公式返回结果适用场景MODMOD(A2,2)0或1需要把奇偶结果继续参与数学运算ISODDISODD(A2)TRUE/FALSE仅判断是否为奇数逻辑直观ISEVENISEVEN(A2)TRUE/FALSE仅判断是否为偶数逻辑直观那到底怎么选我的经验是分情况如果只是“判断奇偶然后返回一个结果”比如IF(ISODD(A2),奇数,偶数)用ISODD/ISEVEN公式可读性好别人接手时不用猜判断条件。如果奇偶状态要作为权重参与后续求和、计数比如后面要讲的隔行汇总用MOD更直接。因为MOD直接返回1或0可以直接参与乘法运算。虽然ISODD返回的TRUE/FALSE在四则运算中也会被当成1/0但公式写出来不如MOD直观也不利于排查。如果参数可能是文本型数字MOD的抗压能力比ISODD强。MOD(3,2)可以正常返回1因为Excel在算术运算中会自动把文本数字转换但ISODD(3)在某些版本的Excel中会直接报#VALUE!。稳妥起见用ISODD时最好给参数加双减号ISODD(--A2)。这里还是强调一下0是偶数负数也有奇偶之分。MOD(0,2)0ISEVEN(0)TRUEMOD(-3,2)1ISODD(-3)TRUE。别被MATLAB或者某些编程语言的负余数规则带偏Excel的MOD返回的余数符号与除数一致除数为2时结果只有0和1判断整数奇偶不会出错。1.2 行号列号奇偶所有高级玩法的共同地基判断单元格数据本身的奇偶只是入门Excel里更高频的场景是判断行号、列号的奇偶。这里两个函数组合出现MOD(ROW(),2)当前行号除以2的余数。下拉填充时会依次得到1、0、1、0……这个序列第1、3、5行返回1第2、4、6行返回0。MOD(COLUMN(),2)当前列号除以2的余数。横向拖拽时A、C、E列返回1B、D、F列返回0。为什么要单独拎出来讲因为后面所有的性别识别、隔行汇总、隔行变色、奇偶列拆分最终都会落到行号奇偶和列号奇偶上。你理解了MOD(ROW(),2)就理解了隔行的本质理解了MOD(COLUMN(),2)就理解了奇偶列拆分的本质。顺带补充一个马上能用的场景判断编号末位奇偶。比如员工编号的最后一位是奇数代表某个分组可以用MOD(RIGHT(B2,1),2)RIGHT取出末位字符MOD判断余数。这里RIGHT返回的是文本但MOD能自动完成转换所以可以放心用。如果用了ISODD建议还是加双减号。2. 身份证第17位性别识别公式的完整拆解2.1 身份证性别编码规则与基础公式“智能性别识别”听起来玄乎原理就一句话中国大陆身份证号码中18位身份证的第17位是性别代码奇数代表男性偶数代表女性15位老身份证则看第15位。这是身份证编码的固定规则不是某个公司自定义的口诀。所以性别识别公式核心就两步第一步把第17位数字提取出来第二步判断它的奇偶。最基础、也是网上流传最广的公式长这样IF(MOD(MID(A2,17,1),2)1,男,女)拆开看MID(A2,17,1)从A2的第17位开始取1个字符得到性别代码MOD(...,2)判断这个字符能否被2整除IF条件成立则返回“男”否则返回“女”。这个公式能工作是因为Excel在算术运算中会自动把文本型的“3”、“5”这类字符转成数值。不过在生产环境里我习惯加双减号强制转换把公式写成IF(MOD(--MID(A2,17,1),2)1,男,女)或者用ISODD写IF(ISODD(--MID(A2,17,1)),男,女)两种写法的执行结果完全一致选哪种看你团队的习惯。我用ISODD多一点原因还是可读性ISODD(...)直接表达了“这一位是奇数”的判断。2.2 兼容15位老身份证的公式设计很多公司的员工信息表里老员工的身份证还是15位。如果直接套用上面的公式取到的是第17位而15位身份证总共就15位取出来是空值整个公式返回“女”批量识别时会产生大量错误。兼容写法其实不复杂先用LEN判断位数位数不同取不同的位置IF(OR(LEN(A2)18,LEN(A2)15), IF(MOD(--MID(A2,IF(LEN(A2)18,17,15),1),2)1,男,女), 号码异常)逻辑拆解最外层IF先判断身份证号长度。18位或15位才继续处理否则直接返回“号码异常”避免乱取位。内层IF中IF(LEN(A2)18,17,15)决定取第17位还是第15位。MID取出性别位MOD判断奇偶返回性别。如果不想写那么长的嵌套可以拆两步。C列先提取性别位IF(LEN(A2)18,MID(A2,17,1),IF(LEN(A2)15,MID(A2,15,1),))D列再判断IF(C2,,IF(MOD(--C2,2)1,男,女))拆开的好处是排查方便。当结果出现异常时你能快速看出是“取位错了”还是“判断错了”而不是对着一串几十个字符的嵌套公式发呆。这里再补一个思路拓展网上有人用TEXT函数写过一个极简版本TEXT(-1^MID(A2,17,1),女;男)原理是-1的奇数次方等于-1偶数次方等于1TEXT格式代码“正数;负数”定义了正数返回“女”、负数返回“男”。这个公式确实巧妙但可读性太差而且依赖TEXT函数区段机制不同版本Excel对0值的处理有细微差异。我自己的观点是这种写法作为思路拓展看看就行生产环境别用团队接手的人会骂的。2.3 科学计数法陷阱与文本格式管理身份证号识别性别这个场景公式本身没有难度真正让无数人翻车的是数据源问题——身份证号被Excel自动转成科学计数法。当你手动输入一个18位数字或者从系统导出身份证号时Excel会默认把它当成数值超过11位就用科学计数法显示超过15位就直接丢精度。比如123456789012345678显示成1.23457E17实际存储可能是123456789012345000后三位变成了0。这时候第17位已经失真任何公式都无法恢复。解决思路只有一个数据源上修复不要在公式里硬扛。分两步如果数据还没录入先把整列单元格格式设为“文本”再输入身份证号或者输入时在英文单引号前加撇号强制转文本。如果别人已经交上来一个被科学计数法破坏的文件先选中该列点击“数据→分列→下一步→下一步→文本→完成”。但注意分列只能把当前显示的文本转回正常显示如果精度已经在录入时丢失后几位变0分列也救不回来只能重新找源头要原始号码。判断身份证号是否已经被破坏有个简单办法拉宽列后看最后一位。如果是0或者000结尾且位数对不上基本就是精度丢失了。另外公式里最好处理一下前后空格。很多人从系统导出的身份证号前后有不可见空格LEN判断会出错。可以在提取性别位前套一个TRIMTRIM(A2)嵌套到公式里就是MID(TRIM(A2),17,1)。2.4 从性别判断延伸到统计汇总姓名身份证号这种表算出性别列之后通常紧接着就是统计男女比例。这里可以用COUNTIF直接统计COUNTIF(C:C,男)但如果你不想添加性别辅助列想一步到位可以用SUMPRODUCT直接统计男性人数SUMPRODUCT((MOD(--MID($A$2:$A$100,17,1),2)1)*1)这个公式会遍历A2到A100的身份证号把每位的奇偶判断结果乘1后加总得到男性人数。注意这里我固定按18位身份证处理如果原始数据里混着15位的老身份证建议还是老老实实加辅助列别在数组公式里硬套IF否则公式复杂度会指数级上升排查也困难。3. 隔行汇总的两种主流做法的取舍3.1 辅助列SUMIF把复杂问题变简单隔行汇总最常见的场景有两个一是财务报表里“本月实际”和“上月预算”两行交替需要分别合计二是数据录入时每隔一行留了分隔行要合计所有数据行。做法一我称之为“辅助列流派”。思路是先用MOD生成一个隔行标记再用SUMIF按标记汇总。假设数据在A2:A101B2输入MOD(ROW(),2)下拉填充B列会得到1、0、1、0……的序列。第2行是偶数行MOD(2,2)0所以B2返回0第3行返回1。这个序列就是每一行“身份”的标签。然后分别求和SUMIF(B:B,1,A:A) // 奇数行合计 SUMIF(B:B,0,A:A) // 偶数行合计为什么推荐辅助列三个理由公式简单一个SUMIF就能看懂不需要理解数组运算。排查方便看B列标记就能判断每行被分到哪一组。后续想按奇偶筛选、排序、复制辅助列直接可用。辅助列唯一的缺点是占了一个列位置。如果表格要交付给外部客户辅助列看起来不专业可以在最后把它隐藏或者把公式直接复制成数值后删除。但日常自用辅助列是我最喜欢的隔行汇总方案。这里有个容易踩的细节如果辅助列是公式排序后它会自动重算。也就是说原来在奇数行的一条记录排序后到了偶数行它的标记会从1变成0跟“记录本身”走而不是跟“原始行号”走。这个特性绝大多数时候是好事但如果你需要固定某条记录一直属于奇数批就要把辅助列转成数值复制→右键粘贴为值后再排序。3.2 SUMPRODUCT一步到位矩阵思维做法二是“函数流派”用一个SUMPRODUCT同时完成判断和求和不需要辅助列。奇数行合计SUMPRODUCT((MOD(ROW(A2:A101),2)1)*A2:A101)拆解一下执行过程ROW(A2:A101)返回{2;3;4;...;101}MOD(...,2)得到{0;1;0;1;...}与1比较后得到逻辑数组{FALSE;TRUE;FALSE;TRUE;...}。用这个逻辑数组直接乘以A2:A101的数值只有奇数行能保留原值偶数行变成0。SUMPRODUCT再把所有值相加得到奇数行合计。偶数行合计把1改成0即可SUMPRODUCT((MOD(ROW(A2:A101),2)0)*A2:A101)选择SUMPRODUCT的关键理由不需要三键确认。虽然新版Excel已经支持动态数组但SUMPRODUCT从老版本到新版本都稳定不会因为同事用的是WPS还是Excel 2016而报错。使用时有几个注意点区域别选整列。SUMPRODUCT((MOD(ROW(A:A),2)1)*A:A)如果公式放在A列会形成循环引用如果放在其他列Excel会扫描整列的数据计算量巨大表格会明显卡顿。建议给一个明确的数据范围比如A2:A1000。区域里不能有文本。如果A列混入了“合计”、“小计”之类的文字文字乘逻辑值会得到#VALUE!整个公式直接报错。解决办法要么是区域严格框选纯数据行要么用SUM(IF(ISNUMBER(A2:A100),...))数组公式替代但后者复杂度高不推荐新手使用。数据起始行决定奇偶基准。如果数据从第2行开始MOD(ROW(A2),2)0表示A2所在行是偶数行这里“隔行”是以工作表行号为基准。如果希望以“数据区第1行、第2行”为基准公式要改成SUMPRODUCT((MOD(ROW(A2:A101)-ROW(A2)1,2)1)*A2:A101)ROW(A2:A101)-ROW(A2)1将每个行号转换成相对位置A2相对位置是1A3是2以此类推。这样无论数据从工作表的哪一行开始相对位置的奇偶始终代表数据区第1行、第3行……3.3 隔行求平均、最大值的扩展隔行求和只是起点隔行求平均、最大值、最小值同样经常用到。隔行求平均值需要同时知道“总和”和“数量”。奇数行总和直接用前面的SUMPRODUCT奇数行数量则用逻辑数组参与计数的写法SUMPRODUCT(--(MOD(ROW(A2:A101),2)1))两个公式除一下就是奇数行的平均值SUMPRODUCT((MOD(ROW(A2:A101),2)1)*A2:A101)/SUMPRODUCT(--(MOD(ROW(A2:A101),2)1))这里的--作用是把逻辑值TRUE/FALSE转换为1/0。MOD(ROW(A2:A101),2)1得到的是逻辑数组直接乘数值也能参与运算但为了让公式的作用看得更明白我习惯用双减号显式转换。两种写法结果一样区别只在可读性。隔行最大值用MAXIFMAX(IF(MOD(ROW(A2:A101),2)1,A2:A101))注意这个公式在旧版Excel里需要按CtrlShiftEnter输入因为它要强制让IF函数按数组展开。Excel 2021及Office 365里直接回车也行。如果不想按三键也可以用SUMPRODUCT配合MAX但那样写容易绕不如直接用数组公式。3.4 隔N行与隔列汇总的通用套路理解了隔行的原理隔N行只是换一个除数的问题。每隔3行汇总一组用MOD(ROW(),3)结果0、1、2会循环。想取第一组条件写成1第二组2第三组0。以此类推每隔N行就是把除数从2改成N然后按需要的余数分组。隔列汇总也是同一套思路只是把ROW换成COLUMN。比如一行数据在B3:G3想要奇数列的合计SUMPRODUCT((MOD(COLUMN(B3:G3),2)1)*B3:G3)但这个公式有个隐藏陷阱COLUMN(B3:G3)返回{2;3;4;5;6;7}MOD后等于1的是第3、5、7列也就是D、F列并不是直观的“第1、3、5列”。如果你想按区域内的绝对位置区域第1、3、5列即B、D、F列必须用相对位置写法SUMPRODUCT((MOD(COLUMN(B3:G3)-COLUMN(B3)1,2)1)*B3:G3)这个细节在隔列汇总时非常容易出错我见过好几个同事写的公式结果对不上原因都是忘了偏移量。记住一条原则用ROW/COLUMN做隔行隔列时先想清楚“我到底以绝对行号为基准还是以数据区域相对位置为基准”想清楚再写公式。4. 奇偶列拆分一行数据变两行的三种落地方式4.1 原理解析与首个推荐方案INDEXCOLUMN公式有一种数据表每行都包含交替的同类字段。比如行程表里“去程日期”“返程日期”“去程城市”“返程城市”排成一行现在要拆成两行第一行放去程信息奇数列第二行放返程信息偶数列。这种需求手动做特别痛苦字段多的时候容易漏但用INDEXCOLUMN的组合可以一次搞定。假设原数据在A1:F1需要拆成两行三列。目标区第一行输入INDEX($A$1:$F$1,COLUMN(A1)*2-1)目标区第二行输入INDEX($A$1:$F$1,COLUMN(A1)*2)然后一起向右拖动三列第一行得到A、C、E列的值第二行得到B、D、F列的值。原理其实不复杂。COLUMN(A1)返回1向右填充时依次变成1、2、3。第一个公式*2-1得到1、3、5对应原表第1、3、5列第二个公式*2得到2、4、6对应原表第2、4、6列。INDEX函数则根据这个列号到锁定区域$A$1:$F$1中取值。这里有三个细节要注意原区域必须用绝对引用$符号否则向右拖公式时区域会跟着移动INDEX的区域会错位。目标区的第一列必须用COLUMN(A1)不是COLUMN()。如果你从B列开始放结果写COLUMN()会返回2*2-1得到3取的是原表第3列而不是第1列。拖动范围控制在原列数的一半。原表6列目标表就只能拖3列多拖会返回#REF!错误因为INDEX的第二个参数超出了区域的列边界。4.2 批量处理多行的模板公式上面的公式只处理了原表第1行如果原表有几十行不能每个都做一次。这里给出一个可直接复制使用的批量模板。假设原表在Sheet1的A1:F100目标表从Sheet2的A2开始。A2放第一组的奇数行A3放第一组的偶数行A4放第二组的奇数行A5放第二组的偶数行……在Sheet2的A2输入INDEX(Sheet1!$A$1:$F$100,INT((ROW()-2)/2)1,COLUMN(A1)*2-1)在Sheet2的A3输入INDEX(Sheet1!$A$1:$F$100,INT((ROW()-2)/2)1,COLUMN(A1)*2)然后选中A2:B3如果要拆出3列就选A2:C3一起向右、向下填充。逐段解释这个公式INT((ROW()-2)/2)1是行号换算的核心。在A2单元格ROW()返回2(2-2)/20INT后为0加1等于1对应原表第1行在A4单元格ROW()返回4(4-2)/21加1等于2对应原表第2行在A6返回3以此类推。这样每两行目标区正好对应原表一行。COLUMN(A1)*2-1处理列号A列取1、3、5列B列什么都不用管因为我让你选中两行一起填充列参数会跟着变化。Sheet1!$A$1:$F$100一定要有Sheet名和绝对引用目标表里套用跨表引用时公式拖动后不会串表。这段公式的好处是不依赖任何新版函数Excel 2007都能跑放到WPS里也能用。我处理过一次性拆分200多行、每行48列的大表用这个公式填充完再复制成数值整个过程不到一分钟。如果你用的是Excel 2021或Office 365可以更偷懒——直接用CHOOSECOLS函数CHOOSECOLS(A1:F100,1,3,5) // 提取奇数列生成完整表格 CHOOSECOLS(A1:F100,2,4,6) // 提取偶数列CHOOSECOLS能直接从二维区域里按列号抽列一步到位连INDEX的列号换算都省了。但要注意版本兼容性Excel 2019及以下版本没有这个函数给同事发文件前先确认版本。4.3 VBA一键拆分脚本如果这种奇偶列拆分是长期性需求比如每个月都要把导出的报表拆一遍那值得写一段VBA脚本实现“选中区域→运行宏→点一下目标单元格→自动拆分”的效果。代码如下Sub SplitOddEvenColumns() Dim src As Range, dest As Range Dim i As Long, j As Long, oddCol As Long, evenCol As Long Set src Selection Set dest Application.InputBox(请选择目标区域左上角单元格, Type:8) For i 1 To src.Rows.Count oddCol 0 evenCol 0 For j 1 To src.Columns.Count If j Mod 2 1 Then oddCol oddCol 1 dest.Offset((i - 1) * 2, oddCol - 1).Value src.Cells(i, j).Value Else evenCol evenCol 1 dest.Offset((i - 1) * 2 1, evenCol - 1).Value src.Cells(i, j).Value End If Next j Next i End Sub使用步骤打开VBA编辑器AltF11插入模块粘贴代码。关闭编辑器回到工作表。选中要拆分的原始数据区域按AltF8打开宏对话框运行SplitOddEvenColumns。在弹出的对话框中点击目标区域的左上角单元格确定。代码逻辑逐行解释外层For i循环遍历源区的每一行内层For j循环遍历每一列j Mod 2 1判断当前列是否为奇数列是则写入目标区当前行组的奇数行位置否则写入偶数行位置。dest.Offset((i-1)*2, oddCol-1)表示每处理完源表一行目标区向下偏移2行oddCol-1控制奇数列在目标行内的横向排列位置。几个注意点目标区不要和源区域重叠否则运行过程中会把还没读取的数据覆盖掉。源区域如果有合并单元格脚本只会取合并区域左上角的值建议先取消合并再运行。工作簿要另存为.xlsm格式并在Excel选项→信任中心→宏设置里允许运行宏。给同事分发时对方也要在打开文件后点击“启用宏”否则脚本无法运行。4.4 Power Query自动化刷新思路再进一步如果这个拆分工作每天都要做、数据源是别人定期更新的Excel表最省心的方案是Power Query。它能把“拆列”的整个过程录下来以后数据更新后只需要点一下刷新。操作思路不写复杂M代码纯UI步骤选中数据区域点击“数据→自表格/区域”进入Power Query编辑器。如果弹出“创建表”对话框直接确定。在编辑器里选中数据列点击“转换→转置”。这一步把原来的列变成行、行变成列。6列数据会变成6行。添加“索引列”从0开始“添加列→索引列→从0”。此时索引0对应原第1列索引1对应原第2列。添加自定义列“奇偶标记”公式为Number.Mod([索引],2)。索引为偶数时得到0奇数时得到1。添加自定义列“分组编号”公式为Number.IntegerDivide([索引],2)。索引0和1都属于第0组索引2和3属于第1组。选中“分组编号”和“奇偶标记”两列右键→透视列值列选“值”聚合函数选“不要聚合”。此时每组会生成一行两个新列分别对应原奇数列和偶数列数据的聚合。关闭并上载到新工作表就得到了拆分好的两行结构。这个方案第一次配置时需要花15分钟但好处是以后数据源更新后右键结果表→“刷新”整张表自动重算。如果你的团队没有会Power Query的人不建议强推公式法和VBA已经能覆盖绝大多数场景。5. 条件格式、打印与数据清洗里的奇偶数思维5.1 条件格式斑马纹与棋盘格隔行变色的“斑马纹”表格靠的就是MOD(ROW(),2)这个判断。它的作用范围远超好看——长报表有了斑马纹阅读时眼睛不容易串行领导看数据时体验完全不一样。操作步骤选中数据区域A2:F100不要把标题行选进来。点击“开始→条件格式→新建规则→使用公式确定要设置格式的单元格”。输入公式MOD(ROW(),2)0点击“格式”设置浅色填充确定。生效后区域内的偶数行会被填充浅色奇数行保持无填充色视觉上形成一行深一行浅的条纹效果。如果你想每隔两行变色而不是隔一行就把公式改成MOD(INT(ROW()/2),2)0原理INT(ROW()/2)把连续两行归成一组第1、2行变成一组的编号第3、4行变成新的一组再对2取余实现两行一组交替上色。如果行和列都想做差异化形成棋盘格效果用这个公式MOD(ROW(),2)MOD(COLUMN(),2)行号奇偶和列号奇偶相等时上色不等时不上色视觉上就是棋盘格子。这个技巧做课程表、广播体操站位表这类二维排布特别实用。条件格式最容易翻车的点是活动单元格位置。如果你选中区域时以A2为活动单元格公式里写MOD(ROW(),2)0Excel会自动以A2为基准向下应用效果正确如果你的活动单元格是A1公式里的ROW()在A2会变成2仍然正确。但如果你写MOD(ROW(A2),2)0Excel在条件格式里会按相对引用自动调整效果可能完全不一样。我的建议是条件格式的公式尽量不写单元格引用直接用ROW()或COLUMN()让系统按各自行判断逻辑更好理解。5.2 隔行打印与奇偶筛选隔行汇总之外“只打印奇数行”也是一个高频需求。比如一个500人的名单想隔行抽样打印一批检查或者面试日程按奇偶分两批都离不开隔行筛选。最简单的做法是利用辅助列C2输入MOD(ROW(),2)下拉填充。对C列设置筛选勾选1表示奇数行。打印筛选结果。关键细节在第三步筛选后打印Excel通常只打印可见行但为了绝对保险建议先CtrlG打开定位窗口点击“定位条件”选择“可见单元格”然后复制这些内容到一个新工作表再打印。这样能避免一些老版本Excel在筛选状态下打印时把隐藏行也带出来。不想用筛选和辅助列的话还有一招“高级筛选”可以直接把奇数行提取到指定位置准备一个条件区域比如E1输入条件公式MOD(ROW(A2),2)1。注意这里A2的2是数据区第一行的工作表行号。如果数据从第2行开始条件公式就写到A2。点击“数据→高级”列表区域选$A$1:$A$500条件区域选$E$1:$E$2复制到选一个空白单元格。确定后所有奇数行会被复制到目标位置。高级筛选的隐藏逻辑是条件单元格中的公式会相对应用到列表区域的每一行。条件公式写到A2表示以数据区第2行为基准Excel会自动扩展到第3、4行等。这个细节很多教程不讲导致很多人不知道高级筛选还能用公式做条件。5.3 提取奇数位/偶数位字符的数据清洗法奇偶数的思维还能用在字符串提取上。有一种数据清洗场景系统导出的流水号、批号编码中规律性地每隔一个字符需要提取一次。比如有一个混合编码“AB12CD34”现在要提取第1、3、5、7位奇数位得到“A1C3”。用传统MID函数需要写多个参数编码长度一长就烦人。Excel 2019以上版本可用TEXTJOIN配合数组公式一步完成TEXTJOIN(,1,MID(A2,ROW(INDIRECT(1:LEN(A2)))*2-1,1))提取偶数位只需把*2-1改成*2TEXTJOIN(,1,MID(A2,ROW(INDIRECT(1:LEN(A2)))*2,1))拆解执行过程LEN(A2)得到字符串长度INDIRECT(1:LEN(A2))生成从1到长度的行引用ROW(...)将其转为数组{1;2;3;...}*2-1得到{1;3;5;...}正好是奇数位的位置MID逐个取出对应字符TEXTJOIN最终把所有字符拼接成一个字符串。在Excel 2019里输入这个公式不需要三键MID会自动按数组展开在老版本Excel里需要CtrlShiftEnter否则只返回第一位字符。如果你的版本没有TEXTJOIN可以用VBA写一个自定义函数几行代码就能搞定Function ExtractOdd(s As String) As String Dim i As Long, r As String For i 1 To Len(s) Step 2 r r Mid(s, i, 1) Next i ExtractOdd r End Function在单元格输入ExtractOdd(A2)即可返回奇数位字符。想提取偶数位把Step 2改成Step 2内部循环起点改成2即可。顺带提一个相关的小技巧奇偶行拆分大表也可以用辅助列筛选实现。比如一张上万人的名单要拆成两批面试加辅助列MOD(ROW(),2)筛选1复制一批筛选0复制另一批整个过程两分钟完成。6. 奇偶数实战常见错误从公式翻车到数据损坏的排查思路6.1 最常见的7个翻车现场奇偶数相关公式整体不难但我在实际支撑业务部门的过程中几乎每周都能遇到一两个翻车案例。常见问题集中在七个地方翻车1ISODD/ISEVEN遇上文本数字ISODD(3)在部分Excel版本中直接返回#VALUE!。从系统导出的编号列、用TEXT函数生成的字符串列看着是数字实际上是文本。解决方式统一加--转换ISODD(--A2)。这条建议我已经提了三次因为它是ISODD使用中最隐蔽的坑。翻车2身份证号被科学计数法破坏输入18位数字变成1.23457E17后三位精度丢失。这种问题用公式救不回来只能回到数据源头重新获取。把身份证列预先设为文本格式是唯一的根治办法。翻车3SUMPRODUCT区域内混入文本SUMPRODUCT((MOD(ROW(A2:A101),2)1)*A2:A101)如果A列某行是“合计”两个字整个公式报#VALUE!。排查方法是把区域缩小到纯数据范围或者用F9查看公式中间结果定位问题行。翻车4行号基准错位数据从第3行开始直接套用MOD(ROW(),2)1作为“数据区第1行”的判断结果整个汇总对不上。原因就是没搞清楚“工作表行号”和“数据区相对行号”是两码事。遇到从中间行开始的数据表用MOD(ROW()-开始行1,2)换算相对位置。翻车5INDEXCOLUMN拆分时下标越界公式拖动超过了原区域列数的一半返回#REF!。排查方法是检查目标表列数和原表列数是否匹配目标表只能拉原列数一半的宽度。翻车6辅助列排序后标记乱套辅助列公式MOD(ROW(),2)在排序后会自动重算标记跟随新行号而不是跟随记录本身。如果你需要记录固定归属先把辅助列粘贴成数值再排序。翻车7条件格式公式的相对引用错乱写MOD(ROW(A2),2)0应用到整个区域时Excel会按相对引用逐行调整。大多数情况下结果一样但如果你在条件格式里想固定参照某一行必须写成MOD(ROW($A$2),2)0绝对引用的符号不能省。6.2 调试公式的三个实用习惯遇到公式结果对不上的时候别急着改逻辑先定位问题在哪一步。第一个习惯是用“公式求值”。选中公式所在单元格点击“公式→公式求值”Excel会一步一步展示MOD、MID、IF等函数的执行过程你能看到函数中间结果很快定位是取位错误还是判断错误。第二个习惯是F9查看数组片段。在编辑栏里用鼠标选中公式的某一段比如选中MOD(ROW(A2:A101),2)按F9Excel会直接显示该段的结果比如{0;1;0;1;...}。看完记得按Esc退出不要按回车否则会把公式改写成具体数值。第三个习惯是长公式拆列验证。不要追求一条公式解决所有问题先把身份证号的性别位提取到辅助列确认提取正确后再做奇偶判断。多花30秒省下半小时排查时间。我自己做过大量表格后最深的体会是奇偶数这类小工具能用的地方远比想象中多但千万别把它当银弹。每次动手前先问一句“我要判断的是行号、列号还是数据本身的奇偶”这个问题想清楚了公式基本不会错。如果连自己都分不清那后面所有隔行汇总、行列拆分的结果大概率都是错的。
返回列表