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


ちんぷんかんぷん  2008-02-17 00:34:00  No: 100288  IP: 192.*.*.*

例ですが、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回のコーディングを簡単に出来る事ってできないのでしょうか?
初心者に解りやすいアドバイスをお願いしたのですが・・・
宜しく、お願い致します。

編集 削除
さるべーじ  URL  2008-02-17 01:08:09  No: 100289  IP: 192.*.*.*

「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  No: 100290  IP: 192.*.*.*

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  No: 100291  IP: 192.*.*.*

とりあえずの逃げ道としては:

==================================================================
(案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  No: 100292  IP: 192.*.*.*

魔界の仮面弁士さん、さるべーじさん、貴重な時間を割いていただき、ありがとうございました。
魔界の仮面弁士さんの言うとおり、VBAです。言い方が悪くて申し訳ありませんでした。
ExcelのUserFormだと、難易度が高いということですが、自分ではまだまだ理解するのに時間がかかると思いますので、(案1)の方法でコーディングする事にします。

編集 削除
Re>同一プロシージャを簡単にコーディン  2008-02-17 15:25:21  No: 100293  IP: 192.*.*.*

実際、以下のコードを入力して実行してみたのですが・・・
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  No: 100294  IP: 192.*.*.*

横から失礼致します。

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

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

ご報告までに。

編集 削除
Re>同一プロシージャを簡単にコーディン  2008-02-18 14:21:12  No: 100295  IP: 192.*.*.*

環境は、WindowsXP + Excel2003です。

編集 削除