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

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

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

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

1回答

649閲覧

VBAで()内の個所から優先的に計算していく書き方がわかりません

4_n_3_8

総合スコア10

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

1クリップ

投稿2019/04/06 04:39

新人SEです。

teratailは初利用のため、このような質問の仕方が正しいのかがわからないのですが、下記のような点で困っています。
ボールドテキスト

学習のため、エクセルシートにボタン、フォームを張り付けて電卓を作成しているのですが
VBAで
()
でくくった部分から先に計算していくような作りにするにはどうすればいいでしょうか?

・スタックを利用する、という方法が1案としてあるのですが、
コードに書き起こす際にどのように書けば良いのかがわかりません

コード例などもご教授いただければ助かります。

プログラミング経験が浅いもので何卒、よろしくお願い申し上げます。

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

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

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

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

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

coco_bauer

2019/04/06 05:19

作ろうとしている電卓の仕様が判りません。四則演算のボタン[+ - * / ]と、括弧のボタン[( )]があるという事なのですか? 「()でくくった部分」というのは、どういう形式で、どこにあるのですか? スタックをどのように利用しようとしているのですか? 自分が何をしたいかを、人に判るように説明してください。
4_n_3_8

2019/04/06 05:35

四則演算のボタンと[+ - * / ]と、括弧()のボタンがあるということです。 数字、四則演算同様、括弧()のボタンを押せば計算結果を出力するセルの値末尾に括弧()が追加されます。 (すみません、本文ではフォームと書きましたが入力値、計算結果の表示はセルで行います) スタックについては調べていますが、ロジックの理解がまだできていないのではネットで調べたけど使い方やロジックが組めていないです。 よろしくお願いいたします。
sazi

2019/04/06 05:49 編集

()がある場合に困っているという事ですか? では、四則演算部分のロジック(またはコード)は質問に追記されて下さい。
4_n_3_8

2019/04/06 06:28

ありがとうございます 急用のため、外出中でして・・・ 帰宅し次第すぐに詳細を記述しますので、何卒よろしくお願い申し上げます
4_n_3_8

2019/04/06 14:56 編集

帰宅いたしましたので投稿させていただきます。 コードをそのまま載せるのは自分でもいかがなものか(読みにくいかも?)と思うのですが、現時点で書けたのは下記です。 何卒よろしくお願い申し上げます。 Dim w As Double Dim sWaku Private Sub ボタン0_Click() If (Range("C1") = "0") Then Set Target = Range("C1") Target.Value = "0" Else Set Target = Range("C1") Target.Value = Target.Value & "0" End If End Sub Private Sub ボタン1_Click() '0の場合表示文字が1 'MsgBox (Range("C1")) If (Range("C1") = "0") Then Set Target = Range("C1") Target.Value = "1" Else Set Target = Range("C1") Target.Value = Target.Value & "1" End If End Sub Private Sub ボタン2_Click() If (Range("C1") = "0") Then Set Target = Range("C1") Target.Value = "2" Else Set Target = Range("C1") Target.Value = Target.Value & "2" End If End Sub Private Sub ボタン3_Click() If (Range("C1") = "0") Then Set Target = Range("C1") Target.Value = "3" Else Set Target = Range("C1") Target.Value = Target.Value & "3" End If End Sub Private Sub ボタン4_Click() If (Range("C1") = "0") Then Set Target = Range("C1") Target.Value = "4" Else Set Target = Range("C1") Target.Value = Target.Value & "4" End If End Sub Private Sub ボタン5_Click() If (Range("C1") = "0") Then Set Target = Range("C1") Target.Value = "5" Else Set Target = Range("C1") Target.Value = Target.Value & "5" End If End Sub Private Sub ボタン6_Click() If (Range("C1") = "0") Then Set Target = Range("C1") Target.Value = "6" Else Set Target = Range("C1") Target.Value = Target.Value & "6" End If End Sub Private Sub ボタン7_Click() If (Range("C1") = "0") Then Set Target = Range("C1") Target.Value = "7" Else Set Target = Range("C1") Target.Value = Target.Value & "7" End If End Sub Private Sub ボタン8_Click() If (Range("C1") = "0") Then Set Target = Range("C1") Target.Value = "8" Else Set Target = Range("C1") Target.Value = Target.Value & "8" End If End Sub Private Sub ボタン9_Click() If (Range("C1") = "0") Then Set Target = Range("C1") Target.Value = "9" Else Set Target = Range("C1") Target.Value = Target.Value & "9" End If End Sub Private Sub ボタンmns_Click() ' MsgBox ("-") If ((Right((Range("C1")), 1) <> "+") And (Right((Range("C1")), 1) <> "-") And (Right((Range("C1")), 1) <> "*") And (Right((Range("C1")), 1) <> "/")) Then Set Target = Range("C1") Target.Value = Target.Value & "-" Else End If End Sub Private Sub ボタンpls_Click() ' MsgBox Right((Range("C1")), 1) If ((Right((Range("C1")), 1) <> "+") And (Right((Range("C1")), 1) <> "-") And (Right((Range("C1")), 1) <> "*") And (Right((Range("C1")), 1) <> "/")) Then ' MsgBox ("+") Set Target = Range("C1") Target.Value = Target.Value & "+" Else End If End Sub Private Sub ボタンkake_Click() If ((Right((Range("C1")), 1) <> "+") And (Right((Range("C1")), 1) <> "-") And (Right((Range("C1")), 1) <> "*") And (Right((Range("C1")), 1) <> "/")) Then ' MsgBox ("*") Set Target = Range("C1") Target.Value = Target.Value & "*" Else End If End Sub Private Sub ボタンwari_Click() If ((Right((Range("C1")), 1) <> "+") And (Right((Range("C1")), 1) <> "-") And (Right((Range("C1")), 1) <> "*") And (Right((Range("C1")), 1) <> "/")) Then ' MsgBox ("/") Set Target = Range("C1") Target.Value = Target.Value & "/" Else End If End Sub Private Sub ボタンeql_Click() If (Right((Range("C1")), 1) <> "+") And (Right((Range("C1")), 1) <> "-") And (Right((Range("C1")), 1) <> "*") And (Right((Range("C1")), 1) <> "/") Then ' MsgBox ("=") Set Target = Range("C1") Target.Value = "=" & Target.Value ' MsgBox (Target.Value) Else End If ' End If End Sub
sazi

2019/04/06 16:44

質問やコメントは編集できます。 コメントは削除して、マークダウンで、質問に追記してください。
guest

回答1

0

電卓の仕様が不明ですが、
テキストボックスに括弧を含む式が入力されるようになっているなら、
Evaluateメソッドを使えば四則演算の優先規則に従った計算をしてくれます。

Application.Evaluate メソッド (Excel) | Microsoft Docs

VBA

1Dim 式 As String 2 3式 = "3*(2+3)" 4Msgbox Application.Evaluate(式) '「15」と表示 5 6式 = "3+3*2" 7Msgbox Application.Evaluate(式) '「9」と表示

それともExcelの機能を使うのではなく、アルゴリズムの勉強のために自分でコードを書きたいということでしょうか。

だとしたら、普通の数式(中置記法といいます)を逆ポーランド記法(後置記法)に変換してから計算するというアルゴリズムが有名です。

上記をキーワードに検索すると解説ページが見つかるのでそれで勉強されるといいと思います。

投稿2019/04/06 06:23

hatena19

総合スコア33715

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

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

4_n_3_8

2019/04/06 06:30

逆ポーランド法をキーワードに調査いたします。 ヒントをくださりありがとうございます。 何卒よろしくお願い申し上げます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問