Excel:统计单元格内所有出现双字(汉字)的单元格
Excel: Count all cells that have doubled (Chinese) characters within the cell
我有一个包含几千个中文品牌名称的列表,每个单元格一个品牌名称,我正在尝试计算这些名称中有多少使用了双字,即两个相同的汉字一个接一个地使用。例如,这里有 6 个品牌名称的列表(每个品牌名称都在其自己的单元格中):
- 水晶
- 衣二三
- 五五
- 淘宝
- 哈哈哇
- 拉帕拉
数字 1、3 和 5 中有两个字符(晶晶、五五、哈哈),所以我想要一个 return 数字“3”的公式,因为有三个单元格包含双字符的。 (请注意,尽管 #6 包含两个相同的字符 - 拉,两次 - 这些字符彼此不相邻,因此不会 return 为真)。
我猜汉字是不是汉字并不重要,计算双字母的公式是一样的,比如:
ABB
抄送
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 函数复制到模块中:
Select 下面的 VBA 代码,然后按 Ctrl+C 到复制.
转到您的 Excel 工作簿,然后按 Alt+F11 打开 VBA 编辑器(又名 VBE)。
单击 VBE 中的 Insert 菜单,然后选择 Module。
点击Ctrl+V粘贴代码。
单击 VBE 中的 调试 菜单,然后选择“**编译项目”。
这会检查代码是否有错误。理想情况下 "nothing" 会发生,这意味着它没有错误并且很好。
关闭VBE window右上角的“✘”
保存您的工作簿,新功能随时可用!
请参阅下面的屏幕截图以了解用法示例。
.
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
我有一个包含几千个中文品牌名称的列表,每个单元格一个品牌名称,我正在尝试计算这些名称中有多少使用了双字,即两个相同的汉字一个接一个地使用。例如,这里有 6 个品牌名称的列表(每个品牌名称都在其自己的单元格中):
- 水晶
- 衣二三
- 五五
- 淘宝
- 哈哈哇
- 拉帕拉
数字 1、3 和 5 中有两个字符(晶晶、五五、哈哈),所以我想要一个 return 数字“3”的公式,因为有三个单元格包含双字符的。 (请注意,尽管 #6 包含两个相同的字符 - 拉,两次 - 这些字符彼此不相邻,因此不会 return 为真)。
我猜汉字是不是汉字并不重要,计算双字母的公式是一样的,比如:
ABB
抄送
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 函数复制到模块中:
Select 下面的 VBA 代码,然后按 Ctrl+C 到复制.
转到您的 Excel 工作簿,然后按 Alt+F11 打开 VBA 编辑器(又名 VBE)。
单击 VBE 中的 Insert 菜单,然后选择 Module。
点击Ctrl+V粘贴代码。
单击 VBE 中的 调试 菜单,然后选择“**编译项目”。 这会检查代码是否有错误。理想情况下 "nothing" 会发生,这意味着它没有错误并且很好。
关闭VBE window右上角的“✘”
保存您的工作簿,新功能随时可用! 请参阅下面的屏幕截图以了解用法示例。
.
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