私は分子組成計算機を作ろうとしていますが、別のセルに大文字と数字で数式を分けているようです。どのように "CamelCase"と数値によってExcel vbaのテキストを区切りますか
これはExcelで可能ですか?
例:
Cl2HO ----> Cl | 2 | H | 0
私は分子組成計算機を作ろうとしていますが、別のセルに大文字と数字で数式を分けているようです。どのように "CamelCase"と数値によってExcel vbaのテキストを区切りますか
これはExcelで可能ですか?
例:
Cl2HO ----> Cl | 2 | H | 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)に変更する)必要があります。
ここだけでなく、私は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)))
あなたはVBAに精通しているなら、あなたは、セルの値(例えばCl2H0)を読み込む関数を記述し、その後別々の値に文字列を分割するためにループができました。これらの分離した値(Cl、2、H、0)をExcelシートの個々の列に書き戻します。
これを行う1つの方法は、ループ内でAsc()関数を使用して、個々の文字に対応するAscii番号を与えることです。アスキーキャラクター65〜90はアッパーケースのキャラクターです。あなたの場合、文字列がこの範囲にないときに文字列を分割したいと思うでしょう。
これを試して、あなたの事例を投稿したいのであれば、VBAや他の手段でこれを達成しようとしているのであれば、より多くの指針を与えることができます。
ビットの粗しかし、あなたは配列を返します。このような解析関数書くことができます:
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
として入力する必要はありません短いバージョンです。私はvbscript.regexpコードを使って試してみましたが、これはほとんど問題なく、数字ではなく文字のみを区切ることです。 –
私は非VBAソリューションを考案しようとしましたが、複数の数字を持つC6H10O5などの有機分子に遭遇しました。 –
続行してください –