在尝试使您在答案中发布的解决方案失败后,我创建了自己的解决方案。
正如我认为创建一个状态机将解决问题,它完美适用于 1x1 单元,这就是我想要的:
源代码
Function isChar(char As String) As Boolean
Select Case char
Case "A" To "Z"
isChar = True
Case Else
isChar = False
End Select
End Function
Function isNumber(char As String, isZero As Boolean) As Boolean
Select Case char
Case "0"
If isZero = True Then
isNumber = True
Else
isNumber = False
End If
Case "1" To "9"
isNumber = True
Case Else
isNumber = False
End Select
End Function
Function GetCells(str As String) As String
Dim stringArray() As String
Dim stringSize As Integer 'size of stringArray
Dim c As Integer 'character number
Dim chr As String 'current character
Dim tempcell As String 'suspected cell's temporaly result
Dim state As Integer 'state machine's state:
'0 - nothing
'1 - 1 character eg. A from A1
'2 - 2 character eg. AG from AG156
'3 - 3 character eg. AGH from AGH516516
'4 - characters with number(s) eg. AH15 from AH1569
'5 - first dollar sing eg. $ from $A$1
'6 - second sollar sing eg. $A$ from $A$1
Dim testresult As String
state = 0
stringSize = 0
For c = 0 To Len(str) Step 1
chr = Mid(str, c + 1, 1)
Select Case state
Case 0
If isChar(chr) Then
state = 1
tempcell = tempcell & chr
ElseIf chr = "$" Then
state = 5
tempcell = tempcell & chr
Else
state = 0
tempcell = ""
End If
Case 1
If isNumber(chr, False) Then
state = 4
tempcell = tempcell & chr
ElseIf isChar(chr) Then
state = 2
tempcell = tempcell & chr
ElseIf chr = "$" Then
state = 6
tempcell = tempcell & chr
Else
state = 0
tempcell = ""
End If
Case 2
If isNumber(chr, False) Then
state = 4
tempcell = tempcell + chr
ElseIf isChar(chr) Then
state = 3
tempcell = tempcell + chr
ElseIf chr = "$" Then
state = 6
tempcell = tempcell + chr
Else
state = 0
tempcell = ""
End If
Case 3
If isNumber(chr, False) Then
state = 4
tempcell = tempcell + chr
ElseIf chr = "$" Then
state = 6
tempcell = tempcell + chr
Else
state = 0
tempcell = ""
End If
Case 4
If isNumber(chr, True) Then
state = 4
tempcell = tempcell + chr
Else
state = 0
stringSize = stringSize + 1
ReDim Preserve stringArray(stringSize)
stringArray(stringSize - 1) = tempcell
tempcell = ""
End If
Case 5
If isChar(chr) Then
state = 1
tempcell = tempcell + chr
Else
state = 0
tempcell = ""
End If
Case 6
If isNumber(chr, False) Then
state = 4
tempcell = tempcell + chr
Else
state = 0
tempcell = ""
End If
Case Else
state = 0
tempcell = ""
End Select
Next c
'GetCells = stringArray
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'This part is only for easily print the string array
For c = 0 To stringSize Step 1
testresult = testresult + " | " + stringArray(c)
Next
GetCells = testresult
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
End Function
Sub Main()
Dim s As String
s = "A1+B1+$A1-$B$65"
MsgBox (GetCells(s))
s = "(A5*2+HJ$15)-((F5+F1)-$F11+$PP$659)"
MsgBox (GetCells(s))
'also some crazy input
s = "A$61+$HK2+'p0thecakeisalie/0p'+DDD5+D1-$B$12-LCK$5065"
MsgBox (GetCells(s))
End Sub
测试
我创建了一些测试,以便您可以看到它的实际效果。前两个是模拟日常使用,而第三个是一些疯狂的输入,但算法仍然适用。
情况1
- 输入:
A1+B1+$A1-$B$65
- 输出:
| A1 | B1 | $A1 | $B$65 |
案例2
- 输入:
(A5*2+HJ$15)-((F5+F1)-$F11+$PP$659)
- 输出:
| A5 | HJ$15 | F5 | F1 | $F11 | $PP$659 |
案例3
- 输入:
A$61+$HK2+'p0thecakeisalie/0p'+DDD5+D1-$B$12-LCK$5065
- 输出:
| A$61 | $HK2 | DDD5 | D1 | $B$12 | LCK$5065 |