Excel公式/VBA需求:判断单元格字符是否全含于另一单元格(含频次匹配)
检查单元格字符及对应频次是否完全包含于另一单元格的解决方案
Excel公式解法
兼容所有Excel版本的数组公式
使用SUMPRODUCT结合字符替换统计频次,判断A1中所有字符的出现次数是否均不超过B1:
=SUMPRODUCT(--(LEN(A1)-LEN(SUBSTITUTE(UPPER(A1),MID(UPPER(A1),ROW(INDIRECT("1:"&LEN(A1))),1),""))>LEN(B1)-LEN(SUBSTITUTE(UPPER(B1),MID(UPPER(A1),ROW(INDIRECT("1:"&LEN(A1))),1),"")))=0
- 逻辑说明:
UPPER()统一转换为大写,避免大小写差异影响判断- 逐个提取A1中的字符,用
LEN(SUBSTITUTE())统计该字符在A1和B1中的出现次数 - 对比每对字符的频次,若存在A1频次>B1的情况,
SUMPRODUCT会返回大于0的数值,最终判断为FALSE;反之返回TRUE
- 使用注意:输入公式后需按
Ctrl+Shift+Enter(旧版Excel数组公式触发方式)
Excel 365/2021简化版(动态数组)
利用UNIQUE和SEQUENCE函数简化公式,无需手动触发数组:
=AND(LEN(A1)-LEN(SUBSTITUTE(UPPER(A1),UNIQUE(MID(UPPER(A1),SEQUENCE(LEN(A1)),1)),""))<=LEN(B1)-LEN(SUBSTITUTE(UPPER(B1),UNIQUE(MID(UPPER(A1),SEQUENCE(LEN(A1)),1)),"")))
- 逻辑说明:通过
UNIQUE提取A1中的不重复字符,仅对比这些字符的频次,减少重复计算
VBA自定义函数解法
如果公式写法过于复杂,可创建自定义函数实现更直观的频次对比:
Function IsCharsIncludingFrequency(source As String, target As String) As Boolean Dim charCountSource As Object Dim charCountTarget As Object Dim c As String Dim i As Integer Set charCountSource = CreateObject("Scripting.Dictionary") Set charCountTarget = CreateObject("Scripting.Dictionary") ' 统一转换为大写,忽略大小写差异 source = UCase(source) target = UCase(target) ' 统计源单元格(A1)的字符频次 For i = 1 To Len(source) c = Mid(source, i, 1) If charCountSource.Exists(c) Then charCountSource(c) = charCountSource(c) + 1 Else charCountSource(c) = 1 End If Next i ' 统计目标单元格(B1)的字符频次 For i = 1 To Len(target) c = Mid(target, i, 1) If charCountTarget.Exists(c) Then charCountTarget(c) = charCountTarget(c) + 1 Else charCountTarget(c) = 1 End If Next i ' 校验每个字符的频次是否符合要求 For Each c In charCountSource.Keys ' 若目标单元格无该字符,或源单元格频次更高,直接返回FALSE If Not charCountTarget.Exists(c) Or charCountSource(c) > charCountTarget(c) Then IsCharsIncludingFrequency = False Exit Function End If Next c ' 所有字符校验通过,返回TRUE IsCharsIncludingFrequency = True End Function
- 使用方法:
- 按下
Alt+F11打开VBA编辑器 - 插入新模块,粘贴上述代码
- 返回Excel,在单元格中输入
=IsCharsIncludingFrequency(A1,B1)即可得到结果
- 按下
示例验证
- 当A1为
TRSAR,B1为JHTRHASUBR时:
A1字符频次:T(1)、R(2)、S(1)、A(1)
B1字符频次:T(1)、R(2)、S(1)、A(1)
所有字符频次均满足要求,返回TRUE - 若B1中R的出现次数为1(小于A1的2次),则返回
FALSE
内容的提问来源于stack exchange,提问作者papen
相关产品推荐
相关产品推荐

