【问题标题】:Does Excel VBA allow you to lock only the content of cells, not the cells themselves?Excel VBA 是否允许您仅锁定单元格的内容,而不是单元格本身?
【发布时间】:2015-04-05 00:04:58
【问题描述】:

我需要锁定(使其为只读)我的 VBA 宏中的某些特定单元格。我这样做的方式如下:

Range(Cells(begin_row, begin_column), Cells(final_row, final_column)).Select
If Selection.Locked = True Then
    Selection.Locked = False
End If
ActiveSheet.Protect Contents:=True

它有效,但是我有两个问题:

  1. 看起来,虽然范围(begin_row、final_row)中的行被正确锁定,但该行范围内的列不仅被锁定在范围(begin_column、final_column)中,而且被锁定在其他任何地方。这是奇怪且不受欢迎的,因为用户可能希望将一些数据或评论放在冻结列的右侧。

  2. 列标题可能很长,用户可能想要扩展列,但他不能这样做,因为它已被锁定。所以,我想知道:是否可以只锁定单元格的内容,而让单元格本身可扩展?或者,如果这不可能,如何在VBA或C#中设置单元格宽度(数据实际上是从C#代码中输出的)?

谢谢

【问题讨论】:

    标签: c# excel vba


    【解决方案1】:

    默认情况下,单元格是锁定的 - 这可能会造成混淆。 首先解锁所有单元格, 仅选择要锁定的单元格 然后锁定单元格并保护工作表

    Cells.Select
    Selection.Locked = False
    Selection.FormulaHidden = False
    Range("A1:D16").Select
    Selection.Locked = True
    Selection.FormulaHidden = False
    ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
    

    【讨论】:

      【解决方案2】:

      当然可以!他们只是把所有东西都藏得很好,根本找不到!

      您想查看与 “内容”属性。您可以在 Excel::Protection 下的对象浏览器中找到完整列表。如果手动执行此操作,您将检查的每个单选按钮都有一个。

      属性在您设置内容的逗号分隔列表中更新。所以你可以使用:

      ActiveSheet.Protect AllowFormattingColumns:=True, _
      AllowFormattingRows:=True, Contents:=True
      

      要检查当前状态,请使用“保护”类和同名属性:

      ActiveSheet.Protection.AllowFormattingColumns
      

      顺便说一句,如果您的代码不只是被转述:调用工作簿的某些部分来指定您的工作簿/工作表也是一个好主意。这不是必需的,但是对于一些额外的击键可以为您省去很多麻烦。我尽量做到具体。如果图纸编号永远不会比我指定的图纸索引更改。如果工作簿名称永远不会改变,我也会指定。当我打开其中的 20 个宏并按 F5 时,它可以防止我在错误的工作表上运行宏!您可以走得更远,让 MS 也使用 Option Explicit 为您提供支持,但这是另一个线程的对话。

      您可以将当前工作表声明/设置为顶部的对象,然后在整个过程中使用它:

      Dim ws As WorkSheet
      set ws = ActiveSheet
      

      你的 sn-p 变成了

      Dim ws As WorkSheet
      set ws = ActiveSheet
      'Or better yet set ws = ActiveWorkbook.Sheets(1)'<-- Change your sheet here
      
      ws.Range(Cells(begin_row, begin_column), Cells(final_row, final_column)).Select
      If Selection.Locked = True Then
          Selection.Locked = False
      End If
      
      ws.Protect AllowFormattingColumns:=True, _
          AllowFormattingRows:=True, Contents:=True
      

      祝你好运!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-03-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多