检测用户或macros是否更改了单元格
我有一个用户粘贴数字的电子表格,由于这些数字的长度(以及我们不需要使用电子表格来进行任何计算),我们希望它们被格式化为文本,否则它们会显示为科学格式,即1.12345E+13
而不是12345678912345
无法调整/修改数字从中复制的数据源。
我正在使用Private Sub Workbook_SheetChange
做检测,如果相关范围内的单元格已被更改,然后我格式范围文本
ThisWorkbook.Sheets("Sheet1").Columns("B").NumberFormat = "@"
不幸的是,在Excel 2007中,无论您是在Excel中还是通过marco手动执行此操作,该数字仍将显示为1.12345E+13
除非您单击该单元格并按Enter键。
我可以通过应用:
With rng .Value = Evaluate("IF(ISTEXT(" & .Address & "),TRIM(" & .Address & "),REPT(" & .Address & ",1))") End With
但是当我这样做的时候,我最终会遇到一个无限循环,因为Private Sub Workbook_SheetChange
检测到单元格已经被改变并且再次绕着循环。
如果我能够以某种方式确定单元格是由用户还是由macros手动更改的,这将很容易修复。 macros在ThisWorkbook
。 我试过使用Application.Activesheet
而不是ThisWorkbook.Sheets
但没有任何区别。
如果还有更好的方法来修复显示为1.12345E+13
数字,即使我重新格式化了我想知道的单元格。
谢谢。
这是一个完整的例子,包括处理> 1个单元格的目标范围:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) Dim c As Range Application.EnableEvents = False On Error GoTo haveError For Each c In Application.Intersect(Target, Sh.UsedRange).Cells With c If IsNumeric(.Value) Then .NumberFormat = "@" .Value = CStr(.Value) End If End With Next c haveError: 'Make sure to re-enable events! Application.EnableEvents = True End Sub
但是当我这样做的时候,我最终会遇到一个无限循环,因为Private Sub Workbook_SheetChange检测到单元格已经被改变并且再次绕着循环。
这是因为您需要禁用自动触发的应用程序事件。
Private Sub Workbook_SheetChange(ByVal Sh As Worksheet, ByVal Target As Range) Application.EnableEvents = False '// Stop events automatically firing With rng .Value = Evaluate("IF(ISTEXT(" & .Address & "),TRIM(" & .Address & "),REPT(" & .Address & ",1))") End With Application.EnableEvents = True '// Re-enable events for next time End Sub
因为您已禁用事件,所以在更改单元格的值时,不能再次触发自身。 代码完成后,您可以重新启用这些事件,以确保在下次需要时触发事件。
对于什么是值得的,不要辜负自己 – 当人们开始使用excel-vba中的事件过程时,这是一个非常常见的陷阱。
谢谢大家,Application.EnableEvents做了窍门。