Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 自动小数插入_Excel - Fatal编程技术网

Excel 自动小数插入

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

我对小数点后两位的数字做了很多工作。我的加法器有一个很好的功能,我可以输入像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
当我输入数据时,这已经足够好了,但是如果我从另一个单元格复制数据,如果小数点后有有效数字,它就可以工作,但是如果它是零,它就不能工作。有没有办法判断数据是输入到单元格中还是从剪贴板粘贴出来的?

这个怎么样

    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除以一个分数。这应该比使用字符串操作要快得多,这正是您现在正在做的

同样适用于复制和粘贴(甚至多个单元格)

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


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

我想我必须回答我自己的问题,以便显示我的代码更改,但我将接受您的回答,因为大多数关键元素都在那里。我把它用于编辑和复制/粘贴。诀窍是识别粘贴的时间。我发现我可以在粘贴此行时退出:

If Application.CutCopyMode <> 0 Then Exit Sub
如果Application.CutCopyMode为0,则退出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
Private Sub App_SheetChange(ByVal Sh作为对象,ByVal Source作为范围)
像线一样变暗
作为字符串的Dim-sFormat
将IPO作为整数进行调整
将sDate设置为字符串
将r设置为Excel.Range
错误转到错误处理程序时:
如果InStr(Source.Formula,“=”)大于0,则退出Sub
如果Application.CutCopyMode为0,则退出Sub
sFormat=Source.NumberFormat
首次公开募股=指令(格式为“;”)
如果IPO>0,则sFormat=左(sFormat,IPO-1)
如果仪表(S格式,“0.00”)>0,则
Application.ScreenUpdating=False
Application.EnableEvents=False
对于源中的每个r
如果(IsNumeric(r.Value))和(InStr(r.Formula,”)=0),则
如果(CDbl(r.Value)=四舍五入(CDbl(r.Value)),则
r、 值=r.值/100
如果结束
如果结束
下一个r
Application.EnableEvents=True
Application.ScreenUpdating=True
如果结束
错误处理程序:
App.EnableEvents=True
端接头

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

如果输入是123456,这可以正常工作。它返回1234.56。但是,如果输入值是800,它不会返回8.00,而是返回.08。哦我明白了。我需要在更改值之前将Application.EnableEvents设置为False。我创建了事件处理程序来运行应用程序对象,并将其作为外接程序。我需要测试一下,看看它是否能作为一个插件工作。你完全正确。我忘了我正在操作单元格,这导致了_Change事件再次触发,如果生成的数字是另一个整数,它就会出现错误(然后反复重复,直到它是一个分数)。我已经将代码更新为正确的。所以这对工作表的更改是有效的。我没有成功地让它在应用程序表单更改上工作,我可能需要让它在那里工作,以便在我的工作表上作为加载项普遍可用。我得把我的实验放一段时间,这样我才能做一些其他的事情。如果你能在这方面给我任何建议,我将不胜感激。否则,我会稍后再谈。谢谢,我的错。我当时急急忙忙,没想到您的意思是要捕获工作簿的所有工作表事件并使用此工具。我以前没有创建过外接程序,但我想您可以创建一个侦听器类型的对象,并且每当打开工作簿时,都可以将工作簿添加到一个“侦听器”对象集合中,这些对象将挂接到每个工作簿的工作簿\u SheetChange()事件中。。。嗯……我不能肯定这会奏效,但值得一试。你知道,这真的很有趣。我很想知道您将这些代码放在哪里,以及如何创建外接程序。我要玩玩这个。我熟悉类模块,但不将它们用作外接程序。顺便说一下,它被称为事件,就像你假设的那样。我之所以说“监听器”是因为其他编程语言。我应该早点跟你澄清这一切。如果我找到任何东西,我会发回。我只是想在编辑时自动插入。如果复制单元格块,则不希望对值进行任何更改。事实上,由于大多数时候编辑只发生在一个单元格中,如果源中有多个单元格,则例程应该退出。由于InStr需要字符串和Source.Formula不存在,因此在“If InStr(Source.Formula,=”>0然后退出Sub”的行上引发错误,导致此例程在多个单元格上退出。