【问题标题】:How to get Excel to change dot for colon when entering time value, VBA输入时间值时如何让Excel更改冒号的点,VBA
【发布时间】:2022-06-10 20:35:34
【问题描述】:

代码是用于证明白痴的时间表。

例如;

  • 输入 0845 更改为正确的时间格式 08:45

  • 输入 8:45 会更改为正确的时间格式 08:45

  • 输入 845 更改为正确的时间格式 08:45

  • 输入了错误的时间值,例如 08:75,会出现一个消息框“您没有输入有效时间”并将值更改回 00:00

以上都正常工作。

我的问题是,我怎样才能让它改变一个'。'例如,如果有人输入 08.45 而不是 08:45,则为 ':'。

    Private Sub Worksheet_Change(ByVal Target As Range)

Dim TimeStr As String

On Error GoTo EndMacro

If Application.Intersect(Target, Range("B5:AC126")) Is Nothing Then

Exit Sub

End If

If Target.Cells.Count > 1 Then

Exit Sub

End If

If Target.Value = "" Or Target.Value < 1 Then

Exit Sub

End If

Application.EnableEvents = False

With Target

If .HasFormula = False Then

Select Case Len(.Value)

Case 1 ' e.g., 1 = 01:00 AM

TimeStr = Left(.Value, 1) & ":00"

Case 2 ' e.g., 12 = 12:00 AM

TimeStr = Left(.Value, 2) & ":00"

Case 3 ' e.g., 735 = 7:35 AM

TimeStr = Left(.Value, 1) & ":" & _

Right(.Value, 2)

Case 4 ' e.g., 1234 = 12:34

TimeStr = Left(.Value, 2) & ":" & _

Right(.Value, 2)

Case 5 ' e.g., 12345 = 1:23:45 NOT 12:03:45

TimeStr = Left(.Value, 1) & ":" & _

Mid(.Value, 2, 2) & ":" & Right(.Value, 2)

Case 6 ' e.g., 123456 = 12:34:56

TimeStr = Left(.Value, 2) & ":" & _

Mid(.Value, 3, 2) & ":" & Right(.Value, 2)

Case Else

Err.Raise 0

End Select

.Value = TimeValue(TimeStr)

End If

End With

Application.EnableEvents = True

Exit Sub

EndMacro:

    If Not (IsDate(MyDate)) Then

        MsgBox "You did not enter a valid time"

    End If

    Application.EnableEvents = True

End Sub

【问题讨论】:

  • 如果您的用户遇到此类问题,我建议您开发一个用户表单来控制数据输入过程,而不是事后尝试更正它。
  • 我想第一步是精确地“允许”哪个输入以及它是如何解释的? 775 应该是 7:45 吗?使用相同的逻辑730 将是 7:18。 7.25 是否应该被视为 7:15? 7,25 也可以吗?
  • 类似于 FunThomas 的问题,输入的 .5 是否等同于 00:30?我不能对罗恩的评论给予足够的支持......除非你想处理麻烦,否则你会想要控制字段,例如,一个小时的字段和一个小时或实际分钟的小部分字段,所以没有关于每个中输入的内容的问题。使用用户表单的方面比简单的输入框更理想,因为您可以请求拆分信息,而不是运行替换/替换/等。在单个字符串上使其成为您想要的样式。
  • 所以允许的输入应该在 700 到 759 之间,并且被视为 07:00 到 07:59。这是代码当前所做的。但是,如果输入 760 到 799,则应显示错误消息并将值设置为 00:00。
  • 类似地,如果输入 7.60 到 7.99,这应该会显示一条错误消息并将值设置为 00:00。 .5 被视为 50 分钟而不是 30 分钟。

标签: excel vba


【解决方案1】:

假设这就像一个人在 0 到 60 之间输入数值一样简单,这里有一个模型可以帮助您入门(未经测试):

sub thisSubRoutine()
thisSubRoutine_restart():
    dim inputValue as long
    inputValue = inputbox("Enter minutes for hour of 0700 between 0 and 60")
    if inputValue > 60 or inputValue < 0 or isnumeric(inputValue) = false then
        msgbox "Invalid entry"
        goto thisSubRoutine_restart
    end if
    'Do something with the data
end sub

这使整个子例程基于错误处理,在向用户发送错误值输入的消息后重新启动子例程。


正在更新新答案...

使用Replace(yourString, ":", "."),例如,

【讨论】:

  • 感谢您的回复!我已经改写了这个问题,因为我意识到这很令人困惑,而且我遇到的问题还不清楚,希望现在更有意义
  • @Scott 更新了答案。请注意,您可以循环遍历要在第二个参数中替换的潜在选项数组,如果您有多个需要更改为小数的项目,这可能会有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-16
相关资源
最近更新 更多