Office中国论坛/Access中国论坛

标题: Access挑战Excel第三期:级联菜单 [打印本页]

作者: roych    时间: 2016-3-22 11:42
标题: Access挑战Excel第三期:级联菜单
看了下站长和小妖姐姐的PK赛,感觉明显攻击力不够,太温柔了。对付Excel,必须出大招嘛!我先来一个Access入门级的级联菜单。如图所示,省市县是乱序的(好吧,我承认,按县来排序的)。

[attach]58506[/attach]
完成效果如下,省市县已经按开头字母排好序,而且是三级菜单:
[attach]58508[/attach]
数据有效性、辅助列、动态数据列、ADO、类模块、数组……只要你能想到的方法都可以用,不过如果使用Access组件,就算输了。
视频制作教程
评分标准如下:
[attach]58507[/attach]
先上传一个不太标准的答案(辅助表法),省得大家说我空口说白话
说明:


作者: tmtony    时间: 2016-3-22 11:55
你这样好吗?会不会把Excel参赛者都吓走呢
作者: roych    时间: 2016-3-22 12:05
tmtony 发表于 2016-3-22 11:55
你这样好吗?会不会把Excel参赛者都吓走呢

如果不想弄懂二级下拉菜单的Excel用户,基本只停留在初级水平。
因为二级下拉菜单静态也好,动态也好,至少涉及了定义名称、数据有效性等中级操作。个别函数,也属于中级函数,例如,indirect、offset等等。
我想,没什么理由拒绝学习吧。
作者: 轻风    时间: 2016-3-22 12:32
本帖最后由 轻风 于 2016-3-22 12:57 编辑

这个不是太难吧,特别对于小妖同学杀伤力还不够。我是看热闹不嫌事大。话说回来,这个ACCESS肯定更有优势,EXCEL实现这个对我来说有点难

作者: tmtony    时间: 2016-3-23 10:13
我估计是把人吓跑了
作者: pureshadow    时间: 2016-3-23 11:11
动态的问题不大,但乱序的数据有效性不行,要用VBA
作者: roych    时间: 2016-3-23 12:18
pureshadow 发表于 2016-3-23 11:11
动态的问题不大,但乱序的数据有效性不行,要用VBA

就想挑战下小妖姐姐的极限。
我上传的那个答案还是比较low的。
作者: pureshadow    时间: 2016-3-23 16:26
roych 发表于 2016-3-23 12:18
就想挑战下小妖姐姐的极限。
我上传的那个答案还是比较low的。

这两天没空,等有空了就来接招,另外,也欢迎其他会Excel的同学接招,最近Access有点气焰嚣张……
作者: friendship    时间: 2016-3-23 21:50

作者: 江南春    时间: 2016-3-24 13:09
不错,赞
作者: purplerose    时间: 2016-3-24 13:51
ROYCH  这招有点狠了,估计EXCEL做起来不是那么容易了,
作者: ccz88    时间: 2016-3-26 10:46
小菜鸟关注下
作者: pureshadow    时间: 2016-3-26 17:07
做了两个:一个是纯函数版,不过函数有限制,所以没有用所有的数据,而且因为在数据验证中无法使用多维引用和内存数组,所以对数据源结构作了些修改。

  1. =OFFSET($E$2,,,COUNTA($E:$E))
  2. =OFFSET($B$1,MATCH($H$3,$A:$A,)-1,,COUNTIF($A:$A,$H$3))
  3. =OFFSET($B$1,MATCH($H$5,$A:$A,)-1,,COUNTIF($A:$A,$H$5))
复制代码



