gpt4 book ai didi

vba - 检测单元格是否已被用户或宏更改

转载 作者:行者123 更新时间:2023-12-02 13:45:27 25 4
gpt4 key购买 nike

我有一个电子表格,用户可以在其中粘贴数字,由于这些数字的长度(并且我们不需要电子表格来对它们进行任何计算),我们希望将它们格式化为文本,否则它们以科学格式显示,即 1.12345E+13 而不是 12345678912345

无法调整/修改从中复制数字的数据源。

我正在使用 Private Sub Workbook_SheetChange 检测相关范围中的单元格是否已更改,然后使用

将范围格式化为文本
ThisWorkbook.Sheets("Sheet1").Columns("B").NumberFormat = "@"

不幸的是,在 Excel 2007 上,无论您是在 Excel 中手动执行此操作还是通过宏执行此操作,数字仍然显示为 1.12345E+13,除非您单击单元格并按 Enter 键。

我可以通过申请来解决这个问题:

With rng
.Value = Evaluate("IF(ISTEXT(" & .Address & "),TRIM(" & .Address & "),REPT(" & .Address & ",1))")
End With

但是当我这样做时,我最终会陷入无限循环,因为 Private Sub Workbook_SheetChange 检测到单元格已更改并再次循环。

如果我能以某种方式确定单元格是否已由用户或宏手动更改,那么这将很容易修复。该宏位于 ThisWorkbook 中。我尝试使用 Application.Activesheet 而不是 ThisWorkbook.Sheets 但没有任何区别。

如果有一种更简单/更好的方法来修复显示为 1.12345E+13 的数字,即使我重新格式化了单元格,我很想知道它。

谢谢。

最佳答案

but when I do this I end up with an infinite loop, as the Private Sub Workbook_SheetChange detects the cell has been changed and goes round the loop again.

这是因为您需要禁用应用程序事件自动触发。

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

由于您已禁用这些事件,因此当您更改单元格的值时,它无法再次自行触发。代码完成后,您可以重新启用事件以确保它在下次需要时触发。

不管它的值(value)如何,不要为此自责 - 当人们开始使用 中的事件过程时,这是一个极其常见的陷阱。 .

关于vba - 检测单元格是否已被用户或宏更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34685504/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com