[[20080731100228]] 『TextBoxを参照』(ぶんコ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

 『TextBoxを参照』(ぶんコ)
 いつもお世話になっております。。
 ユーザーフォームをつくり、下記の数式が作ったのですが、うまくいきません。
 どこに問題があるか添削して頂けないでしょうか。
 どうぞ宜しくお願い致します。

 Private Sub CommandButton10_Click()
 TextBox11.Value = [=VLOOKUP(VALUE(LEFT(Me.TextBox2.Text,3)),客先番号!$A$:$B$,2,FALSE)]
 End Sub

 自分ではMe.TextBox2の表現の仕方に問題があるような気がします。。


 []がそもそも何を意味するのか調べてみましょう!!

 実務では、[]は、使う箇所が限定されると思いますよ!!
 長いけど、Evaluateという記述の方が使い道が多いかと思います。

 TextBox1.Value = _
     Application.Evaluate("=VLOOKUP(VALUE(LEFT(""" & _
                 TextBox2.Text & _
                 """ ,3)),sheet1!$A:$B,2,FALSE)")

 数式があっていれば、これでどうでしょうか?

 ichinose

 ichinoseさま
 ありがとうございます!出来ました!
 Evaluateについて調べたら、
 「Evaluate メソッドでの利点は、引数が文字列であることです。つまり、引数として指  定する文字列をコード内で生成したり、あるいは、Visual Basic の変数を使うことがで
 きます。」とありましたが、私には???です。
 ユーザーフォームでTextBox等を参照する時に使うのでしょうか?
 あと、[]なのですが、実務ではコードを実行する際、セルに数式ではなく、値を入力す
 る時に使っています。。。ユーザーフォームでは必要ないと言うことでしょうか?
 (ぶんコ)

 ichinoseさま
[[20070212134849]]『Evaluate Method の研究』(seiya)さま
 を見つけました。又、お手間をとらせてしまう所でした。
 この度はありがとうございました!
 (ぶんコ)


 解決後ですが・・・。

 Vlookupなら、Evaluateを使わなくても

 Private Sub CommandButton1_Click()
    Dim ans As Variant
    ans = Application.VLookup(Val(Left(TextBox2.Value, 3)), _
                              Worksheets("sheet1").Range("a:b"), _
                              2, False)
    If Not IsError(ans) Then '検索して見つかった場合だけテキストボックスに表示
       TextBox1.Value = ans
       End If
 End Sub

 こっちのほうが良いでしょうかねえ!!
 上記のようにワークシート関数の中には、VBA上でもApplicationのメソッドとして使用できるものが
 ありますから、よく調べてみてください。

 今回は、↑上記のコードで良いと思いますが、
 関数や数式によってはEvaluateでないと結果を出さない場合があります。

 私は、愛用していますが、リンク先にもありましたが、あまり複雑な数式だと 変更時に面倒だったり
 わかりづらかったりします(コメントの記述が不可欠になります)。
 このあたりを分別するのは やっぱり経験ですねえ!!

 ichinose


 ichinoseさま

 コードご提示ありがとうございます。上記の数式も実行できました!
 Dim ans As Variantみたいな何かを宣言してコードを実行するのは不勉強でよくわかりません。。
 前回の配列関数なら理解できるのですが、もっと勉強して理解出来るように頑張りたいと思います!
 コメントの記述も大切ですね。。参考になりました。

 それとお聞きしたいのですが、
 ichinoseさまに提示して頂いた、
      TextBox11.Value = Evaluate("=VLOOKUP(VALUE(LEFT(""" & TextBox2.Text & """ ,3)),客先番号!$A:$B,2,FALSE)")
 ですが、
      TextBox11.Value = [=VLOOKUP(VALUE(LEFT(""" & TextBox2.Text & """ ,3)),客先番号!$A:$B,2,FALSE)]
 にしたら実行出来なくなるのはなぜでしょうか?[]はEvaluateの略式なのですよね。。
 不勉強でお手間を取らせてしまいますが、どうぞ宜しくお願い致します。
 (ぶんコ)


 新規ブックを用意してみてください。
 セルに数式や関数が入力できますよね?

 例えば, セルA1 =row(b2)  と指定すると、 2と数式が結果を返してくれます。
 []内は、このセルに数式を入力する時と同様に記述しなければなりません。

 上記の例でセルに 
 =row(&b2&) も

 ましてや文字列形式や外のコントロールの引用で

 "=row(" & textbox1.text & ")"

 とは、指定できませんよね?

 しかし、VBAでは、外のコントロールの中身を引用して数式を組み立てる場合は、

 Evaluate()の()内に文字列として作成すれば、それを評価してくれます。

 evaluate("=row(" & textbox1.text & ")")

 Evaluateは、ワークシート関数のIndirectに似ていますが、Evaluateのほうが評価の幅がひろいです。

 因みに

 >>実務では、[]は、使う箇所が限定されると思いますよ!!

 と以前の投稿で書きました(実は、こういうサイトの簡単な例題コード掲載時には使っていますが)。

 これは、[]を使ってしまうと[]の中身を文字列のように & を使って編集できないからです。

 固定で決まっている セル(A1)ならば、Range("A1") より、[A1]のほうが楽なのですが、
 Excel/VBA内でRange("・・・")という表記をしなくても済むことは殆どありませんから、
 同じ種類のオブジェクトを違う表記で扱うことを防ぐために[A1]という表記を私はしていません。

 使う場合は、私の場合は、現在時刻を取得する場合ぐらいです。

 vbaにも、Now()関数がありますが、すこしでも詳細に時刻を取得したい時に
 ワークシート関数のNow()をVBAコード内で表記する時に [now()]
 という表記を使います。
 これに関しては、別サイトですが

 http://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=15057;id=excel

 以前こんな投稿をしたことがありました。

 このEvaluateメソッドは、結構な優れものだと私は思っています。
 元々の機能は、Helpには 「使用する名前を、オブジェクトまたは値に変換します。」

 記述されています。この説明では、理解しきれないくらいの機能を有していますよね?

 ichinose

 


 ichinoseさま

 初心者にも判りやすく講義して頂き、ありがとうございます!
 やっと、理解出来ました。
 <これは、[]を使ってしまうと[]の中身を文字列のように & を使って編集できないからです。
 ・・・なるほど!!!です。。。。
 これまで「ユーザーフォーム内でtextboxに他のtextboxを含ませた計算値を表示させたかったのですが、
 出来なくて、一度アクティブセルに計算値を表示させ、それをtextboxに表示させる」なんてややこしい事を
 多々しておりました。問題はそこにあったのですね。。
 とても勉強になりました!ichinoseさまの記述を参考にこれまでの数式を見直していきたいと思います。

 この度はお世話になり、本当にありがとうございました!
 (ぶんコ)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.