Excel:计算单元格中具有加倍(中文)字符的所有单元格

时间:2017-11-19 23:54:37

标签: excel excel-vba excel-formula chinese-locale vba

我列出了几千个中国品牌名称,每个单元格一个品牌名称,我试图计算这些名称中有多少使用双重字符,这意味着两个相同的汉字一个接一个。例如,这里列出了6个品牌名称(每个品牌都在自己的单元格中):

  1. 水晶晶
  2. 衣二三
  3. 五五
  4. 淘宝
  5. 哈哈哇
  6. 拉啪拉
  7. 数字1,3和5中有两个字符(晶晶,五五,哈哈),所以我想要一个返回数字“3”的公式,因为有三个单元格包含双重字符。 (请注意,虽然#6包含两个相同的字符 - 拉,两次 - 这些字符彼此不相邻,因此不会返回为真)。

    我认为字符是中文并不重要,计算双字母的公式也是一样的,例如:

    ABB
    CC
    FDDF

    字符不以空格分隔。我不了解VBA,但很高兴学习如何输入和运行脚本。

2 个答案:

答案 0 :(得分:1)

不要劝阻你学习VBA(这是一个很棒的技能!)但我想我会掀起一个VBA功能,你可以立即开始使用你的数据......一旦我们确认一切正常我我将给你一些链接来解释这个(简单)函数是如何工作的,以及其他一些好的初学者资源。 :)

从不使用汉字,但我做了一些研究。西方字母通常来自一组255个字符,称为ASCII。东部字母表来自一组65533个字符,称为Unicode。 ASCII字符每个占用1个字节的存储空间,而Unicode字符每个占用2个字节。

对于像我放在一起的文本功能,这意味着什么?我不完全确定!显然我应该使用不同的内置公式,但我的代码不适用于替代方法,但似乎工作得很好,就像我一直做的事情一样。

与“北美”相比,这可能与您的“完整”数据集以及计算机的语言设置相结合。从理论上讲,它应该可以正常工作,但我建议当你开始使用它时,计算一堆不同的单元格手动,以便你可以比较函数给你的数字,让我知道是否存在差异。 (如果你的名单不是“绝密”,如果你不介意的话,我有点想要一份副本;这对我来说都是陌生的[双关语意思]而且我想了解更多关于数据方面的差异。)

一小组中文字符还不是Unicode标准的一部分,但显然很少使用它们(通常用于地名?)但是你应该留意这一点。同样,它应该不是一个问题 - 理论上 - 因为怀疑“如果它们不是Unicode,你的计算机也不会有它们”(我认为!)Here is a link to a list有问题的字符。 / p>

无论如何,了解它是否正常运作的唯一方法就是尝试使用您的全套数据!

如何将VBA功能复制到模块中:

  1. 选择下面的VBA代码,然后按 Ctrl + C 进行复制。

  2. 转到Excel工作簿,然后按 Alt + F11 打开VBA编辑器(又名 VBE )。

  3. 点击VBE中的插入菜单,然后选择模块

  4. Ctrl + V 粘贴代码。

  5. 单击VBE中的调试菜单,然后选择**编译项目。 这会检查代码是否有错误。理想情况下“nothing”将会发生,这意味着它没有错误&很高兴。

  6. 关闭VBE窗口,右上角有“”。

  7. 保存您的工作簿,新功能随时可用! 有关示例用法,请参阅下面的屏幕截图。

  8. Public Function cellHasDups(str_In As String) As Boolean
    'returns TRUE if there are at least 2 identical characters in a row
    
        Dim x As Integer, prevChar As String, dupFound As Boolean
        On Error GoTo dError
    
        prevChar = ""
        dupFound = False
    
        For x = 1 To Len(str_In) 'compare each character to the previous
            If Mid(str_In, x, 1) = prevChar Then dupFound = True
            prevChar = Mid(str_In, x, 1)
        Next x
    
        cellHasDups = dupFound 'return T/F to the calling cell
        Exit Function
    
    dError:
        cellHasDups = False
    End Function
    
    
    Public Function rangeHasDups(rge_In As Range) As Long
    'returns the number of cells in the specified range that have duplicate characters
    'ashleedawg@outlook.com
    
        Dim c As Range, countDups As Long
    
        On Error GoTo dError
    
        countDups = 0
        'loop through all cells in selected range; run [cellHasDups] on each one and count "TRUE" responses
        For Each c In rge_In
            countDups = countDups + IIf(cellHasDups(c.Value), 1, 0)
        Next c
    
        rangeHasDups = countDups 'return total to the calling cell
        Exit Function
    
    dError:
        rangeHasDups = 0
    End Function
    

    该功能有两种变化。您可以将它们粘贴到模块中,并使用适合您需要的任何一个(或者如果有另一种方法更容易,我可以在此时轻松进行更改):

    • cellHasDups 检查单个单元格,如果单元格中有2个相同的字符,则返回TRUE,否则返回FALSE。

    • rangeHasDups 检查一小部分单元格(即A1:A20或A5:G99或A:A等)并返回一个具有重复字符的单元格数。

    ChineseDuplicateTest screen shot

    尝试一下,如果您有任何问题或疑问,请告诉我们!

答案 1 :(得分:0)

您可以运行此宏来实现此目的:

Sub countDoubles()

Dim Rrng As Range
Dim Rcell As Range
Dim cellArray(1 To 100) As Integer  //100 - The number of cells in the range
Dim i As Integer
Dim j As Integer
Dim count As Integer

On Error Resume Next
Set Rrng = Range("G10:G20")   //change this to the relevant range
j = 1

For Each Rcell In Rrng.Cells
    For i = 2 To Len(Rcell)
        If Mid(Rcell, i - 1, 1) = Mid(Rcell, i, 1) Then
            cellArray(j) = 1
            j = j + 1
            Exit For
        End If
    Next i
Next Rcell

For i = 1 To UBound(cellArray)
    count = count + cellArray(i)
    Next i
MsgBox (count)   //message box to show the number of double
End Sub