Excel:统计单元格内所有出现双字(汉字)的单元格

Excel: Count all cells that have doubled (Chinese) characters within the cell

我有一个包含几千个中文品牌名称的列表,每个单元格一个品牌名称,我正在尝试计算这些名称中有多少使用了双字,即两个相同的汉字一个接一个地使用。例如,这里有 6 个品牌名称的列表(每个品牌名称都在其自己的单元格中):

  1. 水晶
  2. 衣二三
  3. 五五
  4. 淘宝
  5. 哈哈哇
  6. 拉帕拉

数字 1、3 和 5 中有两个字符(晶晶、五五、哈哈),所以我想要一个 return 数字“3”的公式,因为有三个单元格包含双字符的。 (请注意,尽管 #6 包含两个相同的字符 - 拉,两次 - 这些字符彼此不相邻,因此不会 return 为真)。

我猜汉字是不是汉字并不重要,计算双字母的公式是一样的,比如:

A​​BB
抄送
FDDF

字符之间没有 space 分隔。我不知道 VBA,但很高兴学习如何输入和 运行 脚本。

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

从未使用过汉字,但我做了一些研究。西方字母表通常来自一组 255 个字符,称为 ASCII。东方字母来自一组 65533 个字符,称为 Unicode。 ASCII 字符每个占用 1 个字节space,而 Unicode 字符每个占用 2 个字节

这对我放在一起的文本函数意味着什么?我不完全确定!显然我应该使用与平时不同的内置公式,但我的代码无法使用替代方法,但似乎按照我一直做事的方式工作得很好。

这可能与您的 "complete" 数据集不同,并且您的计算机语言设置与北美相比有所不同。从理论上讲,它应该工作得很好,但我建议当你开始使用它时,手动 计算一堆不同的单元格 这样你就可以比较函数给你的数字,如果有差异,请告诉我。 (如果你的列表不是 "top secret",如果你不介意的话,我有点想要一份副本;这对我来说都是陌生的 [双关语],我想了解更多关于数据方面的差异。)

一小部分汉字还不是 Unicode 标准的一部分,但显然它们很少被使用(通常用于地名?),但你应该留意一下。同样,这在理论上应该不是问题,因为怀疑 "if they aren't in Unicode, your computer won't have them either"(我认为!)Here is a link to a list 个有问题的字符。

无论如何,要确定它是否正常工作的唯一方法是尝试你的全套数据!


如何将 VBA 函数复制到模块中:

  1. Select 下面的 VBA 代码,然后按 Ctrl+C 到复制.

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

  3. 单击 VBE 中的 Insert 菜单,然后选择 Module

  4. 点击Ctrl+V粘贴代码。

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

  6. 关闭VBE window右上角的“

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

.

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

该函数有 2 个变体。您可以将它们都粘贴到一个模块中,并使用适合您需要的任何一个(或者如果有另一种更简单的方法,此时我可以轻松进行更改):

  • cellHasDups 检查单个单元格,如果单元格连续有 2 个相同的字符,则 returns TRUE,否则 returns FALSE .

  • rangeHasDups 检查单元格范围(即 A1:A20 或 A5:G99 或 A:A 等)和 returns 具有重复字符的单元格计数。

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

你可以运行这个宏来实现:

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