Excel:动态内容的相关下拉列表

时间:2011-05-31 10:59:33

标签: excel

我已按以下格式从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

我需要的是一个包含唯一帐户名称的下拉列表,然后是第二个下拉列表,其中包含所选帐户的相关配置文件。看起来像这样:

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

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

我将如何做到这一点?

1 个答案:

答案 0 :(得分:4)

只要您拥有此列表按帐户排序 ,您就可以混合使用Offset CountA来为您提供所有范围你需要。

步骤将是:

一个。从“帐户”列中获取唯一值(我在此步骤中使用VBA,但您也可以使用“频率”公式将其混合 - 如果您可以使用VBA,我会避免使用它)。一些事情:

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

(我从我的worksheet_change事件中调用了这个以方便,但是如果你使用vba来提取G.A.数据,只需要集成到那里)

湾将此Feed提供给具有forumla AccountsRange的命名范围(说=$D$2:INDEX($D$2:$D$5000,COUNTA($D$2:$D$5000))) - 这假设您为上一步指定了D1TargetCell,且唯一值不会更多超过4999(在我的情况下,第一个值是行标题 - 因此从D2开始)

℃。添加此命名范围AccountsRange作为数据验证列表的来源 - 此时您的帐户组合框已完成。我假设你把这个组合框放在E2中,我将在此基础上构建第二个ComboBox

d。使用公式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会抱怨无效公式,只需重新键入$A$1部分COUNTIF它应该没问题

A2是G.A.的帐户专栏的开头。导入的数据(A1是标题,假设此处最多有4999个数据行)E2是之前AccountsRange下拉步骤中的Comboboxed单元格。需要在Match步骤中的-1,因为第一个值行的偏移量必须为0,而从Match返回的偏移量不需要为1。第二个是列偏移(如果您需要跳跃多个列以获取辅助数据,则可以更多)。 CountIf非常自我解释:)这基本上可以从起点获得我们在最终范围内所需的单元格数。

即创建新的数据验证列表,使用ProfilesRange作为源,并完成辅助组合框。

可能出现的问题:

  1. 当您更改Accounts Combobox时,Profiles组合框可能会出错,因为配置文件中的值不太可能出现在新客户端中。您可以忽略错误(一旦从新刷新的下拉列表中选择正确的值,它就会自行修复,或者在E2中值更改时,在那里抛出更多的VBA仙尘以清除下拉单元格。

  2. 数据验证列表包含有关在尝试设置ProfilesRange时评估错误的问题。忽略此错误并继续是安全的。它基本上意味着ProfilesRange没有返回任何可计算的内容(很可能是因为你没有在AccountsRange中选择任何实际计算到ProfilesRange的东西 - 当然假设你这里使用的公式的实际单元格范围实际上对你的工作表是正确的)

  3. 感谢osknows提示他在论坛上的提示和改进(在下面的评论中):避免使用OFFSET,它在很大的范围内非常慢并且是不稳定的。 = OFFSET($ D $ 2,0,0,COUNTA($ D $ 2:$ D $ 5000)可替换为= $ D $ 2:INDEX($ D $ 2:$ D $ 5000,COUNTA($ D $ 2:$ D $ 5000) )对于命名范围。(此提示现已合并到此解决方案中,因此除非您检查版本历史记录,否则您将看不到原始的Offset forumlae)