我的问题与这里提出的问题非常相似: Excel 根据值或通过“条件格式”进行动态“合并和居中”
但在这种情况下我希望行结构:)
第 1 行包含日期,第 2 行中我想在每个月的中间(或大约第 15 天)显示月份名称或月份数。我不想使用“合并和居中”这种困难的方式(手动)完成此操作,而是想要一个使用条件格式的动态系统。
用户 adamV (https://superuser.com/users/15903/adamv) 就如何在列中执行此操作给出了很好的答案。如果您能帮助我提供这次在行结构中执行此操作所需的公式,我将不胜感激。
非常感谢你 : )
答案1
虽然不是很优雅,但是可以达到目的。
如果你满足于
- 将月份的单个字母放在不同的单元格中(使用
MID
函数) - 某些月份的字母序列并不完全居中。
- 未合并的解决方案。(从好的方面来说更好)
这是我的无需 VBA解决思路。
假设您使用的是"mmm-yy"
包含 6 个字符的格式,例如Jan-20
。您可以将J
放在日期中13th
,将 a 放在14th, ..., 0
放在日期中,并将其余部分18th
用作,即""
如图所示:IF(AND(DAY(Q2)>12;DAY(Q2)<19);MID(TEXT(Q2;"aaa-yy");DAY(Q2)-12;1);"")
月份信息写在每格13-to-18th
单个日期之间letter/number
我进一步详细阐述了这个问题,并展示了周数应该(几乎)写在组成一周的七个单元格的中间。
为了实现这一点,我创建了包含周数的字符串,如果周数是一位或两位数,则包含三个前导空格;如果周数超过两位数,则包含两个前导空格。
REPT(" ";3-INT(LOG(L4;100)))&TEXT(L4;"###")
其中日期的周数是在辅助行中获得的,也就是4th
此处的行。在第五行,从日期中提取出星期几以供MID
公式使用。
可选地,这些以字符串形式获取的数字可以转换回数值。
该公式的最终形式为:
MID( REPT(" ";3-INT(LOG(L4;100)))&TEXT(L4;"###") ;L5;1)
如图所示:每周的数字几乎都写在中间的单元格中
然后,您可以使用条件格式来创建视觉辅助工具,将表格划分为区域。
在下面共享的文件中,还添加了全局开始和结束日期,这样只要将行中的公式复制到足够数量的列中,就可以动态更改表格。(示例文件中涵盖了 4 个月)
请注意,在某个时候,避免在程序中使用本地设置是非常令人沮丧的。因此,插图包含月份的土耳其语名称,Ocak
是土耳其语。January
Şubat
February
这是示例工作表文件。
希望能帮助到你。
答案2
编辑:
完成这个后,我突然想到了一个主意。当然。您可以使用公式在所需的单元格中获得所需的结果,而不是下意识地IF()
用“”结尾以显示空单元格,而是让所有失败的结果都为“MMM”(我以前认为“KKK”是最好的,因为我永远不会在电子表格中遇到它作为真正的条目,所以我永远不必担心下面的内容会造成问题,但后来我的老板与某人分享了一个电子表格......风扇把东西喷得到处都是......现在我使用“MMM”来表示这个!)
然后,复制整行、每个单元格,并粘贴|特殊|值,这样现在您就有大约 30 个单元格,每个月都有“MMM”,每个月都有一个正确的结果。最后,使用将Find and Replace
所有“MMM”条目替换为空单元格。现在,由于除了右侧单元格之外,其他单元格中都没有值,因此它们的字符串可以根据需要左右溢出,以正确显示。(请确保将它们格式化为单元格居中,以便它们可以向两个方向溢出,并且每个月看起来仍然居中。
天哪……我一直推荐简单的手工(如下),因为低技术方法并不总是值得嘲笑的,很多时候要容易得多。完全忘记了我的一个老爱好。也许是因为我通常把它与数据工作联系在一起,但这不是模拟衰老的借口。
因此,公式应该测试是否是二月,如果不是二月,则在月份 15 号下方的单元格中得出结果(有时不是 16 号,因为您在另一个问题中提到您期望的是 15 号,而人们可能会认为“居中”表示 31 天月份的 16 号),对于二月,它应该只测试该月有多少天(闰年将报告 29,因此无需进行复杂的测试即可捕获它们),如果是 28,则将结果放在 14 号下方的单元格中,对于 29,则将其放在 15 号下方的单元格中。就是这样,然后复制并粘贴|特殊|值,最后Find and Replace
清空包含“MMM”的单元格,您就完成了。
使用如下公式:
=IF( MONTH(A1)=2, IF( DAY( EOMONTH(A1,0) )=29, IF( DAY(A1)=15, TEXT(A1,"Mmm-yy"),"MMM"), IF( DAY(A1)=14, TEXT(A1,"Mmm-yy"), "MMM")), IF( DAY(A1)=15, TEXT(A1,"Mmm-yy"), "MMM"))
(为了便于操作,我在这里和那里放置了两个空格,Find and Replace
没有任何内容可以删除它们。)
这将测试月份 = 2(二月),如果是,则使用EOMONTH()
“0”表示月份数,因此可以说它正在检查“当前”月份。如果是 29(闰年),则测试日期是否为 15 日,如果是,则给出所需结果,如果不是,则给出“MMM”,然后退出。如果不符合 29 的想法,则检查日期是否为 14 日并执行相同的操作。最后,如果月份不是 2,则跳过所有这些并转到最后一点,测试日期 = 15。
通过使用巧妙的测试分组,人们可能会巧妙地减少这一时间AND()
,但是……它不会用到 300,000 行,并永远拖慢电子表格的速度!不会超过 16384 列,是吗?然后转向常量,而不是公式,其中 29/20 被清除。所以这样就没问题了。另一个可能的改进是测试月份是否不是 2,并在那里添加最后的子句,然后继续测试它是否是 2 月份。这会使公式更清晰,嗯,真的,任何人都可以衡量……
以下内容仍然是正确的,并且可能某一天会对某些人有所帮助,所以我将保留它。
基本问题是,您必须将公式放入相关行的单元格中,以测试它是否是显示输出的正确单元格。但如果您不想以不同的方式手动操作,那就意味着要测试所有单元格。
请注意,您可以手工完成一年的工作(放置一个显示所需月份年份的公式,将其置于单元格的中心,以便根据需要左右溢出以显示其全文,每个月只需一个公式,然后再复制并粘贴三个,调整闰年的那个,然后复制这四年的单元格并粘贴到第 1 行的接下来的四年下,冲洗并重复,或者更巧妙地复制这八年,然后粘贴,复制 16 年并粘贴......快速填满一大堆年份。
不过,继续吧,因为你想要一些不需要手工操作的东西。为什么第 2 行的所有单元格都有公式测试来查看它们是否能成为本月的真正男孩很重要?因为如果左右单元格都被占用,获胜的结果就不能从其自己的单元格中左右溢出。而且列太窄,无法显示完整的“Jan-20”……除非你想加宽它们。所以你可能会看到“n-2”或“an-2”或其他什么,但看不到完整的文本。
如果每个单元格中没有公式,则无法自动在正确的单元格中获得结果。但是如果每个单元格中都有公式(并且第 1 行的宽度限制似乎允许这样做),则无法显示正确单元格的完整输出。公式帮不了你。
你知道,除非我描述的那一点点手工活,也许五分钟就可以了。
所以你必须用宏来做这件事。宏可以从 A1 开始,测试数值,确定月份,计算出该月份有多少天,除以二,然后四舍五入,得到除二月之外每个月的 15(闰年除外(可以被四整除,因此每次滚动时都可以轻松测试二月,至少到 2400 年为止))...
因此,宏基本上可以测试每个月的日期,或者测试一个日期,然后按照您给出的模式,循环 12 个月(起始月份无关紧要,它们仍然以 4 月 12 日到 3 月或其他月份为周期),输入所需的值或公式,这样您甚至不必在除二月之外的每个月 15 日的单元格中列出值列表。然后,它可以快速返回测试闰年,并将二月也移到 15 日……或者……一旦有了第一个闰年,它就可以向右移动 1,460 个单元格左右,删除 14 日的条目,向右移动并将其输入到 15 日,然后再次跳转,等等。
即使只具备少量 VBA 技能,您也应该能够编写该代码。而且,手工编写该代码最多只需 5 分钟。