Excel VBAparsingstring中的元音
我有一个由辅音和元音组成的5char alphastring列表。 我试图找出每个string中的组合。
例如,DBNJE是CCCCV,AHOIS是VCVVC。
我把它写成了一系列5个相当笨拙的公式来评估string中的5个字符的C或V属性,如下
CHAR1
=IF(OR(LEFT($B2,1)="A",LEFT($B2,1)="E",LEFT($B2,1)="I",LEFT($B2,1)="O",LEFT($B2,1)="U"),"V","C")
和
CHAR2
=IF(OR(MID($B2,2,1)="A",MID($B2,2,1)="E",MID($B2,2,1)="I",MID($B2,2,1)="O",MID($B2,2,1)="U"),"V","C")
等等
跟我到目前为止?
然后我把结果串联在一个单元格中,就像上面第一个例子中给出的那样。
这工作正常,但我想使用VBA自动化。 有谁能告诉我这样做的最好方法吗?
提前致谢!
我也会跳上潮stream…这将检查每个字符的ASCII码值,忽略AZ范围之外的任何内容。
Public Function GetPattern(ByRef rng As Excel.Range) Dim str As String ' the value being parsed Dim ret As String ' the return value for the function Dim i As Long Const C As String = "C" Const V As String = "V" Dim char As String str = Trim(UCase(rng.Value)) For i = 1 To Len(str) char = Mid(str, i, 1) 'Ignores numbers and non-printing characters, symbols, etc. If 65 <= Asc(char) And Asc(char) <= 90 Then Select Case Asc(char) Case 65, 69, 73, 79, 85 'Ascii codes for A, E, I, O, U ret = ret & V Case Else ret = ret & C End Select End If Next GetPattern = ret End Function
将这个函数插入到一个模块中,并在单元格中input“= Words(”reference“),其中”reference“是一个包含你想要处理的string的单元格,也可以放入一个子程序循环遍历你的单元格的string,但你需要提供更多的信息。
Function Words(str as String) as String Dim str as String Dim result as string Dim i as Integer For i = 1 to Len(str) If Mid(str,i,1) like [aeiouAEIOU] then Result = "V" & Result Else Result = "C" & Result End if Words = Result End Function
这里没什么特别的。 此代码将进入一个模块,并从包含输出数据的单元格引用。
Public Function ConsonantVowel(ByVal sInputString As String) As String Dim sReturnData As String Dim x As Integer sReturnData = "" x = 1 While x <= Len(sInputString) If UCase(Mid(sInputString, x, 1)) = "A" Or UCase(Mid(sInputString, x, 1)) = "E" Or UCase(Mid(sInputString, x, 1)) = "I" _ Or UCase(Mid(sInputString, x, 1)) = "O" Or UCase(Mid(sInputString, x, 1)) = "U" Then sReturnData = sReturnData & "V" Else sReturnData = sReturnData & "C" End If x = x + 1 Wend ConsonantVowel = sReturnData End Function
我创build了一个用户定义的函数来循环string中的字符,并返回一个C(如果它是一个辅音)和一个V(如果它是一个元音)。
将下面的代码放在一个标准的VBA模块中:
Function ConsonantOrVowel(strWord As String) As String Dim nLen As Integer nLen = Len(strWord) ConsonantOrVowel = "" For i = 1 To nLen If UCase(Mid(strWord, i, 1)) Like "[AEIOU]" Then ConsonantOrVowel = ConsonantOrVowel + "V" Else ConsonantOrVowel = ConsonantOrVowel + "C" End If Next i End Function
接下来,在Excel单元格中input公式=ConsonantOrVowel(A1)
就像您使用常规公式一样。 (请注意,前面的示例假定您要testing的string在单元格A1中)。
这是一个使用正则expression式定义元音的方法
- 用波浪号
~
replace所有的元音 - 用
C
代替所有不是代字符号的东西 - 用
V
代替波浪号
Option Explicit Function VorC(S As String) As String Dim RE As Object Dim sTemp As String Set RE = CreateObject("vbscript.regexp") With RE .Global = True .ignorecase = True .Pattern = "[AEIOU]" End With sTemp = RE.Replace(S, "~") RE.Pattern = "[^~]" sTemp = RE.Replace(sTemp, "C") VorC = Replace(sTemp, "~", "V") End Function
如果你想包括偶尔的Y
作为一个元音,并且很高兴在被两个辅音包围的情况下称其为元音,那么可以将第一个正则expression式replace例程改为:
With RE .Global = True .ignorecase = True .Pattern = "[AEIOU]|([^AEIOU])Y([^AEIOU])" End With sTemp = RE.Replace(S, "$1~$2")
并保持UDF的其余部分不变。
然而, Y
的元音规则比这个更复杂,有时它不是一个元音,而是一个元音的一部分,所以事情会变得非常快。