Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


4331 / 13646 ツリー ←次へ | 前へ→

【57237】複数のClickを1つのプログラムに集約したい takao 08/8/2(土) 16:50 質問[未読]
【57238】Re:複数のClickを1つのプログラムに集約し... kanabun 08/8/2(土) 17:01 発言[未読]
【57241】Re:複数のClickを1つのプログラムに集約し... takao 08/8/2(土) 17:24 お礼[未読]
【57242】Re:複数のClickを1つのプログラムに集約し... kanabun 08/8/2(土) 17:33 発言[未読]
【57243】Re:複数のClickを1つのプログラムに集約し... takao 08/8/2(土) 17:58 発言[未読]
【57246】Re:複数のClickを1つのプログラムに集約し... kanabun 08/8/2(土) 18:42 発言[未読]
【57240】Re:複数のClickを1つのプログラムに集約し... kanabun 08/8/2(土) 17:14 発言[未読]
【57248】Re:複数のClickを1つのプログラムに集約し... ichinose 08/8/2(土) 19:04 発言[未読]
【57249】Re:複数のClickを1つのプログラムに集約し... ichinose 08/8/2(土) 19:46 発言[未読]
【57250】Re:複数のClickを1つのプログラムに集約し... ichinose 08/8/2(土) 19:53 発言[未読]
【57266】Re:複数のClickを1つのプログラムに集約し... takao 08/8/4(月) 7:28 お礼[未読]
【57267】Re:複数のClickを1つのプログラムに集約し... ichinose 08/8/4(月) 8:25 発言[未読]
【57280】Re:複数のClickを1つのプログラムに集約し... takao 08/8/4(月) 20:32 お礼[未読]

【57237】複数のClickを1つのプログラムに集約した...
質問  takao  - 08/8/2(土) 16:50 -

引用なし
パスワード
   またまたお世話になります。
1〜31を表示したTextBoxをUserForm上に「日付」として配置しています。
選択可能な「日付」のTextBoxは、Visble=True、選択不可の「日付」は
Visble=Falseとしています。
TextBoxをClickすると、日付に対応するモジュールが起動されますが
ほとんど同じプログラムを93個分(3ヶ月分)作成しています。
(問題なく動作していますので困ることはありませんが、)
質問は、どのTextBoxをClickしても、ある特定のモジュールが起動され、
その中でClickされたTextBoxを特定する・・・なんて方法はありませんか?
周りの人に聞いてみましたが、ヒントも出ませんでした。
単にプログラムを短くしたいだけですが、お知恵を拝借させて下さい。
宜しくお願い致します。

【57238】Re:複数のClickを1つのプログラムに集約...
発言  kanabun  - 08/8/2(土) 17:01 -

引用なし
パスワード
   ▼takao さん:

>質問は、どのTextBoxをClickしても、ある特定のモジュールが起動され、
>その中でClickされたTextBoxを特定する・・・なんて方法はありませんか?

> 選択不可の「日付」は Visble=Falseとしています。

ぼくなら、ひとつのListBoxに 選択可 の日付だけ AddItem して 集約しますけど?

【57240】Re:複数のClickを1つのプログラムに集約...
発言  kanabun  - 08/8/2(土) 17:14 -

引用なし
パスワード
   ▼takao さん:

ListBox案の簡単な例です

Option Explicit

Private Sub UserForm_Initialize()
 With ListBox1
   .ListStyle = fmListStyleOption
   .AddItem "2008/7/15"
   .AddItem "2008/7/17"
   .AddItem "2008/7/19"
   .AddItem "2008/7/21"
   .AddItem "2008/7/23"
   .AddItem "2008/7/25"
 End With
End Sub

Private Sub ListBox1_Click()
 With ListBox1
   Call 処理(.List(.ListIndex)) '選択されたアイテムの日付を渡す
 End With
End Sub

Sub 処理(strDate As String)
  Me.Caption = CDate(strDate)  '日付に応じた処理
End Sub

【57241】Re:複数のClickを1つのプログラムに集約...
お礼  takao  - 08/8/2(土) 17:24 -

