如何分隔excel vba中的文本“CamelCase”和数字

我试图做一个分子组成计算器,但我可以似乎分开一个公式的大小写和数字到不同的单元格。

有没有可能在Excel中做到这一点?

例如:

Cl2HO ----> Cl | 2 | H | 0 

algorithm到底是非常简单的

 If at any point in the formula you have a number, then look for the next capital letter and output all characters up to that point. If at any point in the formula you have a letter, then look for the next capital letter *or number* and output all characters up to that point. 

这个公式相当长

 =IF(ISNUMBER(MID($A$1,SUM(LEN($B$1:B1))+1,1)+0), MID(MID($A$1,SUM(LEN($B$1:B1))+1,9),1,MIN(FIND( MID("ABCDEFGHIJKLMNOPQRSTUVWXYZ",ROW($1:$26),1),MID($A$1,SUM(LEN($B$1:B1))+2,9)&"ABCDEFGHIJKLMNOPQRSTUVWXYZ" ))), MID(MID($A$1,SUM(LEN($B$1:B1))+1,9),1,MIN(FIND( MID("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789",ROW($1:$36),1),MID($A$1,SUM(LEN($B$1:B1))+2,9)&"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" )))) 

必须使用Ctrl Shift Enter作为数组公式input ,如果公式长度超过9个字符,则需要增加(或变为len($ a1))。

在这里输入图像说明

这是一个不需要作为数组公式input的较短版本

 =IF(ISNUMBER(MID($A1,SUMPRODUCT(LEN($B1:B1))+1,1)+0), MID(MID($A1,SUMPRODUCT(LEN($B1:B1))+1,9),1,AGGREGATE(15,6,FIND( MID("ABCDEFGHIJKLMNOPQRSTUVWXYZ",ROW($1:$26),1),MID($A1,SUMPRODUCT(LEN($B1:B1))+2,9)&"A" ),1)), MID(MID($A1,SUMPRODUCT(LEN($B1:B1))+1,9),1,AGGREGATE(15,6,FIND( MID("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789",ROW($1:$36),1),MID($A1,SUMPRODUCT(LEN($B1:B1))+2,9)&"A"),1))) 

有点粗糙,但你可以写一个这样的parsing函数返回一个数组:

 Public Function parseChem(str As String) As Variant() 'should error-check first that entire string is correct Dim retArr() As Variant Dim i As Long, numBlocks As Long Dim currentChar As String, currentElement As String, typeOfChar As String Dim digitChain As Boolean For i = 1 To Len(str) currentChar = Mid(str, i, 1) typeOfChar = charType(currentChar) Select Case typeOfChar Case Is = "upperCase" If currentElement <> "" Then 'possibly cast numbers to longs here, and at the end... retArr(numBlocks) = currentElement End If numBlocks = numBlocks + 1 ReDim Preserve retArr(1 To numBlocks) currentElement = currentChar digitChain = False Case Is = "lowerCase" currentElement = currentElement & currentChar Case Is = "digit" If digitChain Then currentElement = currentElement & currentChar Else 'new digit block retArr(numBlocks) = currentElement numBlocks = numBlocks + 1 ReDim Preserve retArr(1 To numBlocks) digitChain = True currentElement = currentChar End If Case Else 'do something to flag error End Select Next i retArr(numBlocks) = currentElement parseChem = retArr End Function Private Function charType(str As String) As String Dim ascii As Long ascii = Asc(str) If ascii >= 65 And ascii <= 90 Then charType = "upperCase" Exit Function Else If ascii >= 97 And ascii <= 122 Then charType = "lowerCase" Exit Function Else If ascii >= 48 And ascii <= 57 Then charType = "digit" Exit Function End If End If End If End Function 

如果你熟悉VBA,那么你可以写一个读取单元格值的函数(比如Cl2H0),然后是一个将string分割成单独值的For循环。 然后,您可以将这些分离的值(Cl,2,H和0)写回excel表格中的单列。

这样做的一种方法是在循环中使用Asc()函数,该函数将为您提供与个别字符对应的Ascii数字。 Ascii Charachters 65至90是大写字母。 在你的情况下,当字符不在这个范围内时,你想分割string。

如果你想尝试这个,并发布你的例子,那么我可以给一些更多的指导,但是如果你想用VBA或其他方式来实现这个目标,就很难给出更多的build议。