Excel:依赖于dynamic内容的下拉列表

我从Google Analytics(GA)API中导入了以下格式的客户及其网站列表:

Account Profile Client 1 www.client1.com Client 1 sub.client1.com Client 1 tst.client1.com Client 2 www.client2.com Client 3 www.client3.com Client 3 sub.client3.com 

我需要的是具有唯一帐户名称的下拉列表,然后是具有所选帐户的相关configuration文件的第二个下拉列表。 看起来像这样的东西:

 Account Profile Client 1 www.client1.com sub.client1.com tst.client1.com 

我们一直向GA添加账户和configuration文件,因此每次运行报告时都需要刷新列表。

我怎么去做这个?

只要你有这个按帐户sorting的列表 ,你可以使用Offset CountA混合给你所有你需要的范围。

步骤是:

一个。 从Account列中获取唯一的值(我在这一步使用VBA,但是你也可以使用Frequency公式来混合这个 – 如果你可以使用VBA的话,我会避免它)。 沿线的东西:

  Sub FindUniqueValues(SourceRange As Range, TargetCell As Range) SourceRange.AdvancedFilter xlFilterCopy, , TargetCell, True End Sub 

(我已经从我的worksheet_change事件中调用了这个方法,但是如果您使用vba来提取GA数据,那么只需将其集成到这个事件中)

湾 将此命令提交给具有forumla =$D$2:INDEX($D$2:$D$5000,COUNTA($D$2:$D$5000))命名范围(Say AccountsRange=$D$2:INDEX($D$2:$D$5000,COUNTA($D$2:$D$5000)) – 假设您将D1指定为之前的TargetCell一步和独特的价值将不会超过4999(第一个值是行标题在我的情况 – 因此从D2开始)

C。 添加这个命名的范围AccountsRange作为数据validation列表的来源 – 您的帐户combobox完成在这一点上。 我将假设你把这个combobox放在E2 ,我将在这个基础上来派生出第二个combobox

d。 创build一个新的命名范围say ProfilesRange公式=INDEX($B$1:$B$5000,MATCH($E$2,$A$1:$A$5000,0),1):INDEX($B$1:$B$5000,COUNTIF($A‌​$1:$A$5000,$E$2)+MATCH($E$2,$A$1:$A$5000,0)-1,1) 注意:如果从这里复制粘贴,上面的公式将包含在COUNTIF($A和excel会投诉无效的公式,只需重新inputCOUNTIF $A$1部分,它应该是罚款

A2是GA导入数据的Account列的开始( A1是标题,在此假设最多4999个数据行) E2是来自之前AccountsRange下拉步骤的组合列表单元格。 Match步骤中需要-1,因为第一个值行的偏移量需要为0,而不是从Match返回的1。 第二个是列偏移量(如果您需要跳过几列来获取次要数据,则可能更多)。 CountIf是非常自我解释:)这基本上得到我们需要在最后的范围内,从起点的单元格的数量。

即 创build您的新的数据validation列表,使用ProfilesRange作为其源和您的辅助combobox已完成。

可能出现的问题:

  1. 当您更改Accounts Combobox时,configuration文件combobox可能会出错,因为configuration文件中的值不可能存在于新客户端中。 你可以忽略这个错误(一旦你从新刷新的下拉菜单中select了正确的值,或者当E2的值发生变化时,再抛出更多的VBA精灵粉尘来清除下拉单元格,它会自行修复。

  2. 数据validation列表compalains关于在尝试设置ProfilesRange时评估错误。 忽略这个错误并继续是安全的。 这基本上意味着ProfilesRange没有返回可计算的值(很可能是因为您没有selectAccountsRange中的任何实际计算到ProfilesRange的东西 – 当然假设您在此处使用的公式的实际单元格区域实际上是正确的)

感谢osknows的提示和forumlae的改进(在下面的评论中): 避免使用OFFSET,它的速度非常慢,而且是不稳定的。 = OFFSET($ D $ 2,0,0,COUNTA($ D $ 2:$ D $ 5000)可以replace为= $ D $ 2:INDEX($ D $ 2:$ D $ 5000,COUNTA($ D $ 2:$ D $ 5000) ) (这个提示已经被合并到这个解决scheme中,所以除非你检查版本历史,否则你不会看到原来的偏移forumlae)