引用なし
パスワード
   ▼kanabun さん:
>▼takao さん:
>
>>質問は、どのTextBoxをClickしても、ある特定のモジュールが起動され、
>>その中でClickされたTextBoxを特定する・・・なんて方法はありませんか?
>
>> 選択不可の「日付」は Visble=Falseとしています。
>
>ぼくなら、ひとつのListBoxに 選択可 の日付だけ AddItem して 集約しますけど?

指摘ありがとうございます。
日付は、曜日や、ほかの選択可な日付を見ながら選択しますので、ListBoxでは
ちょっと使いづらくなりますので仕様の変更はできません。

【57242】Re:複数のClickを1つのプログラムに集約...
発言  kanabun  - 08/8/2(土) 17:33 -

引用なし
パスワード
   ▼takao さん:

>日付は、曜日や、ほかの選択可な日付を見ながら選択しますので、ListBoxでは
>ちょっと使いづらくなりますので仕様の変更はできません。

でも、なぜ TextBox ?

【57243】Re:複数のClickを1つのプログラムに集約...
発言  takao  - 08/8/2(土) 17:58 -

引用なし
パスワード
   ▼kanabun さん:
>▼takao さん:
>
>>日付は、曜日や、ほかの選択可な日付を見ながら選択しますので、ListBoxでは
>>ちょっと使いづらくなりますので仕様の変更はできません。
>
>でも、なぜ TextBox ?
日付1つに1つのTextBoxを割付けて、TextBoxは日付別にカレンダのように配置しています。 例えば中10日を空けた2つの日付を選択したい等、全体を目で見て
判断したいからです。(選択した日付はLockし色を変更。最後に終了ボタンで確定)
ListBoxでも判断はできそうですが、ちょっと無理だと判断しています。

【57246】Re:複数のClickを1つのプログラムに集約...
発言  kanabun  - 08/8/2(土) 18:42 -

引用なし
パスワード
   ▼takao さん:

>>でも、なぜ TextBox ?
>日付1つに1つのTextBoxを割付けて、TextBoxは日付別にカレンダのように配置しています。 例えば中10日を空けた2つの日付を選択したい等、全体を目で見て
>判断したいからです。(選択した日付はLockし色を変更。最後に終了ボタンで確定)
>ListBoxでも判断はできそうですが、ちょっと無理だと判断しています。

入力させるときは TextBox、そうでなく選択だけなら Label というのが
ふつうと思います。が、TextBoxにしろ Labelにしたところで、
VB の「コントロール配列」としてしまう方法がにわかには使えないので、
> Clickをひとつのプログラムに
は VBAでは 難しいと思います。

【57248】Re:複数のClickを1つのプログラムに集約...
発言  ichinose  - 08/8/2(土) 19:04 -

引用なし
パスワード
   こんばんは。
>1〜31を表示したTextBoxをUserForm上に「日付」として配置しています。
>選択可能な「日付」のTextBoxは、Visble=True、選択不可の「日付」は
>Visble=Falseとしています。
>TextBoxをClickすると、日付に対応するモジュールが起動されますが
>ほとんど同じプログラムを93個分(3ヶ月分)作成しています。
>(問題なく動作していますので困ることはありませんが、)
>質問は、どのTextBoxをClickしても、ある特定のモジュールが起動され、
>その中でClickされたTextBoxを特定する・・・なんて方法はありませんか?
クラスモジュールを使うと一つのイベントプロシジャーで実現できます。

例題コードは、この質問箱で「クラスモジュール」をキーワードに
検索してみてください。

ほかにもこのサイトの目安箱にも

www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=51;id=FAQ

便利ツールが紹介されています。
クラスを用いれば

>どのTextBoxをClickしても、ある特定のモジュールが起動され

は、割と容易に実現はできますが、プログラムの構造的には
角田さんのツールのような構造にするのが(全てご自分で作るにしても)
本筋かなあとも思います。

もっとも初めてなら、どちらでも良いのでまずは、
クラスモジュールで可能なことを確認して見てください。

