設(shè)為首頁收藏本站Access中國

Office中國論壇/Access中國論壇

 找回密碼
 注冊

QQ登錄

只需一步,快速開始

返回列表 發(fā)新帖
樓主: roych
打印 上一主題 下一主題

Access挑戰(zhàn)Excel第三期:級聯(lián)菜單

[復(fù)制鏈接]
11#
發(fā)表于 2016-3-24 13:51:13 | 只看該作者
ROYCH  這招有點(diǎn)狠了,估計EXCEL做起來不是那么容易了,
12#
發(fā)表于 2016-3-26 10:46:34 | 只看該作者
小菜鳥關(guān)注下

點(diǎn)擊這里給我發(fā)消息

13#
發(fā)表于 2016-3-26 17:07:29 | 只看該作者
做了兩個:一個是純函數(shù)版,不過函數(shù)有限制,所以沒有用所有的數(shù)據(jù),而且因?yàn)樵跀?shù)據(jù)驗(yàn)證中無法使用多維引用和內(nèi)存數(shù)組,所以對數(shù)據(jù)源結(jié)構(gòu)作了些修改。

  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))
復(fù)制代碼



另一個是代碼版,這個除了生孩子其他什么都會的代碼,就沒那么多顧慮了,數(shù)據(jù)源該是什么樣就是什么樣。

  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

復(fù)制代碼



本帖子中包含更多資源

您需要 登錄 才可以下載或查看,沒有帳號?注冊

x

點(diǎn)擊這里給我發(fā)消息

14#
發(fā)表于 2016-3-26 17:08:31 | 只看該作者
那個Roy,我一直沒明白Access這個究竟是怎么做的,能掃下盲不?

點(diǎn)擊這里給我發(fā)消息

15#
發(fā)表于 2016-3-27 00:09:26 | 只看該作者
整好遇到有童鞋求助聯(lián)動菜單問題,源文件附上:


反正樓主考察的是思路,數(shù)據(jù)源不一致這個問題嘛,將就一下咯

快跑..

本帖子中包含更多資源

您需要 登錄 才可以下載或查看,沒有帳號?注冊

x
16#
 樓主| 發(fā)表于 2016-3-27 11:11:48 | 只看該作者
pureshadow 發(fā)表于 2016-3-26 17:08
那個Roy,我一直沒明白Access這個究竟是怎么做的,能掃下盲不?

Access的主要思路是通過查詢來做的。
第一級菜單使用一個分組查詢(我習(xí)慣用這個),或者使用distinct關(guān)鍵字來得到不重復(fù)的省份。
第二級菜單使用以第一級菜單為條件的查詢,即 select city from area where province=frmMain!province。這樣一來,我們在第一級菜單的更新后事件或者更改事件中刷新第二級菜單的數(shù)據(jù)源之后,即可得到對應(yīng)的二級菜單。
第三級如此類推,我一般使用2個條件(省份和市區(qū)),在第二級菜單更改后刷新數(shù)據(jù)源即可。

只要不強(qiáng)制另加條件的話,系統(tǒng)是自動按開頭字母排序的。
也正因?yàn)檫@樣,數(shù)據(jù)可以動態(tài)增加,而且不管是否順序。

在實(shí)際應(yīng)用中,新增且亂序是很經(jīng)常有的事情。例如,生產(chǎn)過程中,新購買的原料,或者銷售過程中新增的一些套餐或者產(chǎn)品等等,這些都會在訂單流程上使用。如果這些數(shù)據(jù)非要順序的話,對于使用者來說,可能不太方便。

當(dāng)然,這是個人拙見,歡迎大家拍磚。
17#
發(fā)表于 2016-3-28 22:09:29 | 只看該作者
謝謝呀
回復(fù)

使用道具 舉報

18#
 樓主| 發(fā)表于 2016-4-6 02:12:00 | 只看該作者
本題暫時告一段落了。從思路上來看,都達(dá)到了要求?偨Y(jié)如下:
1、三級聯(lián)動菜單中,代碼版完全符合要求。當(dāng)然,這對Excel的要求比較高。
2、函數(shù)版基本符合要求,但局限于順序問題,因此在使用函數(shù)版時必須要按A列排好序【按B列排序則會出錯】。
3、蘇版的同樣存在順序問題。這里不再評述。
4、在多級菜單方面,Access略勝一籌。不過,對于新手來說,需要掌握條件查詢,以及稍通代碼。

點(diǎn)擊這里給我發(fā)消息

19#
發(fā)表于 2016-4-10 15:39:08 | 只看該作者
Roy,原諒我笨,還是沒搞定……
提個小小的要求,能做個視頻什么的吧
20#
發(fā)表于 2016-4-12 08:27:13 | 只看該作者
學(xué)習(xí) 收藏
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則

QQ|站長郵箱|小黑屋|手機(jī)版|Office中國/Access中國 ( 粵ICP備10043721號-1 )  

GMT+8, 2025-7-17 05:47 , Processed in 0.103483 second(s), 32 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回復(fù) 返回頂部 返回列表