VBA代码知识

1 /* 如何禁止掉 excel 取消隐藏工作表的功能 */
2 Worksheets("测试用例").Visible = xlSheetHidden 和 Worksheets("测试用例").Visible = xlSheetVeryHidden 都是将名为 "测试用例" 的工作表隐藏起来,但它们有以下几点区别:
3 
4 xlSheetHidden 隐藏的工作表可以通过在工作簿中右键单击选项卡(或 “格式” -> “工作表”)打开“取消隐藏”选项菜单再次显示出来;而 xlSheetVeryHidden 隐藏的工作表只能通过 VBA 代码修改 Visible 属性才能重新显现出来。
5 
6 在工作簿中查看所有工作表的列表时,被设置为 xlSheetHidden 状态的工作表会以灰色选项卡形式存在,表示该工作表已经被隐藏;而 xlSheetVeryHidden 状态的工作表则不会在列表中出现,只有通过 VBA 代码才能操作它们。
7 
8 所以如果需要完全隐藏一个工作表,使其不能被恢复,建议使用 xlSheetVeryHidden。如果想只是暂时隐藏一个工作表,可以使用 xlSheetHidden。

 

1 /* 与禁止掉 excel 鼠标调整行高的工作表功能 */
2 "Worksheet_Change""Worksheet_SelectionChange"是Excel VBA中的两个事件处理程序,它们针对工作表中的改变和选定操作。
3 
4 "Worksheet_Change"事件会在工作表中发生更改时触发。当用户在工作表中更改了单元格的内容、格式或其他属性时,就会自动激活这个事件。您可以编写VBA代码以响应这个事件并在工作表更改后执行特定的任务。例如,您可以向单元格插入值之后自动更新某些单元格的公式计算结果。
5 
6 "Worksheet_SelectionChange"事件则在选择区域更改时触发。当用户在工作表中移动光标来选择不同的单元格或区域时,就会自动激活此事件。与"Worksheet_Change"类似,您也可以编写VBA代码以响应此事件并在选择更改后执行特定的任务。
7 
8 简而言之,在工作表中更改内容时,触发“Worksheet_Change”事件;在选择更改时(包括单元格、行、列等),触发“Worksheet_SelectionChange”事件。

 

1 /* Worksheet_Change 和 Worksheet_SelectionChange能同时定义在一个对象工作表吗? */
2 
3 是的,"Worksheet_Change""Worksheet_SelectionChange"事件处理程序都可以定义在同一个工作表对象中。这意味着当用户更改单元格内容或选择不同单元格时,两个事件处理程序都将被激活。

 

1 如果您想要捕获用户调整行高的行为并进行相应的操作,您可以尝试使用Worksheet_BeforeDoubleClick事件或Worksheet_BeforeRightClick事件来检测用户双击或右击选定行或列边界时所采取的操作,例如:
2 
3 这些事件可以在用户双击或右键单击工作表中的单元格时被触发,并可以检查是否针对第二行进行的操作,如果是,则取消此操作并弹出相应的提示消息给用户。但需要注意的是,在这些事件中,我们只能监控到用户通过右键菜单、双击等方式操作第二行的情况,如果用户通过其他方式来调整第二行的行高,则无法被我们所捕获和处理。

 

1 我们可以使用Application.WindowResize事件来捕获用户调整行高和列宽的操作。此事件在工作表窗口大小发生变化时被触发,而调整行高和列宽也会影响工作表窗口的大小。
2 目前,除了上文提到的 Worksheet_ChangeWorksheet_BeforeRightClickWorksheet_BeforeDoubleClickWorksheet_SelectionChange 事件外,似乎没有任何其他 Excel VBA 中内置的事件可以直接检测用户拖动行分隔符导致行高变化。

 

 1 /* 使用VBA代码,如何确保在隐藏指定行之前,判断这些行是否存在任何其他保护状态,如果存在,就清除掉这些保护状态;如果不存在,则执行隐藏指定行 */
 2 
 3 你可以使用以下代码来确保在隐藏指定行之前检查这些行是否存在其他保护状态,如果存在就先清除保护状态,然后再执行隐藏:
 4 
 5 With ThisWorkbook.Sheets("测试用例")
 6     If .ProtectContents Then '判断工作表中是否有单元格锁定
 7         .Unprotect Password:="password" '如果有,使用密码解除保护
 8     End If
 9     If .ProtectDrawingObjects Then '判断工作表中是否有图形锁定
10         .DrawingObjects.Select '如果有图形锁定,则选中所有图片并删除
11         Selection.Delete
12     End If
13     If .ProtectUserInterface Then '判断工作表中是否有结构锁定
14         .Unprotect Password:="password" '如果有结构锁定,使用密码解除保护
15     End If
16     If .ProtectionMode Then '判断工作表是否被保护
17         .Unprotect Password:="password" '如果是受保护的,则使用密码解除保护
18     End If
19     
20     '隐藏指定行
21 End With
22 以上代码首先检查了工作表中是否存在任何保护状态,包括单元格锁定、图形锁定、结构锁定和工作表保护。如果存在,就清除这些保护状态;如果不存在,则直接执行隐藏指定行的操作。这样就可以确保在隐藏指定行之前没有任何其他保护状态对其产生干扰。

 

1 /* 使用这段代码,如果指定的隐藏行的存在这“合并单元格”的时候,是不是会提示“不能设置类Range的Locked属性” */
2 
3 是的,当隐藏行中包含合并单元格时,在将整行单元格锁定时会导致“不能设置类Range的Locked属性”的错误提示。这是因为存在合并单元格的情况下,无法将一整行的所有单元格同时锁定,只能选择对合并单元格进行保护。
4 
5 对于该问题,有两种解决方法:
6 
7 将合并单元格分解为多个单元格后再对整行进行锁定操作。
8 
9 对包含合并单元格的行采用其他方式进行保护,例如只锁定合并单元格所在的区域,而不是整个行。

 

posted @ 2023-04-27 11:29  行程两万  阅读(227)  评论(0)    收藏  举报