Excel VBA是否允许您locking单元格的内容,而不是单元格本身?

我需要locking(使其只读)一些特定的单元格在我的VBAmacros。 我这样做:

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)中的行正确locking时,该行范围中的列不仅locking在范围(begin_column,final_column)中,而且还locking在其他任何地方。 这是奇怪的和不希望的,因为用户可能想要从冻结的列中放置一些数据或注释。

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

谢谢

单元默认被locking – 这可能会让人困惑。 首先解锁所有单元格,只select要locking的单元格然后locking单元格并保护表单

 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 

当然可以! 他们只是把一切都隐藏起来,不可能find!

你想看看与“内容”属性一起的“AllowFormatting *”属性。 您可以在Excel :: Protection下的对象浏览器中find完整列表。 有一个每个单选button,你会检查,如果这样做手动。

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

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

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

 ActiveSheet.Protection.AllowFormattingColumns 

顺便说一句,如果您的代码不只是解释:当调用工作簿的某些部分来指定您的工作簿/工作表时,也是一个好主意。 这是没有必要的,但一些额外的按键可以为您节省大量的头痛。 我尽可能地具体。 如果工作表编号永远不会比我指定的工作表索引更改。 如果工作簿名称永远不会改变,我也指定。 当我打开其中的20个macros时,它使我无法在错误的表单上运行macros,然后按F5! 你可以走得更远一些,让MS用Option Explicit来支持你,但是这是另一个线程的对话。

你可以声明/设置你当前的工作表为一个对象在顶部,然后在整个使用它,如:

 Dim ws As WorkSheet set ws = ActiveSheet 

和你的片段成为

 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 

祝你好运!