防止自动将格式从常规更改为例如百分比。

6
我的电子表格已被锁定,以便用户可以编辑值,但不能更改单元格的格式。这些单元格类型为“通用”,但有数据验证以确保输入是数字。
尽管进行了锁定,但通过输入特定的值仍然可以更改单元格的格式。例如,输入4%会将格式更改为百分比,输入£4会将类型更改为货币等。
我想要防止这种情况发生,因为a)单元格的存储值可能已更改,例如0.04而不是4,b)现在用户无法更改格式回来。
我可以通过将单元格类型设置为数字而不是通用来防止这种情况发生。然而,这也是不可取的,因为它会将我与显示固定小数位数联系起来。我想要同时将“4”和“4.256”显示为这样,似乎没有一种方法可做到这一点,而不是在前者(4.00)中添加尾随零或将后者(4.26)四舍五入。
请问有人能告诉我如何防止自动格式更改,或者失败时如何设置符合我的要求的数字格式?

4
你考虑过将格式设置为“文本”吗? - Tim Williams
您可以使用宏在事后重新纠正格式。 - Gary's Student
你可以使用Excel GUI/编程方式来设置单元格类型。 - sampopes
3个回答

1
我们得出结论,这是不可能的。(请注意问题是如何“预防”这种行为,而不是在用户进行更改后立即恢复更改。运行宏会清除撤销堆栈,因此这不是可行的解决方法。)

我认为最好的方法是使用宏来显示一个消息框,这样就不会清除撤销栈,人们也不太可能意外执行该操作。 - Some_Guy
如果不是应用程序交叉(MyCell, Range(Target.Address))为空,则检测单元格更改,然后您可以执行if数字格式<>常规,那么msgbox something,撤消堆栈将保持完好。 - Some_Guy

1
我认为实现这个的唯一方式是使用一个重置格式到原始状态的宏。

打开VBA编辑器(全部-F11),双击你想要有此功能的工作表。

然后把以下代码粘贴到主窗口中:

Option Explicit

Private Const mcStrPasswort As String = "" '<---Change to your password

Private mStrFormat As String

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim blnProtected As Boolean
    If mStrFormat = "" Then mStrFormat = "General"
    If Me.ProtectContents Then
        blnProtected = True
        Me.Unprotect mcStrPasswort
    Else
        blnProtected = False
    End If

    Target.NumberFormat = mStrFormat

    If blnProtected Then
        Me.Protect mcStrPasswort
    End If
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    mStrFormat = Target.Cells(1, 1).NumberFormat
End Sub

完成!


0

在您的工作表事件处理程序中使用此宏:

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
Dim ChangedCells As Range
Dim NextChangedCell As Range
Dim Temp As String

Set ChangedCells = Intersect(Target, Range("A1:A5")) ' or you can specify any other range to be monitored for changes

If Not ChangedCells Is Nothing Then
Application.EnableEvents = False
For Each NextChangedCell In ChangedCells
    Temp = NextChangedCell.Formula
    NextChangedCell.NumberFormat = "General" ' or you can specify any other format to be forced on cells
    NextChangedCell.Value = Temp
Next NextChangedCell
Application.EnableEvents = True
End If

End Sub

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接