我想在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”,但不是Number-type number到Text-type number;如果我将单元格B1设置为文本,然后输入“40”,然后将单元格B1的内容粘贴到单元格A1中,vartype()
仍然返回“5”,因此不会触发警报。
无论内容类型是否已更改,我如何检测格式是否已更改?
答案 0 :(得分:2)
很棒的问题!
如果您只是想要触发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语句。根据您的使用情况,您可能需要稍微修改它,但它适用于我的所有测试示例。
答案 1 :(得分:1)
当单元格格式类型发生更改时,似乎没有触发事件。
然而,我从另一个论坛网站获得了这个信息。
要在不使用宏的情况下编辑单元格格式,必须选择单元格(通过左键单击,然后单击图标或右键单击)。因此,使用工作表SelectionChanged,每当选择一个单元格时,您可以获取该单元格的格式和地址,并检查前一个单元格的地址和格式VS前一个单元格的格式。因此,如果前一个单元格的格式现在与上次捕获的格式不同,则它已被更改。
您可以将此与变更事件结合使用,以查看格式是否已在现在(单元格内容更改后)和选择单元格之间进行了更改。
这里是其他论坛的链接,因为我不能声称这是我自己的发明: http://www.mrexcel.com/forum/excel-questions/3704-calculate-format-change.html
答案 2 :(得分:0)
基于this response on 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