如何从SpinButton控件获取年月数据写入指定单元格并生成目标格式日期
问题解决方法
问题1修复:E2/F2单元格格式显示异常
异常原因
- Excel的日期本质是整数序列号,
1对应1900-01-01,你直接把年份数值2022写入E2,等于存入的是序列号2022,对应的实际日期是1905年的某一天,所以设置yyyy格式后显示1905。 - F2写入的是
Jan/Feb这类文本内容,不是日期序列号,所以设置日期格式不会生效。
修复方案
有两种可选方案,选其一即可:
方案1:保留E2存年份数值、F2存月份文本的逻辑
直接把E2单元格格式设为「常规/数值」,F2单元格格式设为「文本」即可,不要设置日期类格式。
方案2:把E2/F2改为标准日期类型(推荐,方便后续计算)
修改对应VBA代码,写入单元格时生成标准日期值:
- 先把SpinButton的属性设置移到窗体初始化事件,避免每次点击重复赋值,添加如下代码:
Private Sub UserForm_Initialize() SpinButton1.Max = 2030 SpinButton1.Min = 2021 SpinButton1.SmallChange = 1 SpinButton2.Max = 11 SpinButton2.Min = 0 End Sub
- 修改SpinButton2的Change事件,去掉数组赋值文本的逻辑,直接传数值给TextBox2:
Private Sub SpinButton2_Change() TextBox2.Value = SpinButton2.Value + 1 ' 0-11转1-12的标准月份 End Sub
- 修改TextBox1的Change事件,写入标准日期到E2:
Private Sub TextBox1_Change() ' 用当年1月1日的日期值存E2,设置yyyy格式就会正常显示年份 ActiveSheet.Range("E2") = DateSerial(SpinButton1.Value, 1, 1) End Sub
- 修改TextBox2的Change事件,写入标准日期到F2:
Private Sub TextBox2_Change() ' 用选中年月的1日存F2,设mm格式显示数字月份、设mmm显示英文月份缩写 ActiveSheet.Range("F2") = DateSerial(SpinButton1.Value, SpinButton2.Value + 1, 1) End Sub
改完后把E2单元格格式自定义为yyyy,F2自定义为mm/mmm即可正常显示。
问题2修复:G2自动生成指定格式的年月
方法1:用Excel公式实现(无需改VBA,推荐)
如果选了上面的方案2,直接在G2输入公式:
=DATE(YEAR(E2),MONTH(F2),1)
然后把G2单元格自定义格式设为yyyy-mm就能显示2022-05,设为yyyy-mmm就能显示2022-May,年月会跟着E2/F2自动更新。
如果选了方案1(E2是年份数值、F2是月份文本),G2公式改为:
=DATE(E2,MONTH(F2&1),1)
同样设置自定义格式即可。
方法2:用VBA联动赋值
也可以在SpinButton的Change事件最后加一行赋值代码:
ActiveSheet.Range("G2") = Format(DateSerial(SpinButton1.Value, SpinButton2.Value + 1, 1), "yyyy-mm") ' 要mmm格式就把引号里改成yyyy-mmm
内容的提问来源于stack exchange,提问作者DEEK
相关产品推荐
相关产品推荐

