ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 1041|回复: 4

[求助] 求老师们给看一下VBA动态列表问题

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-6-25 21:14 | 显示全部楼层 |阅读模式
本帖最后由 yygydong 于 2018-6-25 21:43 编辑

建了个两列的动态列表VBA,可是有些功能达不到想要的结果,求老师帮助解决一下啊?主要还有这个表还要设置保护工作表,希望能在执行完代码后再对解锁的工作表进行保护。
具体问题在附件里了,麻烦老师们了。

台账列表.rar

35.8 KB, 下载次数: 2

TA的精华主题

TA的得分主题

发表于 2018-6-25 21:47 | 显示全部楼层
1、这两列的4行以前和26行以后不想出现下拉列表,如何改代码?
If Target.Count = 1 Then
        If Target.Column = 1 And Target.Row > 3 And Target.Row <26 Then
             With Target.Validation
                 .Delete
                .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
                  Operator:=xlBetween, Formula1:=Join(d.keys, ",")
            End With
        End If
    End If
5、想在下拉列表代码执行前加入解锁工作表的代码,执行完成后再对工作表进行保护,如何改代码?(两个工作表都要解锁、保护。)
回答:代码开始时放入 .Unprotect Password:="123"      '取消工作表保护
代码结束前放入.Protect Password:="123" '保护工作表
工作表保护密码为123,可以更改为你需要的密码
2018-06-25_213958.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-6-25 22:50 | 显示全部楼层
excel玉米 发表于 2018-6-25 21:47
1、这两列的4行以前和26行以后不想出现下拉列表,如何改代码?
If Target.Count = 1 Then
        If Ta ...

刚刚才学这个,还是不太明白呢,能麻烦老师给在VBA里改好吗?谢谢。

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-6-26 09:07 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 yygydong 于 2018-6-26 15:58 编辑

根据楼上excel玉米朋友的提示,有一些进步,改了下代码,可还是有些不太明白的地,求教啊。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Application.ScreenUpdating = False
If Target.Count > 3 Then Exit Sub
If (Target.Column <> "1" And Target.Column <> "2") Or Target.Row < 2 Then Exit Sub
Dim t, Arr, d
Dim i&, x$, Brr, y$
Set d = CreateObject("Scripting.Dictionary")Sheet2.Unprotect Password:="123"
Sheet4.Unprotect Password:="123"
Arr = Sheet2.[b16].CurrentRegion
For i = 4 To UBound(Arr)
    x = Arr(i, 3): y = Arr(i, 2)
    If d.exists(x) = False Then Set d(x) = CreateObject("Scripting.Dictionary")
    d(x)(y) = y
Next
If Target.Column = 2 Then ’但是这儿怎么改成6行至26行有下拉表,其它行不显示呢?没整明白,麻烦高手给看看
    With Target.Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
            Operator:=xlBetween, Formula1:=Join(d.keys, ",")
    End With
Else
    x = Target.Offset(0, 1).Value
    If d.exists(x) Then
        t = d(x).keys
        With Target.Validation
            .Delete
            .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
                Operator:=xlBetween, Formula1:=IIf(UBound(t) <> -1, Join(t, ","), t)
        End With
    Else
        'Target = ""
    End If
End If
Sheet2.Protect Password:="123"
Sheet4.Protect Password:="123"
Application.ScreenUpdating = True
End Sub

’要在哪儿改代码才能改成6行至26行有下拉表,其它行不显示呢?没整明白,麻烦高手给看看?求教各位大神给看看。







TA的精华主题

TA的得分主题

 楼主| 发表于 2018-6-26 16:03 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-12-27 19:28 , Processed in 0.028929 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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