2017-02-09 10 views

答えて

0

OKを最後に、アルゴリズムは、式が

かなり長いです

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("ABCDEFGHIJKLMNOPQRSTUVWXYZ",ROW($1:$36),1),MID($A$1,SUM(LEN($B$1:B1))+2,9)&"ABCDEFGHIJKLMNOPQRSTUVWXYZ" )))) 

は、を使用して配列式として入力する必要があります。 trlシフトを入力します。式が9文字より長い場合は、9を増やす(またはlen($ a1)に変更する)必要があります。

enter image description here

ここだけでなく、私はVisual Basicでその教育を受けていないです(しかし、私はいくつかの知識を持っている)配列数式

=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("ABCDEFGHIJKLMNOPQRSTUVWXYZ",ROW($1:$36),1),MID($A1,SUMPRODUCT(LEN($B1:B1))+2,9)&"A"),1))) 
0

あなたはVBAに精通しているなら、あなたは、セルの値(例えばCl2H0)を読み込む関数を記述し、その後別々の値に文字列を分割するためにループができました。これらの分離した値(Cl、2、H、0)をExcelシートの個々の列に書き戻します。

これを行う1つの方法は、ループ内でAsc()関数を使用して、個々の文字に対応するAscii番号を与えることです。アスキーキャラクター65〜90はアッパーケースのキャラクターです。あなたの場合、文字列がこの範囲にないときに文字列を分割したいと思うでしょう。

これを試して、あなたの事例を投稿したいのであれば、VBAや他の手段でこれを達成しようとしているのであれば、より多くの指針を与えることができます。

+0

として入力する必要はありません短いバージョンです。私はvbscript.regexpコードを使って試してみましたが、これはほとんど問題なく、数字ではなく文字のみを区切ることです。 –

+0

私は非VBAソリューションを考案しようとしましたが、複数の数字を持つC6H10O5などの有機分子に遭遇しました。 –

+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 
関連する問題