2013-10-22 97 views
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 

此作品不夠好,當我輸入數據,但如果我從另一個單元格複製數據,它的工作原理,如果有小數點後顯著數字,但如果它不是零。有沒有辦法判斷數據是否被輸入到單元格中,或者是否從剪貼板粘貼了數據?

回答

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即可。這應該比使用字符串操作更快,這就是您現在正在做的事情。

適用於複製和粘貼(甚至多個單元格)。

順便說一下,您需要將其添加到每個希望發生這種情況的工作表。

編輯:更新的代碼是在工作簿級別

+0

如果輸入是123456,這可以正常工作。它返回1234.56。但是,如果輸入爲800,則不返回8.00,則返回0.08。哦。我明白爲什麼。我需要在更改值之前將Application.EnableEvents設置爲False。我創建了我的事件處理程序來運行應用程序對象,並將其作爲加載項。我需要對此進行測試,看看它是否可以用作加載項。 – jrodenhi

+0

你是對的。我忘記了我在操縱單元格,導致_Change事件再次觸發,如果結果數字是另一個整數(然後反覆重複,直到它是一個分數),它會出現一個錯誤。我已經更新了代碼是正確的。 –

+0

所以這對Worksheet_Change起作用。我沒有成功使它在Application_SheetChange上工作,我可能需要它在那裏工作,以便使它在我的工作表上作爲加載項一般可用。我必須離開我的實驗一段時間,以便我可以完成其他一些事情。如果你能在這方面給我任何建議,我將不勝感激。否則,我會在稍後再回來。謝謝。 – jrodenhi

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 

這是一個事件處理程序(它被稱爲Excel中的一個監聽器?)的App_SheetChange事件。我把這段代碼放在類模塊中,儘管我現在還不確定它是否需要這樣做。我保存了該文件,然後選擇它作爲Excel選項中的加載項,但我可能需要努力一點來記住我是如何做到這一點的。然後,我選擇了插件,並且現在,在您的幫助下,我開始工作。謝謝你,@ joseph4tw。在我的版本中,我還有一些代碼可以將斜槓放在日期中,因此您不必這樣做,但是現在需要通過這些改進來測試代碼,以確定它是否有效。

+0

你知道,這真的很有趣。我很想知道你把這些代碼放在哪裏以及你是如何創建一個加載項的。我打算玩這個。我熟悉類模塊,但不使用它們作爲加載項。順便說一下,它被稱爲你喜歡的事件。我說「聽衆」是因爲其他編程語言。我應該先與你們澄清一下。如果我找到任何內容,我會回覆。 –

+0

我剛想到我只想在編輯時發生自動插入。如果我複製一個單元格塊,我不希望對這些值進行任何更改。事實上,由於大多數情況下編輯只發生在一個單元中,如果源中有多個單元格,則該例程應該退出。由於InStr(Source.Formula,「=」)> 0 Then Exit Sub「的線上出現錯誤,因此此例程退出多個單元格,因爲InStr期待一個字符串,而Source.Formula不會」不存在。 – jrodenhi