问题描述
我在excel中只有一列,包含275个(单元)句子。现在我要对列进行排序
条件:我想基于修饰符列表对列进行排序。 修饰语列表:此列表包含关键字(每个单元格中有1个关键字),这些关键字可能存在于上述列中句子的开头,结尾或中间。
例如
父列
-
杰克住在村庄
-
如 jack
所述 -
罗斯已经与 jack 聊了昨晚
-
罗斯离开了村庄
-
玫瑰是他们的昨天
修饰符(列)
-
杰克
-
玫瑰
-
村庄
解决方法
这不是最干净的方法,但可能会有所帮助:
首先,您需要在修饰符列表上添加一个帮助列。您需要为每个修饰符指定一个唯一数值,作为第一个条件为最高值,最后一个条件为最低。
例如,我做了Jack
是最重要的,Rose
是第二重要,最后是Village
。
我的公式将检查该短语是否包含任何修饰词,如果有匹配项,则选择最大值,如果没有匹配项,则返回0。
我在B2中的公式是:
=SUMPRODUCT(MAX(COUNTIF(A2;"*"&$A$13:$A$15&"*")*$B$13:$B$15))
它是这样工作的:
-
COUNTIF(A2;"*"&$A$13:$A$15&"*")
将返回1和o的数组,如果该短语是否包含修饰词。例如,词组Jack lives in the village
将返回{1;0;1}
(Rose
修饰符不存在) - 我们将上一步的数组乘以其修饰符值,因此添加了
*$B$13:$B$15
。所以我们做{1;0;1} * {3;2;1}= {3;0;1}
- 有了
MAX
,我们从上一步中获得了最高价值(我们获得了3
),这就是那句话的重要性。 -
SUMPRODUCT
刚刚添加,因此我们可以作为数组公式并求和最大值。
获得后,使用该列从最高到最低对短语进行排序。
如果您从修饰符列表中更改值,请从最高到最低再次排序:
现在请注意,我为包含Rose
的短语赋予了更多价值,因此它们首先被排序。
按包含的值排序
- 使用
Parent
列表对Modifier
列表进行排序。 - 代码模拟如下内容:获取
Modifier
的第一个值,并检查它是否包含在Parent
的任何项目中。如果是,则将当前的Parent
值写入Result
列表中。然后,它取Modifier
的第二个值并执行相同的操作...最后,将其余部分(不匹配的项)写入Result
并将Parent
替换为{{1} }。
说明
- 将文件另存为启用宏的工作簿(
Result
)。 - 打开 Visual Basic编辑器(VBE)( CTRL + F11 )。
- 在项目资源管理器中找到您的文件。右键单击其中的任意位置,然后选择
.xlsm
。 - 将以下代码复制到打开的窗口中(通常为
Insert Module
)。 - 调整代码常量部分中的值以满足您的需要,即调整前3个值对。在每对中,第一个值是指
Module1
列的位置,而第二个值是指Parent
列的位置。 - 保存文件:在 VBE 或 Excel 中。
- 要从 VBE 运行代码,可以使用
Modifier
或按“播放”按钮,也可以使用 F5 。 - 要从 Excel 运行代码,请使用
Run>Run Sub
并找到Developer>Macro
。双击它或选择它,然后单击“运行”。 - 此外,您可以创建一个按钮来运行代码。
代码
sortByCriteria