另一个是代码版,这个除了生孩子其他什么都会的代码,就没那么多顾虑了,数据源该是什么样就是什么样。

  1. Private Sub Worksheet_selectionChange(ByVal Target As Range)

  2. Dim MyRow As Long, i As Long
  3. Dim MyStr As String
  4. MyRow = Cells(Rows.Count, 1).End(xlUp).Row

  5. '省
  6. If Target.Address = "$G$4" Then
  7.     For i = 2 To MyRow
  8.         If Application.CountIf(Range("a1:a" & i - 1), Cells(i, 1)) = 0 Then
  9.             MyStr = MyStr & "," & Cells(i, 1)
  10.         End If
  11.     Next
  12.     MyStr = Mid(MyStr, 2, MyRow * 8)
  13.     With Target.Validation
  14.         .Delete
  15.         .Add Type:=xlValidateList, Formula1:=MyStr
  16.     End With
  17. End If

  18. '市
  19. If Target.Address = "$G$6" Then
  20.     For i = 2 To MyRow
  21.         If Cells(i, 1) = Range("g4") Then
  22.             If Application.CountIf(Range("b1:b" & i - 1), Cells(i, 2)) = 0 Then
  23.                 MyStr = MyStr & "," & Cells(i, 2)
  24.             End If
  25.         End If
  26.     Next
  27.     MyStr = Mid(MyStr, 2, MyRow * 8)
  28.     With Target.Validation
  29.         .Delete
  30.         .Add Type:=xlValidateList, Formula1:=MyStr
  31.     End With
  32. End If

  33. '县
  34. If Target.Address = "$G$8" Then
  35.     For i = 2 To MyRow
  36.         If Cells(i, 2) = Range("g6") Then
  37.             If Application.CountIf(Range("c1:c" & i - 1), Cells(i, 3)) = 0 Then
  38.                 MyStr = MyStr & "," & Cells(i, 3)
  39.             End If
  40.         End If
  41.     Next
  42.     MyStr = Mid(MyStr, 2, MyRow * 8)
  43.     With Target.Validation
  44.         .Delete
  45.         .Add Type:=xlValidateList, Formula1:=MyStr
  46.     End With
  47. End If

  48. End Sub

复制代码




作者: pureshadow    时间: 2016-3-26 17:08
那个Roy,我一直没明白Access这个究竟是怎么做的,能扫下盲不?
作者: 刘苏    时间: 2016-3-27 00:09
整好遇到有童鞋求助联动菜单问题,源文件附上:[attach]58557[/attach]


反正楼主考察的是思路,数据源不一致这个问题嘛,将就一下咯

快跑..
作者: roych    时间: 2016-3-27 11:11
pureshadow 发表于 2016-3-26 17:08
那个Roy,我一直没明白Access这个究竟是怎么做的,能扫下盲不?

Access的主要思路是通过查询来做的。
第一级菜单使用一个分组查询(我习惯用这个),或者使用distinct关键字来得到不重复的省份。
第二级菜单使用以第一级菜单为条件的查询,即 select city from area where province=frmMain!province。这样一来,我们在第一级菜单的更新后事件或者更改事件中刷新第二级菜单的数据源之后,即可得到对应的二级菜单。
第三级如此类推,我一般使用2个条件(省份和市区),在第二级菜单更改后刷新数据源即可。

只要不强制另加条件的话,系统是自动按开头字母排序的。
也正因为这样,数据可以动态增加,而且不管是否顺序。

在实际应用中,新增且乱序是很经常有的事情。例如,生产过程中,新购买的原料,或者销售过程中新增的一些套餐或者产品等等,这些都会在订单流程上使用。如果这些数据非要顺序的话,对于使用者来说,可能不太方便。

当然,这是个人拙见,欢迎大家拍砖。
作者: gaojikuaijishi    时间: 2016-3-28 22:09
谢谢呀

作者: roych    时间: 2016-4-6 02:12
本题暂时告一段落了。从思路上来看,都达到了要求。总结如下:
1、三级联动菜单中,代码版完全符合要求。当然,这对Excel的要求比较高。
2、函数版基本符合要求,但局限于顺序问题,因此在使用函数版时必须要按A列排好序【按B列排序则会出错】。
3、苏版的同样存在顺序问题。这里不再评述。
4、在多级菜单方面,Access略胜一筹。不过,对于新手来说,需要掌握条件查询,以及稍通代码。
作者: pureshadow    时间: 2016-4-10 15:39
Roy,原谅我笨,还是没搞定……
提个小小的要求,能做个视频什么的吧
作者: xuwenning    时间: 2016-4-12 08:27
学习 收藏
作者: jun_hai    时间: 2016-4-13 10:34
谢谢!!!!!
作者: ashertb    时间: 2016-4-14 08:57
千辛万苦,不容易
作者: chenjun227    时间: 2016-4-22 11:49
146我看看先
作者: grs432    时间: 2016-5-9 22:06
看看再说~!~
作者: Superleistung    时间: 2016-5-26 08:57
这个要看看~
作者: xiaowuo2    时间: 2016-6-17 08:47
感谢大大分享,顶上
作者: sunday1975    时间: 2016-11-22 10:44
多谢楼主分享,小手抖抖,不客气拿走
作者: guan818355    时间: 2017-3-5 20:08
ugankunllj
作者: xxx510    时间: 2017-4-7 10:06
这是在没啥稀奇的 N级无限 菜单我早已在多年前就实现了多级菜单非递归算法/示例-全国省市行政区划三级菜单/自适应级数 到我网站excel880.com可查看附件

