Microsoft Excel 2000 for VBAのフォーム機能を使用して
TextBox?に値が入力したらシートの指定したセルへ値が入るようにしたいんですが、
TextBoxがいっぱいあるため、以下のように非常に長いプログラムになってしまいました。
Private Sub TextBox1_Change()
Sheets(sheetname).Cells(1, 横位置).Value = TextBox1.Value
End Sub
TextBox2~29は繰り返し
Private Sub TextBox30_Change()
Sheets(sheetname).Cells(30, 横位置).Value = TextBox30.Value
End Sub
上手く配列化なんかでまとめる方法がありましたらアドバイスください。
No.2ベストアンサー
- 回答日時:
実質、数行なので説明といっても何を書けばいいのか・・・
●最初に・・・
VBAではVBと違い、コントロール配列の機能はありません。
しかし、コントロールのオブジェクト名をOptionButton1、OptionButton2、OptionButton3の
ようにすると、ユーザーフォームのオブジェクト名を .Controls("OptionButton" & i) で扱え、
あたかもコントロール配列のように使えます。CheckBoxでもTextBoxでも同じです。
例えば、CommandButton1 を押すと、OptionButton1からOptionButton31までの31個のValueを
判定することが For Next や For Each でできることになります。これで外部から多数のコント
ロールを一括して参照できることになります。
参照できれば、各テキストボックスの値を合計したり、検証したり、コントロールの初期化を
スマート(一括で、短く)にできたりします。
ただし、質問のケースは上と違い、多数のTextBoxのChangeイベントをコントロール配列風に
したいということで、多数のコントロール内部からのイベントになるわけで一工夫必要になります。
●まず、クラスモジュールの次の2行は ・・・
(C1)Private WithEvents myText As MSForms.TextBox
(C2)Private myIndex As Integer
(C1)でTextBox型の変数をWithEventsを使って宣言しています。
これでこの変数は(テキストボックス)のChangeイベントを検知できるようになります。
(C2)でInteger型の変数を宣言しています。
このmyIndexがTextBox1、TextBox2等の番号にあたる箇所で、TextBox型の変数を配列と
したときのインデックスになります。
●次に(C3)部分で、TextBox型の変数myTextが参照するTextBoxを定義する関数を書いています。
後の、UserForm_Initializeでこの関数が呼ばれ、myIndexで制御できるTextBox型の変数が
作成されるわけです。
(C3)Public Sub S_setText(NewText As MSForms.TextBox, Index As Integer)
(C3) Set myText = NewText
(C3) myIndex = Index
(C3)End Sub
●次に(C4)部分で、TextBox型の変数myTextのChangeイベントを定義しています。
myIndexがあるため、コントロール配列風に扱え、コードはこれだけで済みます。
(C4)Private Sub myText_Change()
(C4) With UserForm1
(C4) Worksheets("Sheet1").Cells(myIndex, 横位置) = Val(.Controls("TextBox" & myIndex))
(C4) End With
(C4)End Sub
●質問に『横位置』とあったので、ここでこの変数を有効にするため、
とりあえず、標準モジュールに
(M1)Public Const 横位置 = 1 'A列
を記述しています。
●最後にユーザーフォームのコードです。
(F1)でクラスで定義したTextBox型の変数が30個いるので配列に定義しています。
(F1)Private myTextArray(1 To 30) As New Class1
(F2)ではUserForm_Initializeイベントで、ユーザーフォームが呼び出された時に
クラスのTextBox型の変数が各テキストボックスを参照できるようにクラス内で定義したS_setTextパブリック
関数を呼び出しています。これで30個のテキストボックスのChangeイベントをひとつのイベントプロシージャ
で書けるようになります。
(F2)Private Sub UserForm_Initialize()
(F2) Dim i As Integer
(F2) For i = 1 To 30
(F2) myTextArray(i).S_setText UserForm1.Controls("TextBox" & i), i
(F2) Next
(F2)End Sub
説明は作るより難しいですね。
余り理論的ではなく、書いているコードの説明かもしれません。
クラスについて書かれた本も見かけるようになってきたので、その辺から調べてみてはどうでしょうか。
No.1
- 回答日時:
ユーザーフォーム上にTextBox1からTextBox30があり、質問にあるように、コードを30個書かないでChangeイベントを拾えるようにしてみました。
Excel-VBAはVBと違い、コントロール配列の機能がないので、クラスでWithEventsを使ってイベントを拾い、あたかもコントロール配列のようにしてみました。こんな使い方もあるという例です。
テキストボックスの値を書き込むシートのシート名は『Sheet1』としています。ご参考に。(実際は5個のコントロールでしかチェックしていません。30個も同じでしょう。Excel2000です)
ユーザーフォームのコードウインドウに貼り付け(ユーザーフォーム=UserForm1)
↓
Private myTextArray(1 To 30) As New Class1
Private Sub UserForm_Initialize()
Dim i As Integer
For i = 1 To 30
myTextArray(i).S_setText UserForm1.Controls("TextBox" & i), i
Next
End Sub
クラスモジュールを挿入して貼り付け(クラスモジュール=Class1)
↓
Private WithEvents myText As MSForms.TextBox
Private myIndex As Integer
Public Sub S_setText(NewText As MSForms.TextBox, Index As Integer)
Set myText = NewText
myIndex = Index
End Sub
Private Sub myText_Change()
With UserForm1
Worksheets("Sheet1").Cells(myIndex, 横位置) = Val(.Controls("TextBox" & myIndex))
End With
End Sub
標準モジュールを挿入して貼り付け
↓
Public Const 横位置 = 1 'A列
早速のお返事ありがとうございます。
nishi6さんが作っていただきました物で
私の要求は十分満たす内容になっておりました。
どうもありがとうございました。
でも私の知識不足のため、今一構造が理解できない・・・。
できればもう少し詳しい解説をお願いできないでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
高校生はアルバイトするべきだろうか?賛成だったら「賛」、否定だったら「否」を文頭においてあなたの意見を教えてください。
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
テキストボックスの番号を使ったFor~Next文について
Visual Basic(VBA)
-
複数のテキストボックスに同じ処理をしたい
Visual Basic(VBA)
-
エクセルVBA テキストボックスに3桁ごとにコンマ
Visual Basic(VBA)
-
-
4
エクセルVBAでテキストボックスに入力があった場合のみ、ワークシートに転記したい
Visual Basic(VBA)
-
5
【エクセル】複数のTextBoxに共通するChangeイベントを簡潔に書きたい
Excel(エクセル)
-
6
VBAのフォーム上にTextBoxたくさんあるとき
IT・エンジニアリング
-
7
VBA。複数のChangeイベントをまとめる方法
Visual Basic(VBA)
-
8
VBAのコマンドボタンの文字列の改行方法は?
Visual Basic(VBA)
-
9
ExcelVBAでテキストボックスの表示形式を小数点第二位まで表示する方法
Visual Basic(VBA)
-
10
Excel vbaで複数のテキストボックスの足し算
Visual Basic(VBA)
-
11
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
12
VBA 複数のセルの値をテキストボックスに表示する
Excel(エクセル)
-
13
ユーザーフォームへのデータ入力を繰り返す方法
Visual Basic(VBA)
-
14
ユーザーフォームに入力したデータを保持する方法
Visual Basic(VBA)
-
15
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
16
ユーザーフォームに別シートからデータを反映させたい。
Visual Basic(VBA)
-
17
変数をコントロール型で使用する方法
Visual Basic(VBA)
-
18
ユーザーフォームのテキストボックスに配列の値を読み込む方法を教えて下さい
Visual Basic(VBA)
-
19
エクセルVBA ユーザーフォームのtextboxの書式設定って?
Excel(エクセル)
-
20
VBA テキストボックスの計算
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
カメラスクロールするのを動画...
-
エクセル・VBA CheckBoxのオブ...
-
C#で角が丸いテキストボックス
-
ExcelVBAでListViewが使用できない
-
EXCELでactivexコントロールを...
-
vb.netで画面のコントロールId...
-
(VBA)スピンボタンの大量...
-
ユーザーフォームで動的(Me.Con...
-
chr関数の呼び出しで「プロ...
-
With~EndWithの省略部分と引数...
-
vb.net メニューをダブルクリッ...
-
アクセス特有の書き方?
-
'ckbl' コントロールは作成され...
-
エクセルVBAでオプションボタン...
-
VBを使ってPDFファイルを取...
-
間違えて配置してしまったコン...
-
C# Form上に配置されたコントロ...
-
ControlTipTextの書式設定(Font...
-
コントロールの絶対位置を取得...
-
コントロールを移動できない
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
カメラスクロールするのを動画...
-
エクセル・VBA CheckBoxのオブ...
-
エクセルVBAでオプションボタン...
-
vb.netで画面のコントロールId...
-
ExcelVBAでListViewが使用できない
-
EXCELでactivexコントロールを...
-
コントロールを移動できない
-
フォーム上の現在アクティブな...
-
ユーザーフォームで動的(Me.Con...
-
ListViewのチェックボックスに...
-
C#で角が丸いテキストボックス
-
エクセル コントロールツール...
-
VBAのフォームでTextBoxがいっ...
-
Excel VBA で Richtextboxを使...
-
VBA ユーザーフォームの Keypre...
-
Groupboxの配下のコントロール...
-
ACCESS2010のVBAでフォーム内ク...
-
chr関数の呼び出しで「プロ...
-
vba dbcommand button activex ...
-
With~EndWithの省略部分と引数...
おすすめ情報