我需要能够对excel(VBA)中具有锁定列标题的受保护工作表进行排序
我现在正在处理一个excel文档,一切都很顺利。但是,我要谈的是最后一个问题:在工作表受到保护且列标题被锁定的情况下,能够按升序/降序对列进行排序。我将首先陈述一些关于我的工作表的事实,我试图实现的目标,然后是我研究过的可能的解决方案,以及为什么这些解决方案似乎不适用于我的情况我需要能够对excel(VBA)中具有锁定列标题的受保护工作表进行排序,vba,excel,Vba,Excel,我现在正在处理一个excel文档,一切都很顺利。但是,我要谈的是最后一个问题:在工作表受到保护且列标题被锁定的情况下,能够按升序/降序对列进行排序。我将首先陈述一些关于我的工作表的事实,我试图实现的目标,然后是我研究过的可能的解决方案,以及为什么这些解决方案似乎不适用于我的情况 首先,我使用的不是excel表对象(只是普通的) 行/列) 顶行应用了自动筛选(用作列标题) 工作表中的所有单元格都已解锁,除了 锁定的整个第一行(也称为列标题) 工作表将受到保护 我不希望用户能够编辑第一行中的数据(此
提前感谢您的帮助。如果您已经使用VBA,您可以将此代码插入工作表模块。这假设标题位于第1行。换衣服
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("1:1")) Is Nothing Then
Application.EnableEvents = False
Application.Undo
Application.EnableEvents = True
End If
End Sub
现在不需要保护图纸 从@Teylyn's中借用一个位,并对其进行调整,以禁止选择标题行,当它被选中时,它会直接选择它下面的单元格,并显示一条错误消息。代码位于工作表模块中,如果需要将其应用于更多工作表,最好使用
专用子工作簿\u SheetSelectionChange(ByVal Sh作为对象,ByVal Target作为范围)
,在这种情况下,将下面代码中的Me
的所有实例替换为Sh
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Target, Me.Range("1:1")) Is Nothing Then
Target.Offset(1, 0).Select
MsgBox "You cannot select or edit the headerrow, please use the autofilter button to sort and filter.", vbCritical, "Invalid Selection"
End If
End Sub
注
解锁排序所需的单元格,然后在保护工作表时允许选择解锁的单元格,这是编辑数据所必需的,这使得工作表保护实际上毫无用处。同样是上面的代码,仍然有一个可以编辑单元格的漏洞。如果选择允许的单元格,将其拖动到标题行,并选择替换单元格中的数据,则将选择并编辑允许的单元格移动到的标题单元格 尾声
选择需要排序的数据区域并解锁单元格 保护工作表时,请确保允许
- 分类
- 自动过滤器
为防止用户更改单元格内容,请禁止选择未锁定的单元格。查看
工作表\u change
事件,则无需锁定/保护工作表。您可以简单地阻止对标题行进行更改。我喜欢这个想法。唯一的问题是我非常需要文档保持保护,以防止任何人复制粘贴数据验证。我正在寻找一个解决方案,而工作的文件是受保护的。我喜欢这个想法!然而,不幸的是,工作表仍然需要保持保护,我在单元格上有数据验证列表(下拉选项),并且受保护的工作表阻止人们将此数据复制粘贴到其他单元格(我不希望列表覆盖其他列表)。所以,如果你知道如何预防这种情况,那可能会奏效。我仍然喜欢这个半解决方案,实际上我将在我的另一个项目中使用它,但我很好奇,你是否知道一种在保护工作表的同时做到这一点的方法?嗯,唯一的问题是,如果我不允许选择未锁定的单元格,那么任何人将如何输入数据?我不希望用户更改的只是第一行(列标题)。然后我建议保持单元格解锁并允许选择解锁的单元格,点击Private子工作表\u selection change(ByVal Target As Range)
或Private子工作簿\u sheet selection change(ByVal Sh As Object,ByVal Target As Range)
以防止选择标题。您知道是否有方法可以使整行在单元格解锁的情况下不可选择吗?据我所知,没有内置函数。我添加了不允许按代码选择第一行的代码。