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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) VBA。複数のChangeイベントをまとめる方法 2 2022/03/31 12:03
- Visual Basic(VBA) VBAで質問ですが、皆さんはどの様に導き出しているのでしょうか? 6 2022/05/03 21:53
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 6 2022/06/08 12:55
- Visual Basic(VBA) フォルダの場所を可変にしたいです(マクロ) 4 2023/05/11 10:00
- Visual Basic(VBA) VBA 重複チェック後に値をワークシートに転記する方法を教えてください。 1 2023/03/19 12:43
- Visual Basic(VBA) Excel VBA ユーザーフォーム1のコンボボックスに別ブックの値を反映させたいです。 6 2023/03/21 16:12
- Visual Basic(VBA) Excel VBAのリストボックスの値を他のフォームに反映させる方法を教えてください。 2 2023/07/14 14:06
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
テキストボックスの番号を使ったFor~Next文について
Visual Basic(VBA)
-
複数のテキストボックスに同じ処理をしたい
Visual Basic(VBA)
-
エクセルVBAでテキストボックスに入力があった場合のみ、ワークシートに転記したい
Visual Basic(VBA)
-
-
4
VBAのフォーム上にTextBoxたくさんあるとき
IT・エンジニアリング
-
5
ExcelVBAでテキストボックスの表示形式を小数点第二位まで表示する方法
Visual Basic(VBA)
-
6
【エクセル】複数のTextBoxに共通するChangeイベントを簡潔に書きたい
Excel(エクセル)
-
7
Excel vbaで複数のテキストボックスの足し算
Visual Basic(VBA)
-
8
VBからエクセルのテキストボックスの名称を取得したい
Visual Basic(VBA)
-
9
エクセルVBA テキストボックスに3桁ごとにコンマ
Visual Basic(VBA)
-
10
テキストボックスの番号の取得
Visual Basic(VBA)
-
11
ユーザーフォームに入力したデータを保持する方法
Visual Basic(VBA)
-
12
VBA 複数のセルの値をテキストボックスに表示する
Excel(エクセル)
-
13
ユーザーフォームのテキストボックスに配列の値を読み込む方法を教えて下さい
Visual Basic(VBA)
-
14
VBA。複数のChangeイベントをまとめる方法
Visual Basic(VBA)
-
15
テキストボックスの名前に変数をつける
Visual Basic(VBA)
-
16
VBAのテキストボックスに文字列を貼り付ける方法
Access(アクセス)
-
17
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
18
ユーザーフォームへのデータ入力を繰り返す方法
Visual Basic(VBA)
-
19
VBA:ユーザーフォームのマルチページに色を付けたい。
Word(ワード)
-
20
エクセルVBA ユーザーフォーム 複数のコンボボックス 同一リスト
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
EXCELでactivexコントロールを...
-
excelのリストボックスで選択し...
-
vb.netで画面のコントロールId...
-
フォーム上の現在アクティブな...
-
エクセルVBAでオプションボタン...
-
Excelコマンドボタン名を変数に...
-
カメラスクロールするのを動画...
-
間違えて配置してしまったコン...
-
Groupboxの配下のコントロール...
-
'ckbl' コントロールは作成され...
-
複数のコマンドボタン(VBAで)...
-
ActiveXコントロールを作成して...
-
VB6.0 実行時エラー 374について
-
ExcelVBAでListViewが使用できない
-
コンボボックスの文字によるif...
-
ACCESSフォームにコント...
-
エクセル・VBA CheckBoxのオブ...
-
chr関数の呼び出しで「プロ...
-
ユーザコントロールのイベント...
-
Excel VBA で Richtextboxを使...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
カメラスクロールするのを動画...
-
エクセル・VBA CheckBoxのオブ...
-
vb.netで画面のコントロールId...
-
EXCELでactivexコントロールを...
-
ExcelVBAでListViewが使用できない
-
(VBA)スピンボタンの大量...
-
エクセルVBAでオプションボタン...
-
C#で角が丸いテキストボックス
-
ユーザーフォームで動的(Me.Con...
-
アクセス特有の書き方?
-
間違えて配置してしまったコン...
-
VBAのエラーについて、”実行時...
-
コンボボックスの文字によるif...
-
変数をコントロール型で使用す...
-
chr関数の呼び出しで「プロ...
-
With~EndWithの省略部分と引数...
-
C#で自分のウインド・ハンド...
-
excelのリストボックスで選択し...
-
'ckbl' コントロールは作成され...
-
フォーム上の現在アクティブな...
おすすめ情報