家・車以外で、人生で一番奮発した買い物

Vbaで数式をポーランド記法に変換するコードを作って実行しようとするとフリーズします。
そのコードの一部です。
Sub 関数電卓SuperNova()
Calculator.Show vbModeless '//ウィンドウを表示
Dim rpn As String
rpn = GetRPN("a*b+c*d")
End Sub

Function GetRPN(ByVal formula As String) As String

Dim sequencelist As Variant: sequencelist = Factorize_char(formula) '//Factorize_charは文字列を1文字ずつに分解した配列に返す関数
Dim resultbuilder As New StringBuilder '//javaのStringbuilderの代わり
Dim stack() As String
Dim i As Long, c As Long, k As Long


For i = 0 To UBound(sequencelist)

Select Case sequencelist(i)

Case "+", "-"

Do While Not IsArrayEx(stack) = 0 '//IsArrayEx(stack)が0で配列が空、1で要素あり

Select Case stack(0)

Case "*", "/"
resultbuilder.Append (CStr(ArrayShift(stack))) '//ArrayShiftは配列の先頭を消去
Case Else
Exit Do
End Select

Loop

If IsArrayEx(stack) = 0 Then
ReDim stack(0)
stack(0) = sequencelist(i)
Else
c = ArrayUnShift(stack, sequencelist(i)) '//ArrayUnShiftは配列の先頭に追加
End If

Case "*", "/", "("

If IsArrayEx(stack) = 0 Then
ReDim stack(0)
stack(0) = sequencelist(i)
Else
c = ArrayUnShift(stack, sequencelist(i))
End If

Case ")"
Dim index As Long: index = ArrayIndexof(stack, "(") '//ArrayIndexofは配列から特定文字列の位置を調べる

Dim workstack() As String
For k = 0 To index

If Not ArrayShift(stack) = "(" Then

If IsArrayEx(workstack) = 0 Then
ReDim workstack(0)
workstack(0) = sequencelist(i)
Else
c = ArrayPush(workstack, ArrayShift(stack)) '//ArrayPushは配列の後ろに追加
End If

End If

Next k

Do While Not IsArrayEx(workstack) = 0
resultbuilder.Append (ArrayShift(workstack))
Loop

Case Else
resultbuilder.Append (sequencelist(i))

End Select

Next i

Do While Not IsArrayEx(stack) = 0
resultbuilder.Append (ArrayShift(stack))
Loop

GetRPN = resultbuilder.ToString

End Function

質問者からの補足コメント

  • すいません、それは関係ないみたいです。While文で引っかかってフリーズしていることが判明しました。

    No.1の回答に寄せられた補足コメントです。 補足日時:2022/05/24 18:20

A 回答 (1件)

こんにちは


経験のないプログラムですが、フリーズする現象で覚えのある事柄を・・

コード内にはありませんが、vbModeless でフォームを表示している場合
RefEditを使うとフリーズする事を思い出しました
vbModelessで表示しているのでセル選択などで取得しているのかも、
と想像しました。
全然関係ないと思いますが・・・参考まで
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報