检测用户或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做了窍门。