【57249】Re:複数のClickを1つのプログラムに集約...
発言  ichinose  - 08/8/2(土) 19:46 -

引用なし
パスワード
   訂正

>>どのTextBoxをClickしても、ある特定のモジュールが起動され
テキストボックスにClickイベントはありませんね!!

DblClickで対応してください

【57250】Re:複数のClickを1つのプログラムに集約...
発言  ichinose  - 08/8/2(土) 19:53 -

引用なし
パスワード
   >
>>>どのTextBoxをClickしても、ある特定のモジュールが起動され

もしかしたら、現行は、Enterイベントで対応されているのですか?

だとしたらクラスモジュールを使った擬似コントロール配列では
対応できません。

前述のようにイベントを変更するか、

Activecontrolを監視するようなクラスモジュールを作成しなければばりません
(私も作ったことがありますが、実務では作動させた経験がありません)

参考程度に

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

【57266】Re:複数のClickを1つのプログラムに集約...
お礼  takao  - 08/8/4(月) 7:28 -

引用なし
パスワード
   ▼ichinose さん:kanabunさん

丁寧なご指摘ありがとう御座います。
早速「クラスモジュール」について勉強を始めましたが、
すぐには理解できそうにありません。理解してから返信をと思っていましたが
今日からまた仕事が始まりますので、取あえず状況報告まで。
時間を見つけて挑戦してみます。
なお、1つ前の指摘通り「Click]は[DblClick]の間違いです。
またkanabunさんより「選択だけなら Label というのがふつう」との指摘が
ありましたが Label はLockプロパティが無かったので(他に方法があるかも
知れませんが)あえてTextBoxを使っています。

【57267】Re:複数のClickを1つのプログラムに集約...
発言  ichinose  - 08/8/4(月) 8:25 -

引用なし
パスワード
   おはようございます。



新規ブックのユーザーフォームに(Userform1)に
テキストボックスを3つ配置してください。

  TextBox1、TextBox2、TextBox3

配置するコントロールは上記の3つでよいです。

クラスモジュールを作成してください(挿入----「クラスモジュール」)

クラス名は、既定の名前の Class1 とします。

このClass1のモジュールに

'=============================================================
Option Explicit
Public id As Long
Public WithEvents txt As MSForms.TextBox
Private Sub txt_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
  MsgBox "Textbox" & id & " = " & txt.Text
  Cancel = True
End Sub


Userform1のモジュールには、

'===============================================================
Option Explicit
Private t_class(1 To 3) As Class1
Private Sub UserForm_Initialize()
  Dim g0 As Long
  For g0 = 1 To 3
    With Controls("textbox" & g0)
     .PasswordChar = "*"
     .Text = Array("aaaa", "bbbb", "cccc")(g0 - 1)
     .Locked = True
     End With
    Set t_class(g0) = New Class1
    With t_class(g0)
     .id = g0
     Set .txt = Controls("textbox" & g0)
     End With
    Next
End Sub


標準モジュールには

'===========================================================
Sub main()
  UserForm1.Show
End Sub


でmainを実行してみてください

それぞれのテキストボックスには何か入力されていますが、

「***」 で隠されています。

各テキストボックスをダブルクリックすることでその内容が
表示される

という仕様です。

この例で クラスモジュールの使用でコードがまとめられることが
確認できますか?

試してみてください。

【57280】Re:複数のClickを1つのプログラムに集約...
お礼  takao  - 08/8/4(月) 20:32 -

引用なし
パスワード
   ▼ichinose さん:
こんばんは。
私は、サンデードライバーならず、サンデープログラマです。
朝、投稿して、仕事に行って、帰ったらサンプルプログラムの返事。
これだから「VBA質問箱」は止められない。 とは言ってもじっくり検討する
時間が無いので、次の土日に頑張ります。
あっ、8日からオリンピックが始まるのでちょっと無理かも?
盆明けまでに何とかものにして、職場のPCにインストールして
自慢したいですが、皆にこのサイトを紹介しているので、
内容を見ればバレバレです。
なにはともあれ、ありがとうございました。

4331 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free