如何检测单元格格式的变化?

我想在Excel工作表中嵌入一个过程,该过程将检测单元格的格式如何变化,例如从文本到数字。

但我无法弄清楚如何获取单元格的格式类型。 我尝试使用Worksheet_Change事件处理程序来检查数据类型,如下所示:

Private Sub worksheet_change(ByVal Target As Range)

If Target.Address = "a1" Then
    If VarType(Target) <> 5 Then
        MsgBox "cell format has been changed"
    End If
End If


End Sub

但是,使用此代码时,如果将单元格A1的数据类型从Number更改为Text,则不会触发Worksheet_Change ; 如果我更改单元格的内容,则仅调用事件处理程序。

此外,这个程序可以检测内容是否从一个数字改变为一个字母字符串,例如从“35.12”到“abcd”,但不是数字型号码到文本型号码; 如果我将单元格B1设置为文本,则输入“40”,然后将单元格B1的内容粘贴到单元格A1中, vartype()仍然返回“5”,以便不触发警报。

无论内容类型是否更改,如何检测格式已更改?


伟大的问题!

如果您只是想要触发NumberFormat变更事件(您似乎错误地调用了数据格式, NumberFormat是您想要的属性),以下是一个很好的例子。

我拦截所有选择更改事件并检查是否有任何NumberFormat已更改。

Option Explicit

'keep track of the previous
Public m_numberFormatDictionary As New dictionary
Public m_previousRange As Range

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    'requires reference to Microsoft Scripting Runtime

    Dim c As Variant
    Dim wasChange As Boolean


    Debug.Print "***********************"

    'make sure you had a previous selection and it was initialized
    If m_numberFormatDictionary.Count > 0 And Not m_previousRange Is Nothing Then

        'Iterate through all your previous formattings and see if they are the same
        For Each c In m_previousRange
            Debug.Print "Found " & c.NumberFormat & " in " & c.Address
            Debug.Print "Stored value is " & m_numberFormatDictionary(c.Address) & " in " & c.Address

            'print out when they are different
            If c.NumberFormat <> m_numberFormatDictionary(c.Address) Then
                Debug.Print "~~~~~~ Different ~~~~~~"
                wasChange = True
            End If

        Next c
    End If

    'clear previous values
    m_numberFormatDictionary.RemoveAll

    'Make sure you don't error out Excel by checking a million things
    If Target.Cells.Count < 1000 Then

        'Add each cell format back into the previous formatting
        For Each c In Target
            Debug.Print "Adding " & c.NumberFormat & " to " & c.Address
            m_numberFormatDictionary.Add c.Address, c.NumberFormat
        Next c

        'reset the range to what you just selected
        Set m_previousRange = Target
    End If

    'simple prompt now, not sure what your use case is
    If wasChange Then
        MsgBox "There was at least one change!"
    End If

End Sub

我不确定你在找什么,你必须适当修改print / msgbox语句。 根据您的使用情况,您可能需要略微修改,但它适用于我所有的测试示例。


当单元格格式类型改变时,似乎没有发生事件。

但是,我从另一个论坛网站获得了此信息。

要编辑单元格格式而不使用宏,必须选择单元格(通过左键单击然后单击图标或右键单击)。 因此,使用工作表SelectionChanged,无论何时选择一个单元格,您都可以获取该单元格的格式和地址,以及检查前一个单元格的地址和格式以及之前单元格的格式。 因此,如果前一个单元格的格式与上次捕获的格式不同,则它已更改。

您可以将此与变化事件结合使用,以查看格式是否在现在(单元格内容发生更改之后)和单元格被选中之间进行了更改。

这里是另一个论坛的链接,因为我不能声称这是我自己的发明:http://www.mrexcel.com/forum/excel-questions/3704-calculate-format-change.html


基于StackOverflow上的这个响应,这里有一些代码可能适用于您,假设更改将由用户生成,并且所选范围在更改后将发生变化...

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    Static LastRange As Range
    Static LastNumberFormat As String

    If Not LastRange Is Nothing Then
        If LastRange.Cells(1).NumberFormat <> LastNumberFormat Then
            'Your action or message box notification goes here
        End If
    End If

    Set LastRange = Target
    LastNumberFormat = Target.NumberFormat

End Sub
链接地址: http://www.djcxy.com/p/18797.html

上一篇: How to detect changes in cell format?

下一篇: Random numbers keep coming out the same, despite random seed being used