如何将excel vba中的文本与“CamelCase”和数字分开

时间:2017-02-09 13:38:16

标签: excel excel-formula numbers camelcasing

我正在尝试制作一个分子组成计算器,但我似乎可以将一个公式和数字分成不同的单元格。

是否可以在Excel中执行此操作?

例如:

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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

如果您熟悉VBA,那么您可以编写一个读取单元格值的函数(例如Cl2H0),然后编写一个将字符串拆分为单独值的For循环。然后,您可以将这些单独的值(Cl,2,H和0)写回excel表上的单个列。

这样做的一种方法是在循环中使用Asc()函数,它将为您提供与单个字符对应的Ascii数字。 Ascii charachters 65到90是Upper Case charachters。在你的情况下,当charachter不在这个范围内时,你会想要分割字符串。

如果您想尝试这个并发布您的示例,那么我可以提供更多指导,但如果您试图通过VBA或其他方式实现此目的,则很难给出更多建议,而无需先了解。

答案 2 :(得分:0)

好的算法到底是非常简单的

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 输入作为数组公式输入,9需要增加(或更改为len($ a1) )如果公式超过9个字符。

enter image description here

这是一个不需要输入数组公式的较短版本

=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)))