2013-11-01 103 views
5

想象我正在寫在Excel菜單籌辦我的孩子們(更容易比我的實際問題的描述)......Excel中:如何基於數據表創建動態數據驗證列表

我有一個列表可用的食物:蘋果,香蕉,胡蘿蔔,紅棗,雞蛋,魚等

我的孩子名單:約翰,莫文蔚,Lional,麥克等

然後,我有一個簡單的表列出了每個孩子喜歡的食物:在John的專欄中,將會有一個針對蘋果,香蕉和魚的'x',但是會對其他人產生空白。

 J K L M 
--------------- 
a x x x 
b x  x 
c  x x x 
d  x 
e   x x 
f x 

現在,在我的菜單籌辦的主要部分,我想有一些細胞用數據驗證,讓我來選擇食物每個孩子,用上面的「喜歡」表:

Name Food 
A2 B2 

單元格A2將包含數據驗證,讓所有孩子的名字(J,K,L,M)的內嵌下拉列表(這很簡單 - 我能做到這一點!)

小區B2需要包含被選擇的孩子喜歡的動態生成的食物列表。所以,如果我在A2中選擇John,那麼B2列表就是{a,b,f}。如果我選擇萊昂內爾,B2列表將是{a,b,c,e}。顯然,隨着我孩子的口味改變,我可以通過添加/刪除'x'來更新我的'喜歡'表格,並且B2中的下拉菜單將自動更新。

如何創建單元格B2的下拉驗證列表? (我寧願這樣做,而不訴諸VBA)

+0

