0

我对小数点后两位的数字做了很多工作。我的加法机有一个很好的功能,我可以输入一串数字,比如 123456,它会自动为我插入小数点并将其显示为 1234.56。Excel 在高级选项下有一个功能,可以自动输入小数,但它是一个全局选项,所以没有它可能的帮助。因此,我为App_SheetChange事件处理程序设置了一些 VBA 代码,它将仅在格式化为显示带两位小数的数字的单元格上为我执行此操作。这样,我就不会得到我不想要的小数。代码非常简单。它看起来像这样:

  If InStr(sFormat, "0.00") > 0 Then
    If InStr(".", Source.Formula) = 0 Then
      If IsNumeric(Source.Formula) Then
        s = "00" & Source.Formula
        s = Left(s, Len(s) - 2) & "." & Right(s, 2)
        App.EnableEvents = False
        Source.Formula = CDbl(s)
        App.EnableEvents = True
      End If
    End If
  End If

当我输入数据时,这工作得很好,但是如果我从另一个单元格复制数据,如果小数点后有有效数字,但如果它是零,它就可以工作。有没有办法判断数据是输入到单元格中还是从剪贴板粘贴?

4

2 回答 2

1

我想我必须回答我自己的问题,以便我可以显示我的代码更改,但我会接受你的回答,因为大多数关键元素都在那里。我得到了这个用于编辑和复制/粘贴的工作。诀窍是在粘贴时识别。我发现当我用这条线粘贴时我可以退出:

If Application.CutCopyMode <> 0 Then Exit Sub

这是代码:

Private Sub App_SheetChange(ByVal Sh As Object, ByVal Source As Range)
Dim s As String
Dim sFormat As String
Dim iPos As Integer
Dim sDate As String
Dim r As Excel.Range
  On Error GoTo ErrHandler:
  If InStr(Source.Formula, "=") > 0 Then Exit Sub
  If Application.CutCopyMode <> 0 Then Exit Sub
  sFormat = Source.NumberFormat
  iPos = InStr(sFormat, ";")
  If iPos > 0 Then sFormat = Left(sFormat, iPos - 1)
  If InStr(sFormat, "0.00") > 0 Then
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    For Each r In Source
        If (IsNumeric(r.Value)) And (InStr(r.Formula, ".") = 0) Then
            If (CDbl(r.Value) = Round(CDbl(r.Value))) Then
                r.Value = r.Value / 100
            End If
        End If
    Next r
    Application.EnableEvents = True
    Application.ScreenUpdating = True
  End If
ErrHandler:
    App.EnableEvents = True
End Sub

这是 App_SheetChange 事件的事件处理程序(在 Excel 中是否称为侦听器?)。我把这段代码放在一个类模块中,虽然我现在不确定是否需要这样做。我保存了该文件,然后在 Excel 选项中将其选为加载项,但我可能需要花一点时间来记住我是如何做到的。然后我刚刚选择了该加载项处于活动状态,现在,在您的帮助下,我让它工作了。谢谢你,@joseph4tw。在我的版本中,我还有一些代码可以将斜杠放在日期中,因此您不必这样做,但我现在需要通过这些改进来测试该代码,看看它是否有效。

于 2013-10-22T23:03:55.920 回答
1

这个怎么样?

    Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    Dim r As Excel.Range

    Application.ScreenUpdating = False
    Application.EnableEvents = False
    For Each r In Target
        If (IsNumeric(r.Value)) Then
            If (CDbl(r.Value) = Round(CDbl(r.Value))) Then
                r.Value = r.Value / 100
            End If
        End If
    Next r
    Application.EnableEvents = True
    Application.ScreenUpdating = True
End Sub

这将检查单元格是否为数字,如果是,则检查它是否为整数。如果是,则将其除以 100。这应该比使用字符串操作(这就是您现在正在做的)快得多。

也适用于复制和粘贴(甚至是多个单元格)。

顺便说一句,您需要将此添加到您希望发生这种情况的每张工作表中。

编辑:将代码更新为工作簿级别

于 2013-10-22T17:06:41.663 回答