2013-04-21 102 views
0

我想从分组值的索引中创建一个列表。
这与this非常相似,但是我的团队也有“标签”,这使得列表变得复杂。Excel从开始和结束编号和标记创建列表

这里是我的索引标签的例子:

| A | B | C | D | 
------------------------- 
1 | 1 | 1 | 1 | CV | 
2 | 1 | 2 | 2 | IS | 
3 | 1 | 3 | 3 | IS | 
4 | 2 | 4 | 5 | GN | 
5 | 2 | 6 | 7 | PS | 
6 | 4 | 8 | 11 | SQ | 
7 | 2 | 12 | 13 | SS | 
8 | 1 | 14 | 14 | AT | 
9 | 15 | 15 | 29 | AT | 
10| 4 | 30 | 33 | TYP | 

其中A是页面的数量,B是第一页,C是最后一页和d是标签。我还想添加一些列,以便保持标签的运行状态。

| A | B | C | D | E | F | 
--------------------------------------- 
1 | 1 | 1 | 1 | CV | CV1 | CV1 | 
2 | 1 | 2 | 2 | IS | IS1 | IS1 | 
3 | 1 | 3 | 3 | IS | IS2 | IS2 | 
4 | 2 | 4 | 5 | GN | GN1 | GN2 | 
5 | 2 | 6 | 7 | PS | PS1 | PS2 | 
6 | 4 | 8 | 11 | SQ | SQ1 | SQ4 | 
7 | 2 | 12 | 13 | SS | SS1 | SS2 | 
8 | 1 | 14 | 14 | AT | AT1 | AT1 | 
9 | 15 | 15 | 29 | AT | AT2 | AT16 | 
10| 4 | 30 | 33 | TYP | TYP1 | TYP4 | 

请注意,该标记可能会出现多次,并且可能不在连续的行中。

这是我想这个看起来像我的列表选项卡:

| A | 
--------- 
1 | CV1 | 
2 | IS1 | 
3 | IS2 | 
4 | GN1 | 
5 | GN2 | 
6 | PS1 | 
7 | PS2 | 
8 | SQ1 | 
9 | SQ2 | 
10| SQ3 | 
11| SQ4 | 
and so on... 

如何通过公式中的附加列添加到索引选项卡?
如何通过公式创建LIST? (......这甚至有可能吗?)

+1

你应该说明一个具体的问题,不论是开始还是结束。 – Justin 2013-04-21 02:07:34

+0

......我想如果你开始评论给出的答案,那么你会得到一些反馈,然后事情可能开始朝着你需要的方向行进 – whytheq 2013-04-21 12:10:04

+0

列'F'是什么意思?例如什么是'AT16'? – whytheq 2013-04-21 12:18:22

回答

0

听起来好像你只是试图在一张单独的表格上获得一个“唯一值”列表,你可以用它作为你的列表。试试这些页面,有多种VBA方法来粘贴范围内的独特项目。

此外,高级过滤器还可以将唯一值粘贴到其他位置。因此,您的重复标签不会出现在此列表中,只有您的“列表”选项卡才具有唯一的标签。

无论如何,不​​知道这是你想要的,但问题是一个模糊的smidge。

链接在这里:
Create Unique list
Create Unique list 2

1

的公式应该是很简单的写。只要考虑你想要完成的事情。

您的第一个公式(在E列中)只是对标签的运行计数(在D列中)。所以你要计算从第一个标签到标签名称相同的相应标签的所有单元格。该计数将被附加到标签名称。

=$D1 & COUNTIF($D$1:$D1, $D1) 

第二个公式(在F列中)只是计算页数(在列A中)的运行总和。因此,您希望从第一个标记到标记名称相同的相应标记之间的所有相应页面计数的总和。总和将被附加到标签名称上。

=$D1 & SUMIF($D$1:$D1, $D1, $A$1:$A1) 

请注意,列不会更改,也不会更改范围的起始行(因此需要使用绝对范围)。唯一改变的是标签的行和结束范围的行。


我不认为这将有可能通过简单的公式生成该列表。据我所知,公式需要与另一个范围具有1对1的对应关系。一个范围可以产生多个值,所以一个公式不会削减它。您需要编写一个VBA脚本来生成该脚本。

Sub GenerateList() 

    Dim usedRange As Range 
    Dim count As Dictionary 

    Set usedRange = Worksheets("Index").usedRange 
    Set count = CountValues(usedRange) 

    Dim output As Range 
    Dim row As Integer 
    Dim key As Variant 

    Set output = Worksheets("List").Columns("A").Rows 
    output.ClearContents 
    row = 1 
    For Each key In count.Keys() 
     Dim i As Integer 

     For i = 1 To count(key) 
      output(row) = key & i 
      row = row + 1 
     Next i 
    Next key 

End Sub 
Function CountValues(_ 
     usedRange As Range, _ 
     Optional tagsColumn As String = "D", _ 
     Optional valuesColumn As String = "A") As Dictionary 

    Dim tags As Range 
    Dim values As Range 

    Set tags = usedRange.Columns(tagsColumn).Rows 
    Set values = usedRange.Columns(valuesColumn).Rows 

    Dim map As New Dictionary 
    Dim tag As Range 
    For Each tag In tags 
     map(tag.Value) = map(tag.Value) + values(tag.row) 
    Next tag 

    Set CountValues = map 

End Function 

这将使用Dictionary所以你必须引用脚本运行。

+0

+1这看起来很有趣 - 我稍后会仔细看看 – whytheq 2013-04-21 12:09:07