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的元音规则比这个更复杂,有时它不是一个元音,而是一个元音的一部分,所以事情会变得非常快。