我有一张包含 19k 个姓名的电子表格。在 B 列中,每行(姓名)都输入一个代码。所有代码都以 R 开头。有没有办法预先用 R 填充每个单元格,以便用户只需输入其余代码?例如 R130.52 如果可能,我是否可以预先用 R 填充每个单元格,然后让用户输入其余代码?
答案1
这是不可能的。当用户开始在单元格中输入内容时,原始内容将被删除并替换。
一种解决方法是让 B 列填满 R,然后用户在 C 列中输入其余代码,在 D 列中输入公式=concat(B1,C1)
(第一行的示例,当然您必须将其复制下来),然后会显示完整代码。您可以通过删除网格线并在 B 列和 C 列的单元格周围添加边框,使其在视觉上相当美观,因此看起来 R 和其余代码确实属于一起。
您也可以放弃B列,并将公式改为=concat("R",C1)
。
一切都取决于您的灵活性、用户的复杂程度等等。
答案2
另请注意,Excel 本身(即程序本身,而不是 VBA 等附加组件)无法做到这一点。
但是,如果您被允许使用宏并且愿意学习如何使用,那么可以使用 VBA。VBA 具有一种根据按下某个键(或者更确切地说是按下某个特定键,即 Enter 键)来执行操作的机制。因此,您会看到开销:它必须在每次按下键后执行。并且,在您的情况下,它必须决定是否执行该操作,而不仅仅是在每次按下键后执行该操作。它需要检查当前选定的单元格是否在 B 列中,因此它应该执行在单元格中当前内容之前插入“R”的操作,或者它不是 B 列,因此它不应该执行该操作。因此,开销相当大。
此外,由于在单元格中输入内容并保留它的方式不止这些,比如说,Excel 会接受输入,就像按下了 Enter 键一样,因此您需要找出所有可能的方式(进行大量的网络搜索才能“找到所有方式!”)并根据这些方式采取行动。有人可能会输入任何内容,然后按 TAB 或箭头键,运行宏,将鼠标移开……太多事情了。
我相信 VBA 也可以采用“OnChange”方法(与上面的“OnKey”方法相反)。但仍然存在初始开销和“我是否采取行动?”开销。
另一种方法可能是编写一个宏来检查 B 列单元格的内容,然后检查第一个字符是否为“R”,如果不是,则插入“R”,然后留一个按钮让用户按下它,并将宏设置为在保存文件之前运行。或者每分钟或十分钟(或其他时间)运行一次。考虑到“R”对电子表格的工作一定很重要,这些都不是真正的“好方法”,因此用户可能会在不按下按钮的情况下切换到查看其输出,或者在正确更新完成之前几分钟,无论如何,从而收到错误的结果。
有人可能会采取完全不同的方法。真正重要的是你愿意做什么、允许哪些结构变化以及你的用户是否会接受并正确使用新方法。例如:
“嘿,大家,重写电子表格吧,你再也不需要输入‘R’了……它会自动输入。”这听起来很有趣,输入数字后“R”就会出现,这真是太方便了。似乎你已经把一项极其繁重的家务从他们肩上卸了下来。这种变化可能会让他们非常高兴。
“嘿,大家,重写电子表格,现在你们不能在每个 B 列条目中输入前导‘R’。如果你输入了,它会被处理,一两年后,但那时你要么已经适应了这个程序,要么你将成为问题的一部分。”听起来不是很有趣,在它可能营造的氛围中,它没有什么巧妙之处,而且没有什么巧妙之处,因为它完全是关于不做某事,而不是仍然需要做的事情,但以一种有趣的方式完成。可能不会有太多的快乐,也许会有一些阻力。
所以,你知道...人们。
方法是根本不输入“R”。但是,引用 B 列单元格的任何公式或宏都会产生引用"R"&B2386
,而不是B2386
引用。在实践中,可能需要做更多的事情,因为“人们”和人们仍然输入一些或很多“R”。类似于总是使用一个IF
来测试前导“R”并输出单元格引用(如果输入了“R”)或连接/连接(如果没有输入)。
但不再需要输入前导“R”,而这正是目标。
无论是谁维护电子表格都必须记住这一点,并最终消除多余的部分(简化事情!),并对有时仍输入“R”的用户施以严厉的惩罚。
所以,有一套方法可以尽可能地让Excel及其相关程序为您完成工作,并且无需任何编程即可达到效果。