【问题标题】:Auto insert dash in cell value after Input输入后自动在单元格值中插入破折号
【发布时间】:2022-01-27 13:24:38
【问题描述】:

我正在尝试在用户输入后自动向单元格值添加破折号,但每次我测试代码时,我的 excel 都会在显示错误后重新启动。这段代码有什么问题?

我想要实现的是在每 3 个字符后插入破折号 abc123abcde =abc-123-abc-de

Private Sub Worksheet_Change(ByVal Target As Range)

If Selection.Count > 1 Then
    Exit Sub
End If

If Not Intersect(Range("a2:a100"), Target) Is Nothing Then
DLen = Len(Target)

If DLen < 10 Then
Target = Left(Target, 2) & "-" & Right(Target, 4)

ElseIf DLen > 10 Then
'do nothing
MsgBox "more 10"
End If

Target.NumberFormat = "@"

Application.EnableEvents = False
Target = DateV
Application.EnableEvents = True

End If

End Sub

【问题讨论】:

  • Target = Left(... 应该是DateV = Left(...

标签: excel vba


【解决方案1】:

您可以尝试以下方法 - 这至少不会崩溃。我认为当输入的值不是日期时,VBA 遇到了 DateV 的问题。我还将写作拆分为自己的函数,以确保没有无限事件循环。您的目标有点不清楚,因为您的示例文本“abc123abcde”超过 10 个字符,并且会调用 msg 框。如果您尝试生成日期格式,那么您将需要更多的错误处理和解析设备以允许用户输入非标准格式。如果你真的只是想在每第三个字母添加一个破折号,那么建议使用像'for i = 1 to len(target)'这样的循环

Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo Kill
If Selection.Count > 1 Then
    Exit Sub
End If

If Not Intersect(Range("a2:a100"), Target) Is Nothing Then
DLen = Len(Target)

If DLen < 10 Then
TargetVal = Left(Target, 2) & "-" & Right(Target, 4)

ElseIf DLen > 10 Then
'do nothing
MsgBox "more 10"
End If

Application.EnableEvents = False
Call WriteDateV(Target, TargetVal)
Application.EnableEvents = True
Exit Sub
End If

Kill:
Exit Sub

End Sub

Private Sub WriteDateV(TargCell As Range, TargetVal As Variant)
On Error GoTo Kill

Application.EnableEvents = False

TargCell.Value = TargetVal
TargCell.NumberFormat = "@"

Application.EnableEvents = True

Kill:
Exit Sub

End Sub

【讨论】:

    猜你喜欢
    • 2021-04-07
    • 1970-01-01
    • 2020-09-19
    • 1970-01-01
    • 2019-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多