今、VB2005ExpressEditionでソフトを作っているのですが、
コマンドボタン(Button)を並べ、その隣にテキストボックス(Textbox)を並べ、
約80組のボタン・テキストの組を作りました。
そのボタンを隣に記載してある数字分だけクリックさせたいのですが、クリックさせる関数を
public function clk(a1 as integer,a2 as integer)
If a2 < 1 Then Exit Function
Dim a3 As Integer = a2
Do
If a1 = 1 Then Call Button1.PerformClick()
If a1 = 2 Then Call Button2.PerformClick()
.......
a3=a3-1
loop until a3<1
End function
として、a1をクリックするボタンの添え字、a2=textbox(a1).text(a1の部分は毎回手打ち)としていますが、buttonやtextboxの名前を変数化して、読み込むことができれば、コードを省略できると思います。何かいいアイデアはないものでしょうか?
No.3ベストアンサー
- 回答日時:
やっぱりですか?(^^;)了解です。
以下ルールとします。1.ButtonXXと対になるのはTextBoxXXというルールとする。
(1~任意の数)
2.欠番は無いものとする。
フォームロードを下のように書き換えて下さい。
Dim btn As Button
Dim txt As TextBox
Dim no As Integer = 1
On Error Resume Next
Do Until Err.Number <> 0
txt = Me.Controls.Item("TextBox" & no)
btn = Me.Controls.Item("Button" & no)
If txt IsNot Nothing AndAlso btn IsNot Nothing Then
ctlList.Add(New CtrlSet(btn, txt))
txt = Nothing : btn = Nothing
End If
no = no + 1
Loop
On Error GoTo 0
返信が遅くなってしまってすみませんでした。
お返事ありがとうございました。
実行してみたところDO~LOOPから抜け出すことなく、200万までカウントしていたので、DO~LOOP内のif文にElse : Exit Doを挿入したらちゃんと稼動しました。
本当にありがとうございました。
No.2
- 回答日時:
環境が無く正確な例はかけないのですが、イメージで。
'ボタンとテキストのペアを表す構造体を定義
Private Structure CtrlSet
Public btn As Button
Public txt As TextBox
Sub New(iBtn As Button, iTxt As TextBox)
btn = iBtn
txt = iTxt
End Sub
End Structure
'ボタンとテキストのペアを格納するリストを宣言
Private ctlList As List(Of CtrlSet)
'ロードイベント
Private Sub Form1_Load() Handles Me.Load
ctlList = New List(Of CtrlSet)
'80組のボタンとテキストをリストに保存
ctlList.Add(New CtrlSet(Button1, TextBox1))
ctlList.Add(New CtrlSet(Button2, TextBox2))
・・・
ctlList.Add(New CtrlSet(Button80, TextBox80))
End Sub
'一つのコマンドボタンをクリックすると、のクリックイベント
Sub ボタン_Click() Handles ボタン.Click
Dim ctlSet As CtrlSet
'全部のペアをclk関数に渡す
For Each ctlSet In ctlList
clk(ctlSet.btn, ctlSet.txt)
Next
End Sub
この回答への補足
お返事ありがとうございます。
返信が遅くなってすみませんでした。
私が一番困っているのは
「'80組のボタンとテキストをリストに保存」
コード内の「・・・」の部分を省略する方法です。
今はボタンが80個なんですが、いずれ150以上までは拡張するつもりです。
自動的に「・・・」の部分を拡張できる方法を探しています。
答えていただいたコードも大変参考になりましたが、
ctlList.Add(New CtrlSet(ButtonXX, TextBoxXX))
をXXが1~任意の数まで動かして、リストに登録する方法はないものでしょうか。
自分でも若干案があることはあるのですが、
「(1)Formのボタンを1つ選んで固定する
(2)Formのテキストボックスを1つ固定する
(3)選んだボタンの名前(コントロール名)から最初の6文字(「Button」部分)を取り除いた文字列と、選んだテキストボックスの名前から最初の7文字(「Textbox」部分)を取り除いた文字列が一致するか調べる。
(4)もし一致しなかったら、次のテキストボックスに移り、一致したら、pen_pen_penさんの提案してくれたコードでリストに格納して、次のボタンに移る
(5)すべてのForm内のボタンに関して、同じことを実行する」
ということが出来れば、自分がやりたいことが実現できるのですが、私が書いた案を実装するコード、もしくはこの案でなにか思いついた(またはやっと状況がわかっていただけた)コードがあれば、どなたかご教授お願いいたします。
No.1
- 回答日時:
関数「clk」の仕様を変えてしまいますが、以下のようにしてはいかがでしょうか?
Public Sub clk(clkButton As Button, numText As TextBox)
Dim clkNum As Integer = numText.Text
Dim i As Integer
For i = 1 To clkNum
clkButton.PerformClick()
Next
End Sub
そして、関数を実行するときに
ボタンとテキストをセットでこの関数に渡します。
微妙に状況を理解しきれてないのでヘンなこと言ったらすみません。
どういうタイミングで実行するんですか?
この回答への補足
返信ありがとうございます。
回答を見させていただいて、自分の質問が変だったことに気付きました。
最初に言った80個のボタンには、すべて違う命令(大きなテキストボックスに文を貼り付ける)というコマンドをインプットしており、
「一つのコマンドボタンをクリックすると、1つのボタンをそれと組になっているテキストボックスの回数分だけクリックさせ、それをすべての組に対して実行する」
ということがしたいのですが、その組はソフトを改良をするたびに増えていくので、
「......」という部分を増やしていかなくてはいけないのです。
今回返信して頂いた引数の型を変えるというコードは大変参考になりました。
あとは、「各ボタンについて1行(1つ)のコード」ではなく、FOR,NEXTやDO,LOOPなどでまとめて読み込む方法を探しています。
大変お手数をおかけしますが、よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) VBAで組み合わせ算出やCOUNTIFSの処理を高速化したいです。 4 2022/04/07 02:38
- Visual Basic(VBA) エクセル マクロ(A1:A10)までの中で一番多く出た数字をB10に表示 6 2023/04/25 17:01
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- Excel(エクセル) エクセルVBAでオブジェクトが必要です 2 2022/09/10 16:37
- Visual Basic(VBA) ExcelVBAでDo Until loopのネスト、IF文を使って一致する物と一致しない物としたい 11 2022/12/24 17:46
- Visual Basic(VBA) このVBAでExcelアプリケーションを作成は必要ですか? 3 2023/07/19 21:13
- Visual Basic(VBA) InputBoxでキャンセルボタンを押したらファイル自体を閉じたい 3 2022/07/23 17:52
- JavaScript javascriptのちょっとした動作不良(原因は突き止めたのですが) 1 2023/06/15 19:58
- Excel(エクセル) excel2013 色付きセルの値合計 3 2023/02/28 11:48
- Visual Basic(VBA) ①ExcelVBAでカレンダーを作り、別のユザーフォームで日付を入力したいのですがエラーになります。 1 2023/02/17 18:39
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA シートのボタン名を変更し...
-
VBA(エクセル)で自動的にボタン...
-
VBA CommandButtonの文字ずれ
-
VBAのボタンの位置が変わって困...
-
ユーザーフォームに別シートか...
-
フォームの再読み込み
-
Excel VBA Application.caller...
-
Vba 電卓 一文字消すボタン
-
セルをマクロのボタンにしたい。
-
プロシージャからイベントをコ...
-
ボタンの枠線の様なものを消したい
-
VB.net でトグルボタンを実現し...
-
+ボタンの名称は?
-
Excel VBA実行中にワークシート...
-
他フォームのクリックイベント取得
-
VBAでオプションボタンによって...
-
C♯初心者で、四則演算の電卓を...
-
VBA ユーザーフォームラベルキ...
-
keyascii=13
-
VB6コントロール配列をパラメー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA シートのボタン名を変更し...
-
VBA(エクセル)で自動的にボタン...
-
フォームの再読み込み
-
ユーザーフォームに別シートか...
-
VBA CommandButtonの文字ずれ
-
セルをマクロのボタンにしたい。
-
Excel VBA Application.caller...
-
コマンドボタンやイメージにマ...
-
Access VBA でデータペーストを...
-
VBAのボタンの位置が変わって困...
-
ボタンをマウスで押し続けたと...
-
ボタン
-
C#プログラムで、ボタンをショ...
-
VBA でのボタンの移動について
-
閉じると「+」になり開くと「-...
-
ダウンロードダイアログをVB...
-
[Excel VBA]コマンドボタンの入...
-
ASP.Net ラベルの内容をすぐに...
-
プロシージャからイベントをコ...
-
CommandButtonのCaptionを変化...
おすすめ情報