■ 同一プロシージャを簡単にコーディングするには?

[Visual Basic Q & A 掲示板] [過去ログの一覧]


ちんぷんかんぷん 2008/02/17(日) 00:34:00 <初心者>
例ですが、Private Sub TextBox1_Enter()
             TextBox1.SelStart = 0
             TextBox1.SelLength = TextBox1.MaxLength
         End Sub
              .
              .
              .
         Private Sub TextBox100_Enter()
             TextBox100.SelStart = 0
             TextBox100.SelLength = TextBox100.MaxLength
         End Sub
と100回のコーディングを簡単に出来る事ってできないのでしょうか?
初心者に解りやすいアドバイスをお願いしたのですが・・・
宜しく、お願い致します。

さるべーじ [E-Mail] [HomePage] 2008/02/17(日) 01:08:09
「TextBox1_Enter」って〜VB6にありましたっけ。
今手元にVB6がないのでうろ覚えですが、確か「TextBox1_GetFocus」とかじゃ
なかったかなぁ…。

〜VB6ならTextBoxを 1〜100の配列として

  Private Sub TextBox_Enter()

VB2002〜なら

  Private Sub TextBox_Enter()
    Handles TextBox1.Enter, …, TextBox100.Enter

でできると思います。

配列にする場合は他のイベントプロシージャも共通になりますので、
コントロールごとに別の処理をさせたい場合はプロシージャ内部で振り分けるなどの
処理が必要になります。

VB2002〜でも配列化はやろうと思えばできますが、ちょっとめんどくさい
記述の必要がありますのでとりあえず割愛。

魔界の仮面弁士 2008/02/17(日) 10:16:04 <常連>
VB6 や VB.NET であれば、比較的簡単なのですが…
構文からして、VB6 でも .NET でもなく、VBA のようですね。

Access VBA ならば、フォームの Load 時にコントロールを列挙して、
各テキストボックスの OnEnter を割り当てるという方法がありますが、
ソースをみた感じでは、Access のそれでも無さそうですね。


もしも、Excel の UserForm だとすると、難易度は高いです。
これが Enter イベントではなく、MouseDown イベント等であれば、
 Private WithEvents InternalTextBox As MSForms.TextBox
を持ったクラスを用意すれば済むのですが、Enter イベントを持つ
 Private WithEvents InternalTextBox As MSForms.Control
の利用については、サポートされていないためです。

それでも Enter イベントをまとめたいなら、
http://www2.moug.net/bbs/exvba/20071112000004.htm
の、2007/11/13 20:22:02 および 20:42:11 の記事を参考に、
イベント接続用のオブジェクトを実装する必要があります。

魔界の仮面弁士 2008/02/17(日) 10:26:53 <常連>
とりあえずの逃げ道としては:

(案1) コードの書き換えを減らすために、ActiveControl を併用する。
------------------------------------------------------------------
Private Sub EnterTemplate()
 ActiveControl.SelStart = 0
 ActiveControl.SelLength = ActiveControl.MaxLength
End Sub

Private Sub TextBox1_Enter()
 EnterTemplate
End Sub
 :
Private Sub TextBox100_Enter()
 EnterTemplate
End Sub


(案2) コードそのものを生成するツールを作成する。
------------------------------------------------------------------
下記のコードを実行すると、sample.txt にソースコードが
生成されるので、それをフォームに貼りつける。
(100 個分を手で書くよりは、間違いが減るかと)

Open "C:\sample.txt" For Output As #256
Dim i As Integer
For i = 1 To 100
    Print #256,
    Print #256, "Private Sub TextBox" & CStr(i) & "_Enter()"
    Print #256, vbTab; "TextBox" & CStr(i) & ".SelStart = 0"
    Print #256, vbTab; "TextBox" & CStr(i) & ".SelLength = TextBox" & CStr(i) & ".MaxLength"
    Print #256, "End Sub"
Next

Re>同一プロシージャを簡単にコーディングするには? 2008/02/17(日) 11:17:34 <初心者>
魔界の仮面弁士さん、さるべーじさん、貴重な時間を割いていただき、ありがとうございました。
魔界の仮面弁士さんの言うとおり、VBAです。言い方が悪くて申し訳ありませんでした。
ExcelのUserFormだと、難易度が高いということですが、自分ではまだまだ理解するのに時間がかかると思いますので、(案1)の方法でコーディングする事にします。

Re>同一プロシージャを簡単にコーディングするには? 2008/02/17(日) 15:25:21 <初心者>
実際、以下のコードを入力して実行してみたのですが・・・
Private Sub EnterTemplate()
 ActiveControl.SelStart = 0
 ActiveControl.SelLength = ActiveControl.MaxLength
End Sub

Private Sub TextBox1_Enter()
 EnterTemplate
End Sub
 :
Private Sub TextBox100_Enter()
 EnterTemplate
End Sub

上記のコードの
Private Sub EnterTemplate()
 ActiveControl.SelStart = 0
 ActiveControl.SelLength = ActiveControl.MaxLength
End Sub
で実行時エラー'438'
が発生したのですが・・・

KG 2008/02/17(日) 21:01:00
横から失礼致します。

ExcelのVBAのようですが、バージョンはいくつなのでしょう?

Windows2000+Excel2000では上記コードでエラーが発生しませんでした。

ご報告までに。

Re>同一プロシージャを簡単にコーディングするには? 2008/02/18(月) 14:21:12 <初心者>
環境は、WindowsXP + Excel2003です。

毎週金曜日はポイント最大3倍!さらに4倍のチャンスも!

Programming Library