为单元格中的每个字符分配一个特定的值,并在Excel中求和

时间:2018-07-27 17:26:22

标签: excel excel-vba

我想根据单元格中字符串的值创建一个唯一ID,方法是为每个字符分配一个值,然后将单元格中字符的值相加以获得一个数字。

例如,如果A = 1,B = 2,C = 3,D = 4;包含ABBCD的单元格为1 + 2 + 2 + 3 + 4,总和为12。所以该单元格的值将为12。在excel中最简单的方法是什么?

1 个答案:

答案 0 :(得分:0)

我将假定这不是任何一种解决方案,但是如果您试图将数字简单地分配给字母并求和,那么这并不是一个特别复杂的问题。希望通过给出答案并讨论如何满足或不满足您的需求,我们可以找出最佳选择。这是一个公式,将1分配给“ A”,2分配给“ B”等,并在它们出现在字符串中时求和。我不知道它是否可以处理原始字符串中其他16个字符,但希望可以。

=SUM(CODE(MID(UPPER(A1),ROW(INDIRECT("1:"&LEN(A1))),1))-64)

这是一个数组公式。

enter image description here

由于我正在对此进行更新,所以我可能会补充说,斯科特·克兰纳(Scott Craner)的评论所提供的公式不是数组公式,这样可以减少问题的发生。


修改

上面的内容旨在成为一个半思考的稻草人,因为其中没有什么可以避免重复的值,并且实际上并没有进行重大测试。但是,为了使其更加宽容并处理可能包含在原始代码中的空格和其他字符,我将进行一些更改。

我首先将SUM替换为SUMPRODUCT,这样它就不会像Scott Craner所建议的那样成为数组公式。原始公式将所有空格都视为-32,但是我想我们可能希望始终增加该值,而不是让某些字符增加该值而另一些减少它。因此,我将其更改为仅调整字母的ASCII码。

我在下面提议的是,对于字母,我们通过从其值中减去64来给它们提供1到26的值。然后,对于非字母字符,我建议保留其实际的ASCII码。

此公式可以做到:

=SUMPRODUCT(CODE(MID(UPPER(A1),ROW(INDIRECT("1:"&LEN(A1))),1)))-SUMPRODUCT((CODE(MID(UPPER(A1),ROW(INDIRECT("1:"&LEN(A1))),1))<91)*(CODE(MID(UPPER(A1),ROW(INDIRECT("1:"&LEN(A1))),1))>64)*64)

它的作用是从所有ASCII值的总和开始,然后仅对从“ A”到“ Z”(含)的那些字符减去64。 (A为ASCII 65,Z为ASCII90。)由于通常从1到26的ASCII字符是控制代码,因此该代码不应与初始代码中可能遇到的任何实际字符重叠。

我要根据此更改添加一张带有旧值和新值的图表图片。

我应该注意,作为该测试的一部分,我更改了工作表中不明显的内容。在外观上,第6行和第9行显然是相同的,但是它们对于旧公式和新公式都产生不同的值。这是因为第6行有四个尾随空格,它们会影响新旧计数。我曾经考虑过使用TRIM函数,但是该函数不仅删除尾随空格,还删除前导空格并将中间空格限制为单个空格。如果确实需要删除尾随空格而又不影响其余原始代码,则可以在VBA中创建一个公共函数来调用其RTrim函数。

请记住,不会检查重复项。

Revised Formula

我在上面的最后一条评论让我感到担忧,因为如果您确实想要独特的价值并且您拥有大量物品,那么您将不一定能发现出现“约翰·韦恩”和“韦恩·约翰”两件事的地方使用相同的代码表示不同的值。尽管根据我们如何分配代码,我没有办法确保代码的唯一性,但我认为我会添加一种方法,至少可以提醒他们。通过了解这些重复的任务,也许您可​​以手动解决这些任务,如果它们不是很多或很常见。

我仅在B列中使用较新的公式来设置电子表格,并在C列中添加了一个公式以标识其中存在另一行具有相同数字代码但原始代码不同的行。由于大写和小写被认为是相同的,因此这非常简单。我在C列中使用的公式是:

=IF(COUNTIFS(B:B,"="&B1,A:A,"<>"&A1)>0,"Not Unique","")

这产生了第三个结果:

Identifying Potential Errors

请记住,第6行末尾有4个额外的空格,因此在数值上与第12行具有相同的总和(每个单词之间有两个空格)。还要注意,尽管第3行和第15行看起来不同,但由于只是大小写不同,因此它们被视为相同的代码。并非每个具有“非唯一”的单元都会有问题。例如,第1、2和10行都被标记,但是第1行和第10行适当匹配;只是它们与第2行不匹配。