Excel按字母排序时,引用同工作簿其他工作表的行未更新求助
嘿,我来帮你搞定这个头疼的问题!首先得弄明白为啥排序后跨表引用不跟着变——Excel默认的单元格引用是盯着具体位置的,不是内容。比如你写=Sheet2!A1,它就认准Sheet2的A1单元格,哪怕排序后原来的内容跑到了A5,引用还是指向A1,自然不会更新。下面给你几个靠谱的解决办法:
一、最省心的方案:用结构化引用(适合表格数据)
把你的数据区域转换成Excel官方的“表格”格式(选中数据按Ctrl+T,弹框里勾选“我的表格有标题”),然后把原来的普通引用改成结构化引用。比如原来的=Sheet2!A1,改成=Sheet2[姓名](假设Sheet2的表格里列标题是“姓名”)。这样不管怎么排序,引用都会跟着表格里的内容走,因为它认的是列里的对应数据,不是固定单元格位置。
二、灵活的动态引用:INDEX+MATCH组合
如果不想转成表格,那就用INDEX和MATCH搭伙干活,让引用变成“找内容”而不是“找位置”。举个实际例子:
假设你要在当前工作表引用Sheet2里,和当前行C列姓名匹配的分数,公式可以这么写:
=INDEX(Sheet2!$D:$D, MATCH($C2, Sheet2!$B:$B, 0))
这里MATCH会帮你找到Sheet2里姓名对应的行号,INDEX再根据这个行号把分数揪出来。不管Sheet2怎么排序,只要姓名没变,结果就会自动更新。
三、顺便检查排序的小细节
有时候排序时如果没选“扩展选定区域”,会导致只有单列排序,其他列错位,但这和跨表引用更新关系不大,不过还是提一嘴:排序弹框里一定要勾选“扩展选定区域”,确保整行数据一起动,避免数据乱掉。
对了,你的insertButton代码还有点小问题
看你贴的代码没写完(最后是xlPast,应该是xlPasteValues吧?),给你优化一下,尽量少用Select和Selection——这俩不仅慢,还容易因为选中区域不对出问题:
Private Sub insertButton_Click() ' 插入新行 ActiveCell.EntireRow.Insert Shift:=xlDown ' 复制A9:AK9的公式和格式到A8:AK8 Range("A9:AK9").Copy Range("A8:AK8").PasteSpecial Paste:=xlPasteFormulas Range("A8:AK8").PasteSpecial Paste:=xlPasteFormats ' 复制C10的值到C8:C9 Range("C10").Copy Range("C8:C9").PasteSpecial Paste:=xlPasteValues ' 清除复制状态,避免剪贴板残留 Application.CutCopyMode = False End Sub
还有个小拼写错误:xltoDown要改成xlDown,不然会报错哦。
内容的提问来源于stack exchange,提问作者Lorum