作者: roych    时间: 2017-4-7 11:12
xxx510 发表于 2017-4-7 10:06
这是在没啥稀奇的 N级无限 菜单我早已在多年前就实现了多级菜单非递归算法/示例-全国省市行政区划三级菜单/ ...

静态的估计没问题。随意增删改,乱序等等,做到了再对比access,看看哪个代码写得少。
作者: xxx510    时间: 2017-4-8 14:37
roych 发表于 2017-4-7 11:12
静态的估计没问题。随意增删改,乱序等等,做到了再对比access,看看哪个代码写得少。

功能的完成根据需求的 ac和ex本来就各有长处 ac集成了sql在查询和表间联动上有天然的优势  没有什么可比性 我这个是弹出式菜单 菜单必须预先生成  不同于combox  你大可以试试在ac里如何实现我这个效果  另外在ac里只是sql的话 你可以试试如何实现无限极的多级菜单 你用combox就限定了只有三级了 我这个换数据重新生成 支持无限N级
作者: roych    时间: 2017-4-9 11:09
xxx510 发表于 2017-4-8 14:37
功能的完成根据需求的 ac和ex本来就各有长处 ac集成了sql在查询和表间联动上有天然的优势  没有什么可比 ...

Access右键菜单做不到二级,但是级数再多,对Access来说,也只是多几个组合框罢了。
另外,树控件处理多级菜单也不难。只是需要层层展开,相对代码多些许而已。[attach]61073[/attach]
如果 说截取上方label的captain并不难,甚至双击任意一条记录直接录入都没问题。我想,你会认同这个意见吧?


说些题外话
----------------------------------
提出这个挑战,主要目的并非为了一定要分出个胜负来,而是通过它,让大家了解到Access有哪些优势,Excel有哪些优势。我们应该如何使用这些优势去改进工作效率。
就拿我这个题目来说吧,Excel不是不能做,——事实上你也看到有Excel的附件了。但是繁琐程度,绝对是比Access要多。——也许你会说改Access,学习成本可能会增加,这个我是认同的。但是,话又说回来,如果真的涉及到这些,用Excel的学习成本就一定比Access少吗?我看未必。例如,VBA代码就比Access的要多很多,是不是?——当然,用上你的插件,可以省掉这部分。不过,也只是学习成本转嫁罢了。
如果你看完全部挑战题,你会发现,我的题目中会尽可能少用代码(完全不用则不太可能),目的也在于降低大家的学习成本,稍稍懂两三句代码就可以做这么多,何乐而不为呢?
我并不奢求大家都要学Access去开发什么,只是希望大家通过这些例子,可以在工作中稍稍运用下,对工作有所帮助就善莫大焉了。我觉得,学完查询之后,大部分情况下已经足够应付繁琐的工作了。

作者: xxx510    时间: 2017-4-9 15:36
roych 发表于 2017-4-9 11:09
Access右键菜单做不到二级,但是级数再多,对Access来说,也只是多几个组合框罢了。
另外,树控件处理多 ...

你这个出发点我也是认同的 但是这标题实在有点让人误解 什么叫挑战呢  如果是改为交流更好 AC与EX本就是互补 大部分人并不具备开发能力 搞开发的 这几个功能老实说都是小菜  开发的真正难点也从来不是几个技术点 而是整体系统的设计  
作者: ardu95    时间: 2017-6-16 06:29
新生学习一下
作者: boon    时间: 2019-2-22 07:26
学习了。楼主威武
作者: 冚友    时间: 2019-6-11 21:09
学习一下
作者: wuwu200222    时间: 2023-5-24 09:18
学习




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3