質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.48%

  • VBScript

    233questions

    VBScript(Visual Basic Scripting Edition)はMicrosftが開発したスクリプト言語であり、Visual Basicのサブセットです。

  • if

    212questions

    if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

vbscriptのIF文とReplaceについて

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 826

piyotaka

score 23

コードの下の方にあるIF文を使って、Replaceを使って置換しているのですが、置換した後にその置換した内容を保持したまま次の置換ができる方法はないでしょうか?

演算子を置換することにより、電卓のような何でも計算ができるプログラムにしたいと考えています。

足りない部分があったら、修正依頼お願いします。






B = Inputbox("式を入力してください。"&vbCr&_        
vbCr&_
"※『=』は必要ありません。"&vbCr&_
  "掛け算は『*』、割り算は『/』を使用してください。","数式の入力")

'Bに入力情報を入れ、For文とMidで一文字ずつ配列に入れる。
Y = Len(B)
i = 0

For i = 0 To Y - 1
 A(i) = Mid(B,i+1,1)

'iが演算子の時に、-1することにより0~i-1の部分までを変数に入れる。
If InStr(A(i),"+") Or InStr(A(i),"-") Or InStr(A(i),"*") Or InStr(A(i),"/")  Then
 

 For j = 0 To i - 1 

x = CStr(x) + CStr(A(j))

Next

Exit  For

End If

Next


'iが演算子時に、+1することにより0~i+1を変数に入れる
If InStr(A(i),"+") Or InStr(A(i),"-") Or InStr(A(i),"*") Or InStr(A(i),"/")  Then
 

 For j2 = 0 To i + 1 

x2 = CStr(x2) + CStr(A(j2))

Next


End If




’入力情報から出した変数で手に入れた部分を空白にし、空白を削除。
UKE = Replace(B,x2,"")
OK = Trim(UKE)

MsgBox "x="&x
MsgBox "x2="&x2
MsgBox "UKE="&UKE
MsgBox "OK="&OK



Y2 = Len(OK)
i2 = 0


For i2 = 0 To Y2 - 1
 A2(i2) = Mid(OK,i2+1,1)
 
 If InStr(A2(i2),"+") Or InStr(A2(i2),"-") Or InStr(A2(i2),"*") Or InStr(A2(i2),"/")  Then
 

 For j3 = 0 To i2 - 1 
 
 x3 = CStr(x3) + CStr(A2(j3))

Next

Exit For 

End If

Next
 
 
'★まで繰り返し。
 For i3 = 0 To Y2 - 1
 A3(i3) = Mid(OK,i3+1,1)
 
 If InStr(A3(i3),"+") Or InStr(A3(i3),"-") Or InStr(A3(i3),"*") Or InStr(A3(i3),"/")  Then
 

 For j4 = 0 To i3 + 1 

x4 = CStr(x4) + CStr(A3(j4))

Next

Exit For


End If

Next



UKE2 = Replace(OK,x4,"")
OK2 = Trim(UKE2)



'MsgBox "x3="&x3
'MsgBox "x4="&x4
'MsgBox "UKE2="&UKE2
'MsgBox "OK2="&OK2





Y3 = Len(OK2)
i4 = 0


For i4 = 0 To Y3 - 1
 A4(i4) = Mid(OK2,i4+1,1)
 
 If InStr(A4(i4),"+") Or InStr(A4(i4),"-") Or InStr(A4(i4),"*") Or InStr(A4(i4),"/")  Then
 

 For j5 = 0 To i4 - 1 
 
 x5 = CStr(x5) + CStr(A4(j5))

Next

Exit For 

End If

Next
 
 
 

For i5 = 0 To Y3 - 1
 A5(i5) = Mid(OK2,i5+1,1)
 
 If InStr(A5(i5),"+") Or InStr(A5(i5),"-") Or InStr(A5(i5),"*") Or InStr(A5(i5),"/")  Then
 

 For j6 = 0 To i5 + 1 
 
 x6 = CStr(x6) + CStr(A5(j6))

Next

Exit For 

End If

Next
 

 UKE3 = Replace(OK2,x6,"")
OK3 = Trim(UKE3)
 
 
 
 'MsgBox "x5="&x5
'MsgBox "x6="&x6
'MsgBox "UKE3="&UKE3
'MsgBox "OK3="&OK3

Y4 =Len(OK3)
i6 = 0



For i6 = 0 To Y4 - 1
A6(i6) = Mid(OK3,i6+1,1)


If InStr(A6(i6),"+") Or InStr(A6(i6),"-") Or InStr(A6(i6),"*") Or InStr(A6(i6),"/")  Then
 

For j7 = 0 To i6 - 1 
 
 x7 = CStr(x7) + CStr(A6(j7))

Next

Exit For 

End If

Next
 

For i7 = 0 To Y4 - 1
 A7(i7) = Mid(OK3,i7+1,1)
 
 If InStr(A7(i7),"+") Or InStr(A7(i7),"-") Or InStr(A7(i7),"*") Or InStr(A7(i7),"/")  Then
 

 For j8 = 0 To i7 + 1 
 
 x8 = CStr(x8) + CStr(A7(j8))

Next

Exit For 

End If

Next
 

 UKE4 = Replace(OK3,x8,"")
OK4 = Trim(UKE4)
 
 
 
