2010年1月17日日曜日

第133回目 計算式作成のお手伝い(一般的な計算式、究極モドキ3)

○第133回目 計算式作成のお手伝い(一般的な計算式、究極モドキ3)

 第131回目での質問です。
□質問があります。計算式を修正する時に、計算式が長い場合は、全部が表示できないのではないでしょうか。また、文字数の制限はあるのでしょうか。
=⇒inputboxでの制限文字数は256バイトのようです。それより長いと駄目です。また、ご指摘のとおり、表示幅が小さいため、一覧できない場合があります。
□このマクロは、複雑な計算式の場合に力を発揮するというものだと思いますが、矛盾しませんか。

 表示幅の問題とプラスアルファを紹介します。
 inputoboxでの表示領域を拡大できないか、という問題の対応(アイデアレベル)は、簡単でした。
inputoboxの代わりに、ユーザーフォームのテキストボックスを使えばよいのです。
ユーザーフォームのマクロとモジュールでのマクロが行き来しますので、共通の変数はパブリック変数にしてください。、

テキストボックスはできるだけ大きく設定したほうがいいでしょう。ボタンは、『続ける』と、『終了』の二つです。ここでは、文字のフォントとサイズの指定が可能です。文字を大きく、そして自分の好きな字体での表示が可能となります。

イベントは4つになります。『初期化と値のセット』、『テキストの修正があった』、『続けるボタンが押された』、『終了ボタンが押された』、です。
 Private Sub UserForm_Initialize() 'ユーザーフォームを初期化する
  TextBox1.MultiLine = True '折り返し表示
  TextBox1.Text = p_aa '値をセットする。p_aaに計算式が入っている
 End Sub

 Private Sub TextBox1_Change() 'ボックス内に動きがあると動く
  p_aa = TextBox1.Text 'テキストを取得
 End Sub

 Private Sub CommandButton1_Click()
 '続けるボタンがクリックされた
  Unload Me 'ユーザーフォームを閉じる
  p_flag = 0
 End Sub

 Private Sub CommandButton2_Click()
 '終了ボタンがクリックされた
  Unload Me 'ユーザーフォームを閉じる
  p_flag = 9
 End Sub

表示するフォントに関しては、ユーザフォームを設計する画面に一緒に出てくるプロパティのFontで指定してください。

モジュール(通常のマクロを記述するところ)側では、こんな感じです。
'計算式へ文字の付加
p_aa = 複雑カッコ文の解析(keisansiki) 'この関数はカッコをランク付けして置き換えるものです。
UserForm3.Show
'ここでUserForm3のマクロに飛ぶ。そのマクロが終了すると戻る。
a = 複雑カッコをもとに戻す(p_aa)  'この関数はカッコをすべて小カッコに直すものです。
p1 = InStr(a, "=")
If p1 <> 0 Then 'イコールがあると置き換え、ないと末尾に追加とした
keisansiki = a
Else
keisansiki = keisansiki & a
End If
If p_flag = 9 Then Exit Do

 プラスアルファとは、上記でいうと"複雑カッコ文の解析(keisansiki)"という部分です。 第124回でカッコの置き換えをしましたが、それをすると複雑な計算式の構造が、少しわかりやすくなります。上記の例では、この機能を関数化して利用しています。反対の処理、すべて小カッコに戻すも同様です。
 
【今回のポイント】
・かなり長い計算式でも一覧できる。
・複雑な構造の計算式でも、カッコをランクごとに変えて表示するので、構造がわかりやすくなる。
・字体と字の大きさが代えられるので、見やすくなる。

※今回のやり方、ユーザフォームを使って表示領域を大きくするという基本の考え方は、他にも使えるかもしれません。
 Msgboxを使用すると、その表示位置がコントロールできません。大体は画面の真ん中に来るようです。どこかほかに出てきてほしいということが多々あると思います。これをユーザフォームを使うことで対応することが可能です。位置はモジュールマクロの中で記述します。

0 件のコメント: