I want to embed a procedure in an Excel sheet that will detect when a cell's format changes, e.g. from Text to Number.
But I can't figure out how to get the cell's format type. I tried using the Worksheet_Change
event handler to check the data type, as follows:
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
But with this code in place, if I change cell A1's data type from Number to Text, Worksheet_Change
is not triggered; the event handler is only called if I change the contents of the cell.
Also, this procedure can detect if the contents are changed from a number to an alphabetical string, e.g. from "35.12" to "abcd", but not Number-type number to Text-type number; if I set cell B1 to text, then enter "40", then paste the contents of cell B1 into cell A1, vartype()
still returns "5", so the alert is not triggered.
How can I detect that the format has changed, regardless of whether the content type has changed?
On the Review tab, click Track Changes, and then click Highlight Changes. Select the Track changes while editing. This also shares your workbook check box. Under Highlight which changes, select the When check box, and then in the dropdown list, click the option that you want.
Viewing Changes See the changes that have been made to a workbook by going to the Review tab. Then click the Show Changes button. This will open up a task pane on the right side of the worksheet that has a running list. The list contains all of the changes that have been made in the workbook.
View previous versions of a file Open the file you want to view. Click File > Info > Version history. Select a version to open it in a separate window. If you want to restore a previous version you've opened, select Restore.
Great question!
If you are only looking to trigger an event on the NumberFormat change (you appear to be calling this incorrectly the data format, NumberFormat
is the attribute you want), the following is a good example.
I'm intercepting all selection change events and checking if any NumberFormat changed.
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
I'm not exactly sure what you are looking for, you'll have to modify the print/msgbox statements appropriately. Depending on your use case you may have to modify this slightly but it works in all my test examples.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With