'MsgBox "x7="&x7
'MsgBox "x8="&x8
'MsgBox "UKE4="&UKE4
'MsgBox "OK4="&OK4
'★これで、数値だけの変数と数値と演算子が入った変数ができる。

'A8 = CDbl(x)+CDbl(x3)+CDbl(x5)+CDbl(x7)+CDbl(OK4)

'Y5 = Len(CDbl(x)+CDbl(x3)+CDbl(x5)+CDbl(x7)+CDbl(OK4))

'ここから主題。
'例えばA="+"、B=1,C=1として、
'D=BACでD=2にはならない。
'なので、Replaceで一つ一つ置換していこうと思う。
'しかし、置換した内容は保存されず、元に戻ってしまう。
'尚、Eval関数は使用不可とする。
If InStr(x2,"+") Then

A8 = Replace("CDbl(x)#CDbl(x3)$CDbl(x5)&CDbl(x7)%CDbl(OK4)","#","+")

If InStr(x2,"-") Then

A8 = Replace("CDbl(x)#CDbl(x3)$CDbl(x5)&CDbl(x7)%CDbl(OK4)","#","-")


If InStr(x2,"*") Then

A8 = Replace("CDbl(x)#CDbl(x3)$CDbl(x5)&CDbl(x7)%CDbl(OK4)","#","*")


If InStr(x2,"/") Then

A8 = Replace("CDbl(x)#CDbl(x3)$CDbl(x5)&CDbl(x7)%CDbl(OK4)","#","/")


End If
End If
End If
End If


If InStr(x4,"+") Then

A8 = Replace("CDbl(x)#CDbl(x3)$CDbl(x5)&CDbl(x7)%CDbl(OK4)","$","+")

If InStr(x4,"-") Then

A8 = Replace("CDbl(x)#CDbl(x3)$CDbl(x5)&CDbl(x7)%CDbl(OK4)","$","-")


If InStr(x4,"*") Then

A8 = Replace("CDbl(x)#CDbl(x3)$CDbl(x5)&CDbl(x7)%CDbl(OK4)","$","*")

If InStr(x4,"/") Then

A8 = Replace("CDbl(x)#CDbl(x3)$CDbl(x5)&CDbl(x7)%CDbl(OK4)","$","/")


End If
End If
End If
End If


'MsgBox "Y5="&Y5
MsgBox "A8="&A8
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

他の方も指摘されていますが、変数名が適当すぎて自分でもコードが追い切れなくなっているのではないでしょうか?
変数に格納される値や型を把握できていないような箇所も見受けられます。(不要な型変換など)
また最終的にやりたいことも、今回の置換ではない気がしています。

変数名をいちいち考えるのは面倒だと思えるかもしれませんが、適当な変数名で作ったプログラムをあとから読み直すとき、毎回頭の中で変数の意味を思いだしながら読み解くほうがよほど面倒ですし、何倍も時間が掛かってしまいます。
メンテナンス性も落としてしまい、無駄なコードやバグも産みやすくなるでしょう。

まずは面倒ですが、変数名を整理するところから始めてみてはいかがでしょうか?
例えば最初の変数Bですが、自分ならstrInputのように型と変数の意味がわかる変数名をつけます。
これだけで変数に入る値の流れが読みやすくなりますし、他の人が見たときに説明がなくても理解しやすいものになります。

※試しに私もこの機能を実現するプログラムを独自に作成してみましたが、見やすいようにコメント多めで
作成しても半分程度のステップ数で目的の機能が実現できましたよ。

■本題■
小言のような前置きが長くなりましたが、本題についてのアドバイスです。
おそらく置換結果を格納したいであろう変数A8の値の流れを追ってみてください。

「置換した内容は保存されず、元に戻ってしまう」というのは、この変数A8に対し、常に固定文字列"CDbl(x)#CDbl(x3)$CDbl(x5)&CDbl(x7)%CDbl(OK4)"から特定記号を置換した結果で上書きしているからではないでしょうか?

置換した結果に対してさらに置換を行いたいのであれば、この固定文字部分は常に最新の変換結果でなければいけません。
置換結果のA8を使って置換してみてください。 A8 = Replace(A8,…)

コーディングの理解を深めるための課題か何かだと思いますのでこちらで作成したサンプル等は掲載しませんが、頑張ってみてください。


投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

質問の答えではありません
コードから大混乱しているのはよく伝わります。
そんな状態で継ぎ足そうとしても破綻します。
ざっくりと問題点を挙げます。

  • 長すぎる
処理のまとまりごとに関数作ってください。
この意味がわからないようなら、あなたがやろうとしていることは
あなたの学習段階を二、三段すっ飛ばしてます。
せめて「ここから何をどうしている」的なコメントを書いてください。

  • 変数の名前が雑すぎる
変数の名前をわざと滅茶苦茶にして他人がコードを読むのを防ぐ技術があります。
あなたのコードは既にそんな感じです。
例えばx4は何を表す変数ですか?
説明できるなら説明そのままの変数名にしてください。
説明できないなら自分がやりたいことを他人がわかるようにしっかりまとめてください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • VBScript

    233questions

    VBScript(Visual Basic Scripting Edition)はMicrosftが開発したスクリプト言語であり、Visual Basicのサブセットです。

  • if

    212questions

    if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。