我想你會需要另一個列表,每個孩子沒有空白拉最喜歡的食物。我想我在[Contextures網站]上看到過類似的內容(http://www.contextures.com/xlDataVal02.html)。如果你還沒有看過,你應該。這可能是依賴驗證技術的最佳場所。 –

回答

2

我認爲你的數據表在範圍內A1:E7。

步驟1.創建一個選擇列表中爲每個孩子

對於每個孩子創建一個列出的所有自己的喜好列表(在我加入列表的末尾「 - 」作爲佔位符)。輸入此公式中G2和拖動範圍G2:J7:

=IF(G1="-";"-";IF(ISNA(OFFSET($A$1;IFERROR(MATCH(G1;$A$2:$A$7;0);0)+ 
MATCH("x";OFFSET(B$2;IFERROR(MATCH(G1;$A$2:$A$7;0);0);0;7;1);0);0;1;1)); 
"-";OFFSET($A$1;IFERROR(MATCH(G1;$A$2:$A$7;0);0)+MATCH("x";OFFSET(B$2; 
IFERROR(MATCH(G1;$A$2:$A$7;0);0);0;7;1);0);0;1;1))) 

也把數據列(G1:J1)以上的孩子的名字。

步驟2.創建條件數據驗證

鑑於你的第一個數據驗證清單(名稱)是細胞L2,並且已經執行步驟1,用這個公式用於食品數據驗證:

=OFFSET(F$2;0;MATCH(L2;$G$1:$J$1;0);6-COUNTIF(OFFSET(F$2:F$7;0; 
MATCH(L2;$G$1:$J$1;0));"-")) 

該公式既排除列表中的所有空選項(「 - 」),並根據孩子的名字給出正確的列表。


UPDATE。替代解決方案使用INDEX/MATCH

OFFSET是一個易失公式(即Excel會在您的工作簿中有任何更改時重新計算它),因此您可能希望使用INDEX執行此操作。這裏是我的上述步驟1中的公式:

=IF(G1="-";"-";IFERROR(INDEX($A$2:$A$7;IFERROR(MATCH(G1;$A$2:$A$7;0);0)+ 
MATCH("x";INDEX(B$2:B$7;IFERROR(MATCH(G1;$A$2:$A$7;0)+1;1);1):B$7;0);1);"-")) 

至於第二步,似乎只有當您選擇這樣的offset不會有數據驗證列表波動單元格公式進行數據驗證被重新計算。由於INDEX無法返回範圍,而Excel不允許使用INDEX(..):INDEX(..)範圍進行數據驗證,所以OFFSET更適合數據驗證列表。

+0

這很完美 - 就是我想要的。還要感謝DMM--正如試圖理解這些公式一樣,起初有點令人望而卻步...... –

+1

這可以通過Index/Match而不是Offset/Match來完成嗎?還是需要波動性? –

+0

@IanMcClellan好點。我已經使用替代索引/匹配解決方案更新了我的帖子。 –

0

你絕對可以做到這一點,沒有VBA。如果您尚未將開發人員選項卡添加到Excel,請立即執行此操作。 http://msdn.microsoft.com/en-us/library/vstudio/bb608625.aspx

對於每個列表,您都需要創建一個命名範圍。因此,爲「名稱」製作一個,然後爲每個人最喜歡的食物製作一個。例如:AJ_Likes,RJ_Likes。

接下來,您需要插入組合框(Active X控件)。右鍵單擊該框並選擇屬性。在「ListFillRange」下,輸入「名稱」範圍。這將填寫您的第一個箱子與您的家庭成員的名字。然後你想把列表鏈接到一個單元格,所以每個選擇都會使用該值填充單元格。您可以將下拉列表直接放置在鏈接的單元格上,以便它不會出現(爲了美觀)。

「LinkedCell」也位於組合框的屬性框中。然後,你想創建第二個組合框。這個盒子會有一個填充範圍=你將創建一個新的動態範圍。動態範圍將根據第一個盒子的選擇而改變。

在動態範圍內,使用的條件式如此:
= IF($ F $ 3 = 「AJ」,INDEX(aj_likes,1),IF($ F $ 3 = 「RJ」,INDEX(rj_likes ,1),「」))

基本上說,如果F3 = AJ,從AJ_Likes範圍選擇第一行,否則,如果它= RJ,請從RJ_Likes範圍選擇第一行。 enter image description here enter image description here

我似乎無法讓我的圖像出現,所以這裏有一些鏈接到我創建的屏幕截圖。希望這會有所幫助 - 很高興提供更多幫助。

http://hostmypicture.com/images/1ici.jpg

http://hostmypicture.com/images/2aga.jpg

對不起 - 注意到你特別強調了數據驗證。與上面的步驟相同,但不是添加第二個組合框,只需添加數據驗證,LIST作爲選項,然後選擇動態列表作爲您的範圍。

http://hostmypicture.com/images/3olo.jpg

1

首先發布提醒!

這裏是我的方法 http://www.mediafire.com/download/sqm41koonqjdz99/DynamicLists.xlsx

它是基於三個步驟。

步驟1:它使用一系列5張桌子將食物/小孩x的桌子打成更有用的東西,列出每個孩子的第一,第二,第三等喜歡後跟#N/A的任何「未使用」像職位。第五個表格包含數據驗證信息 - 它只是從該表中選取右列和右列數的問題。

步驟2:單元格D2和E2分別標識列和行數。

第3步:名爲ValidFood的命名範圍是動態定義的,並使用= OFFSET()函數從第五個表中挑選出正確的列和行。這是一個聰明點 - 你可以在名稱管理器中使用函數,這就是在這裏完成的。單元格B2的數據驗證規則只是引用這個命名範圍。或者,= OFFSET()公式可能已經直接在數據驗證規則中使用自定義選項

我已經根據Lina的審查瞭解決方案,並發現他們不相似。在這兩種解決方案中,第1步都達到了同樣的效果(除了Lina使用「 - 」字符代替我的#N/A用於未使用的選項)。然後選擇第1步的結果的相關位並將其應用於數據驗證規則。它們之間的區別在於方法:將冗長和嵌套的公式合併爲一個(如此緊湊但需要努力去理解)與更廣泛地使用工作表來記錄另一箇中的詳細步驟(不太緊湊但需要更少的努力來理解)。

0

如果你準備重新安排你的初始表,那麼你可以更輕鬆地創建條件的下拉箭頭驗證列表如下:

您需要設置兩個表,一個用於數據和一個查找。

在單元格A1:D1中輸入孩子的名字。

在其中的每一個下,在B1:D6中輸入他們喜歡的食物,每個細胞一個。根據上面的例子,你可以留下空白,或者將它們全部推開,這樣一些孩子的名單就會縮短。

然後爲每個孩子的選擇創建一個命名範圍 - 例如JohnsChoices,只包括他們的選擇,而不是他們的名字。

這些是單獨的下拉列表。使它們全都相同,以便稍後添加。

然後創建一個查找表是4行高和列2寬: 約翰| JohnsChoices 卡爾| KarlsChoices 麗娜| LinasChoices 瑪麗| MarysChoices

然後命名這個4×2表ChoiceLookup。

然後,命名您要選擇名稱的單元格,例如名稱。

在同一個單元格中,只爲名稱創建下拉驗證列表,即使用剛創建的表格的左列。

最後名稱旁邊的細胞,創建一個下拉驗證列表和範圍內的認沽:= INDIRECT(VLOOKUP(名稱,ChoiceLookup,2,FALSE))

這將標識已被選擇的名稱首先,然後將查找哪個選擇列表用於數據驗證下拉列表。按照慣例,INDIRECT將文本字符串解釋爲一個範圍。

您可以嵌套多達20個 - 如果您有耐心,但實質上它們是級聯選擇,在您接觸到它們之前更新後續選項。我經常使用它,這是非常有用的,並且避免與MATCH,INDEX,OFFSET等混合。

BTW:幾乎任何需要範圍的對話框都可以用公式填充,只要它解析爲一個範圍,間接。