Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 4183|回复: 8

[已解决]VBA如何达到禁止选中特定单元格但事件仍可应用于这些被禁止选中的单元格

[复制链接]
发表于 2015-11-18 11:59 | 显示全部楼层 |阅读模式
本帖最后由 hpny 于 2015-12-7 19:23 编辑

单纯使用保护锁定单元格的方式禁止选中某些单元格会导致修改或隐藏这些单元格的工作表事件报错(错误1004),取消保护后则vba事件可以正常使用。

使用VBA语句Cells.Locked会导致一样的错误。

Application.Intersect(Target, Range("B6:H10")) Is Nothing Then [a1].Select这种语句会使光标跳到特定单元格,一旦锁定范围变大就会各种不方便。

请教各位大神:在VBA中,如何达到与单元格锁定保护单元格一致的效果,但工作表事件仍可应用于不能选中的单元格?
最佳答案
2015-12-7 17:05
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim pwd As String
    pwd = "123"
    If Target.Address = "$A$1" And Target <> "" Then
        Me.Unprotect pwd
        Application.EnableEvents = False
        Call test
        Application.EnableEvents = True
        Me.Protect pwd
    End If
End Sub

'处理动作
Sub test()
    For i = 37 To 39
        If Len(Sheet1.Cells(3, i)) = 0 Then
            Range(Cells(4, i), Cells(51, i)).ClearContents
            Columns(i).Hidden = True
        Else
            Columns(i).Hidden = False
        End If
    Next i
    Application.Dialogs(xlDialogSaveAs).Show
End Sub

月度销售流水2.rar (22.24 KB, 下载次数: 24)
发表于 2015-11-18 13:17 | 显示全部楼层
回复

使用道具 举报

 楼主| 发表于 2015-11-18 14:05 | 显示全部楼层
qh8600 发表于 2015-11-18 13:17
直接用事件

请教大神,用什么样的事件可以在VBA不受单元格锁定的影响下使单元格不能被选中?
回复

使用道具 举报

发表于 2015-11-18 15:08 | 显示全部楼层
比如,禁止选中B5:B10

如果选中了B5:B10中的单元格,就指定选中A1。

可以吗?
回复

使用道具 举报

 楼主| 发表于 2015-11-18 15:25 | 显示全部楼层
爱疯 发表于 2015-11-18 15:08
比如,禁止选中B5:B10

如果选中了B5:B10中的单元格,就指定选中A1。

这个语句在禁止范围特别大(需要翻页)时,返回某个单元格会让使用者丢失原来的位置,造成很大的编辑困难。。。

点评

建议:上传附件。只有在理解了具体情况后,才可能具体回复。  发表于 2015-11-18 22:35
回复

使用道具 举报

 楼主| 发表于 2015-11-19 16:51 | 显示全部楼层
本帖最后由 hpny 于 2015-11-19 16:54 编辑
hpny 发表于 2015-11-18 15:25
这个语句在禁止范围特别大(需要翻页)时,返回某个单元格会让使用者丢失原来的位置,造成很大的编辑困难。 ...

好的,附件已上传,请大神参考
在保护工作表后,就会出现错误了
月度销售流水.zip (22.37 KB, 下载次数: 3)
回复

使用道具 举报

 楼主| 发表于 2015-12-7 16:20 | 显示全部楼层
求关注 求不沉
回复

使用道具 举报

发表于 2015-12-7 17:05 | 显示全部楼层    本楼为最佳答案   
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim pwd As String
    pwd = "123"
    If Target.Address = "$A$1" And Target <> "" Then
        Me.Unprotect pwd
        Application.EnableEvents = False
        Call test
        Application.EnableEvents = True
        Me.Protect pwd
    End If
End Sub

'处理动作
Sub test()
    For i = 37 To 39
        If Len(Sheet1.Cells(3, i)) = 0 Then
            Range(Cells(4, i), Cells(51, i)).ClearContents
            Columns(i).Hidden = True
        Else
            Columns(i).Hidden = False
        End If
    Next i
    Application.Dialogs(xlDialogSaveAs).Show
End Sub

月度销售流水2.rar (22.24 KB, 下载次数: 24)

评分

参与人数 1 +1 收起 理由
hpny + 1 很给力

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2015-12-7 19:20 | 显示全部楼层
爱疯 发表于 2015-12-7 17:05
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim pwd As String
    pwd = "123"

谢谢大神回答,经测试可以完美运行
这个方法还可以进行密码保护,在Me.Unprotect后面使用Password语句就可以啦
不过弄不清楚dim pwa as string这个声明变量有什么用,好像不用这个变量也可以运行。。。

点评

可以不定义pwd  发表于 2015-12-7 19:26
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-23 18:21 , Processed in 0.334151 second(s), 16 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表