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

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

新規登録して質問してみよう
ただいま回答率
85.48%
if

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

VBScript

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

Q&A

解決済

2回答

2848閲覧

vbscriptのIF文とReplaceについて

piyotaka

総合スコア39

if

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

VBScript

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

0グッド

0クリップ

投稿2015/07/24 03:05

編集2015/07/24 04:05

コードの下の方にある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

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

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

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

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

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

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

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

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

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

投稿2015/07/28 12:18

jawa

総合スコア3013

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

  • 長すぎる

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

  • 変数の名前が雑すぎる

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

投稿2015/07/24 03:34

ozwk

総合スコア13521

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問