0

我正在尝试从分组值的索引创建一个列表。这与此
非常相似,但是我的组也有“标签”,这会使列表复杂化。

这是我的 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?(……这可能吗?)

4

2 回答 2

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

这使用了 a Dictionary,因此您必须引用脚本运行时。

于 2013-04-21T10:46:30.727 回答
0

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

此外,高级筛选器可以选择将唯一值粘贴到另一个位置。因此,您的任何重复标签都不会出现在此列表中,只有您的“列表”选项卡中的唯一标签。

无论如何,不​​确定这是否是您想要的,但问题有点模糊。

此处的链接:
创建唯一列表
创建唯一列表 2

于 2013-04-21T03:45:26.100 回答