仅通过输入日期 (jj) 填写日期 (jj/mm/yyyy)
Posted
技术标签:
【中文标题】仅通过输入日期 (jj) 填写日期 (jj/mm/yyyy)【英文标题】:Fill date (jj/mm/yyyy) only by entering the day (jj) 【发布时间】:2019-03-19 17:14:40 【问题描述】:我有 12 个月的 12 张工作表,每个月的日期都是随机的,要手动输入 A 列。我们以 1 月份为例:
当我在单元格 A1 中输入数字 25 时,我希望单元格自动返回 25/01/2019 在 A1 (!) 中(或 2019 年 1 月 25 日,如您所愿)。据我所知,即使使用自定义设置,Excel 自动填充功能也无法做到这一点,所以我猜:VBA?
我认为代码应该是这样的(带有更改事件):
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rng As Range, cell As Range
Set rng = Range("A:A")
If Not Application.Intersect(rng, Range(Target.Address)) _
Is Nothing Then
'???
'If cell entered in range is a number Then
'change value to "number" & "/01/2019"
End If
End Sub
这就是我所在的地方。我很确定这对于使用月份并输入许多日期的人来说可能是一段有用的代码。我离真相还远吗?它甚至可以吗?我知道这可能比听起来更复杂。
【问题讨论】:
VBA 应该在哪里找到年份? 可以从给定的单元格中引用它吗?诸如“键入的数字”和“月份的单元格引用(例如 1)”和“年份的单元格引用(例如 2019)”之类的东西。我对 vba 很陌生,所以除了逻辑之外,我不能说它是否真的可以实现。 你刚刚放弃了my answer 到同一个question 你之前问过:) 吗? 哦。我实际上忘记了我已经发布了!你可以看到我错过了多少这个功能。的确,由于我的基本技能,我无法弄清楚您的答案,并且无法克服一些错误。 【参考方案1】:试试
If Target.value2 > 0 and Target.value2 <= 31 Then
Target.Value2 = dateSerial(year(now), month(now), Target.Value2)
End If
【讨论】:
【参考方案2】:Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim AffectedRange As Range
Set AffectedRange = Application.Intersect(Me.Range("A:A"), Target)
If Not AffectedRange Is Nothing Then
Dim Cell As Range
For Each Cell In AffectedRange.Cells
If Cell.Value >= 1 And Cell.Value <= 31 Then
Application.EnableEvents = False
Cell.Value = DateSerial(2019, 1, Cell.Value)
Cell.NumberFormat = "YYYY-MM-DD"
Application.EnableEvents = True
End If
Next Cell
End If
End Sub
【讨论】:
对不起,你不是在硬编码这个月吗?它不应该从工作表索引、名称或其他内容中花费一个月吗? 令人印象深刻。我同意@Damian,这可以提高与我不同需求的用户的灵活性,但这是一个很好的开始。此外,当我更改工作表中的另一个单元格时,宏在 => If Not AffectedRange Then 行出现错误。知道为什么它会影响 "A:A" 之外的范围吗? 如果我可以建议一种简化方式 -Target.Parent
与 Me
相同。
@Damian 是的,我对月份进行了硬编码,我认为这个想法很清楚,而 OP 对工作表的命名方式也不清楚。所以我决定就这样离开它。
@BigBen 是的,当然这也是有道理的;)以上是关于仅通过输入日期 (jj) 填写日期 (jj/mm/yyyy)的主要内容,如果未能解决你的问题,请参考以下文章