Excel从开头和结尾编号和标记创建列表

时间:2013-04-21 01:43:04

标签: excel excel-vba excel-formula vba

我正在尝试从分组值的索引创建列表 这与this非常相似,但是我的群组也有“标记”,这使列表变得复杂。

以下是我的INDEX标签的示例:

  | 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 |

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

以下是我希望LIST选项卡显示的内容:

  | 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...

如何通过公式将其他列添加到INDEX选项卡?
如何通过公式创建LIST? (......这甚至可能吗?)

2 个答案:

答案 0 :(得分:1)

编写公式应该非常简单。只要考虑一下你想要完成的事情。

你的第一个公式(在E栏中)只是对标签进行运行计数(在D栏中)。因此,您希望将第一个标记中的所有单元格计数到标记名称相同的相应标记。该计数将附加到标记名称。

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

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

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

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


我认为不可能通过简单的公式生成该列表。据我所知,公式需要与另一个范围一一对应。单个范围可以产生多个值,因此公式不会削减它。您需要编写一个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,因此您必须引用脚本运行时。

答案 1 :(得分:0)

听起来您只是想在单独的工作表上获取“唯一值”列表,您可以将其用作列表。尝试这些页面,有多种VBA方法可以粘贴范围内的唯一项目。

此外,高级过滤器还可以选择将唯一值粘贴到其他位置。因此,此列表中不会出现任何重复标记,只有“LIST”标签中的唯一标记。

无论如何,不​​确定这是不是你想要的,但问题是模糊不清。

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