我需要能够对excel(VBA)中具有锁定列标题的受保护工作表进行排序

我需要能够对excel(VBA)中具有锁定列标题的受保护工作表进行排序,vba,excel,Vba,Excel,我现在正在处理一个excel文档,一切都很顺利。但是,我要谈的是最后一个问题:在工作表受到保护且列标题被锁定的情况下,能够按升序/降序对列进行排序。我将首先陈述一些关于我的工作表的事实,我试图实现的目标,然后是我研究过的可能的解决方案,以及为什么这些解决方案似乎不适用于我的情况 首先,我使用的不是excel表对象(只是普通的) 行/列) 顶行应用了自动筛选(用作列标题) 工作表中的所有单元格都已解锁,除了 锁定的整个第一行(也称为列标题) 工作表将受到保护 我不希望用户能够编辑第一行中的数据(此

我现在正在处理一个excel文档,一切都很顺利。但是,我要谈的是最后一个问题:在工作表受到保护且列标题被锁定的情况下,能够按升序/降序对列进行排序。我将首先陈述一些关于我的工作表的事实,我试图实现的目标,然后是我研究过的可能的解决方案,以及为什么这些解决方案似乎不适用于我的情况

  • 首先,我使用的不是excel表对象(只是普通的) 行/列)
  • 顶行应用了自动筛选(用作列标题)
  • 工作表中的所有单元格都已解锁,除了 锁定的整个第一行(也称为列标题)
  • 工作表将受到保护
  • 我不希望用户能够编辑第一行中的数据(此 重要的是,无论发生什么情况,这些都不能编辑)
  • 对于我的受保护图纸设置,我有“选择锁定” “单元格”、“选择未锁定的单元格”、“插入行”、“删除行”、“排序”, 并选中“自动筛选”
  • 我的工作表使用VBA
  • 我正在使用Excel 2013
  • 现在,假设工作表受到保护,用户当前可以使用顶部的自动筛选功能按预期实际“筛选”数据。问题是,每当他们尝试按升序/降序对数据进行“排序”时,我都会收到一个错误,提示您必须首先取消对工作表的保护

    经过研究,我发现这是因为在排序时,自动过滤器会自动将列标题作为排序范围的一部分进行计数。。。但由于此列标题(第1行)已锁定,因此会导致此错误。但是,必须锁定此行,我的VBA代码专门读取这些列标题中的值,在任何情况下都不能更改这些值

    所以过滤效果很好,这就是我现在想弄清楚的排序。我的“理想”解决方案是,当用户单击“自动筛选”箭头并选择“排序”时,以某种方式捕获事件,然后在VBA中取消对工作表的保护,根据他们的选择进行排序,然后再次保护工作表。然而,再一次经过研究,当涉及到这个自动过滤按钮的事件时,似乎真的没有一个选项(我可能是错的,有时阅读别人的建议会让人困惑)

    我希望有人能帮我解决这个问题,我也希望避免使用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)
    以防止选择标题。您知道是否有方法可以使整行在单元格解锁的情况下不可选择吗?据我所知,没有内置函数。我添加了不允许按代码选择第一行的代码。