我有一个 Excel 电子表格,其中列出了学生参加过的研讨会和课程(精简版),如下所示:
(A)___ClassName________|(B)_________Tags____________|
Astrobiology | astro, bio, sci |
Extremophiles | chem, bio, sci |
Human Space Habitation | astro, bio, med, engi, sci | etc.
我希望能够从中提取单个标签,并在另一张表上获取每个标签的关联计数,例如上述内容:
__Tag__|_Frequency_|
astro | 2 |
bio | 3 |
sci | 3 |
chem | 1 | etc.
我一直试图只使用函数来做到这一点,我可以获得一个唯一的标签列表字符串(例如“astro, bio, sci”)使用
{=INDEX(User1!Tags,MATCH(0,COUNTIF($A$1:A1,User1!Tags),0))}
但我无法成功提取标签本身。如果可能的话,我希望文件不包含“宏警告”,但我对 Excel 还不熟悉,所以如果我操作错误,请告诉我!
这可能吗?
答案1
我不完全确定这就是您要问的,但我会尝试一下。在 B 列附近创建不同的列,每列分别命名为“astro”“bio”...并在每列下方使用此公式 =FIND($C$1;astro) 例如,如果文本中包含单词“astro”,则显示一个数字,否则显示错误,在每列末尾使用 =COUNT(),它将显示在 B 列中锯切 astro 的次数。
希望这有帮助!
答案2
然后将您的标签列复制到新表:
- 主页>编辑-查找和选择、替换[空格](“一个”字符)、全部替换、确定、关闭。
- 数据 > 数据工具 - 文本到列,选择分隔,下一步,检查逗号,完成。
- 插入两个新列,例如 A 和 B。
- 创建 47 个唯一值的列表(从上面或“手动”) - 比如在新插入的 ColumnA 中,从 Row1 开始。
- =COUNTIF(范围,A1) 在 B1 中并按要求抄下,其中范围是包含所有单独标签条目的数组(可能从 开始
C1
),并且在整个过程中使用固定引用定义(即“$”符号)。 - 根据需要选择整个工作表,复制/粘贴特殊/值并删除 C 列及右侧列。
- 节省。
第一步可能不是必需的,但其目的是删除可能干扰计数的空格。
答案3
所以我被这个问题迷住了,想弄清楚如何使用宏来解决这个问题。我知道你说你想避免使用宏,但我不相信这可以仅通过函数来实现。
下面的代码循环遍历单元格 B2:B25(可以编辑或更改为参数或选定单元格,但目前看来这似乎最容易)。它使用名为 KeyValue 的自定义类来聚合标签名称和出现次数。这可以通过使用 Dictionary 对象来改进,但这需要其他插件。它将逗号分隔的标签与每个单元格分开并计算频率。然后它将此列表输出到第二张工作表的前两列。
要添加代码,您必须执行以下操作。首先,您需要在工作簿上启用开发人员工具栏,然后单击按钮Visual Basic
。然后添加一个新的类模块并将其命名为KeyValue
。粘贴以下代码:
Public Key As String
Public Value As Integer
Public Sub Init(k As String, v As Integer)
Key = k
Value = v
End Sub
然后在Sheet1上添加以下代码:
Public Sub CountTags()
Dim kv As KeyValue
Dim count As Integer
Dim tag As String
Dim tags As New Collection
Dim splitTags As Variant
For Each Cell In Sheet1.Range("B2:B25")
' Split the comma separated list and process each tag
splitTags = Split(Cell.Value, ", ")
For tagIndex = LBound(splitTags) To UBound(splitTags)
tag = splitTags(tagIndex)
' If tag is in collection get new count otherwise start at 1.
If Contains(tags, tag) Then
Set kv = tags(tag)
count = kv.Value + 1
tags.Remove tag
Else
count = 1
End If
' Add tag to the collection with its count.
Set kv = New KeyValue
kv.Init tag, count
tags.Add kv, tag
Next
Next Cell
Dim rowIndex As Integer
rowIndex = 1
For Each pair In tags
Set kv = pair
Sheet2.Cells(rowIndex, 1) = kv.Key
Sheet2.Cells(rowIndex, 2) = kv.Value
rowIndex = rowIndex + 1
Next pair
End Sub
Private Function Contains(col As Collection, Key As Variant) As Boolean
Dim obj As Variant
On Error GoTo err
Contains = True
Set obj = col(Key)
Exit Function
err:
Contains = False
End Function
单击“运行”按钮来计算标签数量。