设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
楼主: roych
打印 上一主题 下一主题

Access挑战Excel第三期:级联菜单

[复制链接]
11#
发表于 2016-3-24 13:51:13 | 只看该作者
ROYCH  这招有点狠了,估计EXCEL做起来不是那么容易了,
12#
发表于 2016-3-26 10:46:34 | 只看该作者
小菜鸟关注下

点击这里给我发消息

13#
发表于 2016-3-26 17:07:29 | 只看该作者
做了两个:一个是纯函数版,不过函数有限制,所以没有用所有的数据,而且因为在数据验证中无法使用多维引用和内存数组,所以对数据源结构作了些修改。

  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

复制代码



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

点击这里给我发消息

14#
发表于 2016-3-26 17:08:31 | 只看该作者
那个Roy,我一直没明白Access这个究竟是怎么做的,能扫下盲不?

点击这里给我发消息

15#
发表于 2016-3-27 00:09:26 | 只看该作者
整好遇到有童鞋求助联动菜单问题,源文件附上:


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

快跑..

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
16#
 楼主| 发表于 2016-3-27 11:11:48 | 只看该作者
pureshadow 发表于 2016-3-26 17:08
那个Roy,我一直没明白Access这个究竟是怎么做的,能扫下盲不?

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

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

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

当然,这是个人拙见,欢迎大家拍砖。
17#
发表于 2016-3-28 22:09:29 | 只看该作者
谢谢呀
回复

使用道具 举报

18#
 楼主| 发表于 2016-4-6 02:12:00 | 只看该作者
本题暂时告一段落了。从思路上来看,都达到了要求。总结如下:
1、三级联动菜单中,代码版完全符合要求。当然,这对Excel的要求比较高。
2、函数版基本符合要求,但局限于顺序问题,因此在使用函数版时必须要按A列排好序【按B列排序则会出错】。
3、苏版的同样存在顺序问题。这里不再评述。
4、在多级菜单方面,Access略胜一筹。不过,对于新手来说,需要掌握条件查询,以及稍通代码。

点击这里给我发消息

19#
发表于 2016-4-10 15:39:08 | 只看该作者
Roy,原谅我笨,还是没搞定……
提个小小的要求,能做个视频什么的吧
20#
发表于 2016-4-12 08:27:13 | 只看该作者
学习 收藏
回复

使用道具 举报

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

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-4-25 22:03 , Processed in 0.081545 second(s), 32 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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