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

Excel 防止自动将格式从常规更改为例如百分比,excel,Excel,我的电子表格已锁定,因此用户可以编辑值,但不能更改单元格的格式。单元格的类型为“general”,但存在数据验证以确保输入为数字 尽管有锁定功能,但仍可以通过输入特定值来更改单元格的格式。例如,输入4%将格式更改为百分比,输入4英镑将类型更改为货币等 我想防止出现这种情况,因为a)单元格的存储值可能已更改,例如0.04而不是4;b)用户现在不可能重新更改格式 我可以通过将单元格类型设置为数字而不是常规来防止这种情况。然而,这也是不可取的,因为它将我与显示固定小数位数联系在一起。我希望将“4”和“

我的电子表格已锁定,因此用户可以编辑值,但不能更改单元格的格式。单元格的类型为“general”,但存在数据验证以确保输入为数字

尽管有锁定功能,但仍可以通过输入特定值来更改单元格的格式。例如,输入4%将格式更改为百分比,输入4英镑将类型更改为货币等

我想防止出现这种情况,因为a)单元格的存储值可能已更改,例如0.04而不是4;b)用户现在不可能重新更改格式

我可以通过将单元格类型设置为数字而不是常规来防止这种情况。然而,这也是不可取的,因为它将我与显示固定小数位数联系在一起。我希望将“4”和“4.256”都显示为这样,而且似乎没有一种方法可以做到这一点,即不在前者(4.00)中添加尾随零或在后者(4.26)中舍入


请有人告诉我如何防止自动格式更改,或者如果无法防止,请告诉我如何设置符合我要求的数字格式。

在工作表事件处理中使用此宏:

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

在IMO中,实现这一点的唯一方法是使用宏将格式重置为原始状态

打开VBA编辑器(All-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
选项显式

Private Const mcStrPasswort As String=“”我们得出结论,这是不可能的。(请注意,问题是如何防止这种行为,而不是在用户做出更改后立即恢复更改。运行宏会擦除撤消堆栈,因此这不是可行的解决方法。)

您是否考虑过将格式设置为
Text
?您可以使用宏在事后重新更正格式。您可以使用设置单元格类型。。无论采用哪种方式,使用excel gui/编程,我想最好的方法是使用一个提供msgbox的宏,至少它不会擦除撤消堆栈,人们也不太可能意外地这样做。如果不是Application.Intersect(MyCell,Range(Target.Address)),则什么都不是,然后
检测到单元格更改,然后,如果数字格式为general,则可以执行msgbox操作,撤消堆栈将保持不变。