柔軟に働き方を選ぶ時代に必要なこと >>

Microsoft Excel 2013 の VBAのフォーム機能を利用してます。
TextBoxにセルを参照して文字が入ってくるようにしています。、
参照するセルによって文字列の長さが違うので
文字の大きさを自動調整してくれるマクロを使っているのですが
TextBoxがいっぱいあるため、以下のように非常に長いプログラムになってしまいました。

Private Sub textBox1_Change()
Const InitialFontSize As Double = 40 '初期フォントサイズ
Dim BufWidth As Double
Dim BufHeight As Double
With Me.TextBox1
.Font.Size = InitialFontSize
BufWidth = .Width
BufHeight = .Height
.AutoSize = True
While .Width > BufWidth
.Font.Size = .Font.Size - 2.5
Wend
.AutoSize = False
.Width = BufWidth
.Height = BufHeight
End With
End Sub

TextBox2~67は繰り返し

Private Sub textBox67_Change()
Const InitialFontSize As Double = 40 '初期フォントサイズ
Dim BufWidth As Double
Dim BufHeight As Double
With Me.TextBox67
.Font.Size = InitialFontSize
BufWidth = .Width
BufHeight = .Height
.AutoSize = True
While .Width > BufWidth
.Font.Size = .Font.Size - 2.5
Wend
.AutoSize = False
.Width = BufWidth
.Height = BufHeight
End With
End Sub

過去の質問等を参考にいろいろ試してみたのですが
自分の力不足でうまくできませんでした。
うまくまとめられるような方法等ありましたらお知恵を拝借できないでしょうか
よろしくお願い致します

このQ&Aに関連する最新のQ&A

A 回答 (1件)

http://oshiete.goo.ne.jp/qa/261042.html
ほぼ、この回答者様のコードのままですが。。。

以下のコードはテキストボックス8個「TextBox1~8」を
「UserForm1」に配置した場合となります。


■標準モジュールを挿入して、以下のコードを貼付
  (フォームを表示するためだけのものです)

Sub フォーム表示()
  Load UserForm1
  UserForm1.Show vbModeless
End Sub


■クラスモジュールを挿入して、以下のコードを貼付

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()
Const InitialFontSize As Double = 40
Dim BufWidth As Double
Dim BufHeight As Double
With UserForm1.Controls("TextBox" & myIndex) '★
  .Font.Size = InitialFontSize
  BufWidth = .Width
  BufHeight = .Height
  .AutoSize = True
  While .Width > BufWidth
    .Font.Size = .Font.Size - 2.5
  Wend
  .AutoSize = False
  .Width = BufWidth
  .Height = BufHeight
End With
End Sub


■ユーザーフォームのコードに以下のコードを貼付

Private myTextArray(1 To 8) As New Class1 '☆

Private Sub UserForm_Initialize()
  Dim i As Integer
  For i = 1 To 8 '☆
    myTextArray(i).S_setText UserForm1.Controls("TextBox" & i), i '★
  Next
End Sub


■貼り付けたコードの修正

末尾が☆の2箇所の「8」を実際のテキストボックスの数に合わせて変更してください
末尾が★の2箇所の「UserForm1」を実際のユーザーフォーム名に合わせて変更してください
末尾が★の2箇所の「TextBox」を実際のテキストボックス名に合わせて変更してください
「VBAのフォーム上にTextBoxたくさ」の回答画像1
    • good
    • 0
この回答へのお礼

忙しい中ありがとうございます。
わかりやすく修正個所も書いてあったので
とても助かりました。
ありがとうございました。

お礼日時:2014/09/17 23:17

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q複数のテキストボックスのカンマ処理

現在、ユーザーフォームに60個のテキストボックスを設置しています。
数値入力されるとカンマが付くようコードを書いているのですが、まとめて処理できるようなコードはないでしょうか?

現在…

Private Sub TextBox1_Change()
TextBox1.Text = Format(TextBox1.Text, "#,##0")
End Sub

Private Sub TextBox2_Change()
TextBox2.Text = Format(TextBox2.Text, "#,##0")
End Sub

Private Sub TextBox3_Change()
TextBox3.Text = Format(TextBox3.Text, "#,##0")
End Sub

これを60個

試しにfor~Nextで書いてみましたが、失敗しました。

Dim c As Integer
For c = 1 To 60
Controls("TextBox" & c).Text = Format("TextBox" & c.Text, "#,##0")

Next
End Sub

ご存知の方、お力を貸してください。

ウィンドウズ7のエクセル2013を使用しています。

現在、ユーザーフォームに60個のテキストボックスを設置しています。
数値入力されるとカンマが付くようコードを書いているのですが、まとめて処理できるようなコードはないでしょうか?

現在…

Private Sub TextBox1_Change()
TextBox1.Text = Format(TextBox1.Text, "#,##0")
End Sub

Private Sub TextBox2_Change()
TextBox2.Text = Format(TextBox2.Text, "#,##0")
End Sub

Private Sub TextBox3_Change()
TextBox3.Text = Format(TextBox3.Text, "#,##0")
End Sub

これを60個

試しにfor~Nextで書いてみ...続きを読む

Aベストアンサー

excelとのことですので、VBAですね。

単純に複数のコントロールを変数を用いて指定し、プロパティを設定するだけなら、Controlsコレクションを使用します。
http://www.moug.net/tech/exvba/0140013.html

ですが、

今回ご提示の質問のように、チェンジイベントをまとめて記述するには以下のような方法があります。
http://oshiete.goo.ne.jp/qa/8747288.html

QVBAのフォームでTextBoxがいっぱいある時

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

上手く配列化なんかでまとめる方法がありましたらアドバイスください。

Aベストアンサー

実質、数行なので説明といっても何を書けばいいのか・・・

●最初に・・・
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


説明は作るより難しいですね。
余り理論的ではなく、書いているコードの説明かもしれません。
クラスについて書かれた本も見かけるようになってきたので、その辺から調べてみてはどうでしょうか。

実質、数行なので説明といっても何を書けばいいのか・・・

●最初に・・・
VBAではVBと違い、コントロール配列の機能はありません。
しかし、コントロールのオブジェクト名をOptionButton1、OptionButton2、OptionButton3の
ようにすると、ユーザーフォームのオブジェクト名を .Controls("OptionButton" & i) で扱え、
あたかもコントロール配列のように使えます。CheckBoxでもTextBoxでも同じです。

例えば、CommandButton1 を押すと、OptionButton1からOptionButton31までの31個のValueを
判定するこ...続きを読む

Q複数のテキストボックスに同じ処理をしたい

以前同じような質問があったと思うのですが、検索しても見つけることができなかったので質問させていただきます。

現在VisualBasic.Netでプログラミングをしています。
フォーム上にTextbox1~5を配置し、それぞれに配列の値を挿入したいと考えています。
配列をa(i)として
For i=0 to 5
Textbox(i).text = a(i)
Next
このようにしてもエラーが出てうまくいきません。
Textbox1~5に同じ処理をするにはどうすればいいでしょうか?
解決法を教えていただきたいです。

よろしくお願いします。

Aベストアンサー

>For i=0 to 5
>Textbox(i).text = a(i)
>Next

ループカウンタがおかしくないですか?
TextBoxっていうコントロールがコントロール配列で
TextBox(1)
TextBox(2)
TextBox(3)
TextBox(4)
TextBox(5)
となっており配列aの要素が1~5になっているとしたら
For i=1 to 5
Textbox(i).text = a(i)
Next
とでいけるはずです。

Qユーザーフォームを表示中にシートの操作をさせるには

ユーザーフォームを表示中にシートの操作をさせる事はできるのでしょうか。
セルへの入力、画面のスクロールなどは、ユーザーフォームからマクロを実行させたり、.hideでユーザーフォームを一時的に隠すなどすればいいのでしょうが、そういう手段をとらないでユーザーフォームを表示中にシートの操作をさせる事はできるのでしょうか。

Aベストアンサー

ユーザフォームの
ShowModalプロパティを
falseにすればよいかと。

Qユーザーフォームで数字にカンマを付けたい

今EXCEL2003を使用しています。
ユーザーフォームのテキストボックスに数値を入力した際
例えば1000→1,000のように自動で千単位でカンマを表示させる事は可能でしょうか?

Aベストアンサー

VBA初級者くらいです。

Private Sub TextBox1_Change()
TextBox1.Value = Format(TextBox1.Value, "###,###")
End Sub

これじゃダメ?

QVBA テキストボックスに3桁カンマ表示させたい

お世話になります。

お世話になります。

VBAでフォームを作成しました。

”金額”というテキストボックスの数字を下記の様に表示したかったので記述しましたところエラーメッセージが出てしまいます。

Me.金額.Format = "合計:###,###,###,###円"

※エラーメッセージ
「メソッドまたはデータメンバが見つかりません」というエラーが出ています。

どなたかご教授いただけませんでしょうか?
よろしくお願い致します。

環境 Windows XP SP3 Excel2003

Aベストアンサー

テキストボックスの内容をほかに使うのであればテキストボックスに数値だけを表示し、前後にラベルをつけたほうが良いような気がする。 (そのような形式にすると、文字列になって数値処理が面倒になるような気がする。)
表示目的だけなら、textboxのconfirmedのイベントなどで
Me.金額.text = "合計:" & format(Me.金額.text,"###,###,###,###") & "円"
とするとか。

Qカンマ区切り

VBAのテキストボックスで表示や入力時に、カンマ区切りにするにはどうすればいいのでしょうか?

Aベストアンサー

ははは、タッチの差で的確なお答えが返ってきましたね。


#3のmaruru01さんありがとうございます。
ようは、分かればいいんで…(^^;

>そもそもformat文が何なのか使い方が分かりませんので
FORMAT文とは、表示の際に書式を決めるものです。maruru01さんのソースの中にありますが、"#,##0"とかが書式になります。"\#,###"とすれば数字の先頭に"\"マークがついた形で表示されます。書式について詳しく知りたい場合はヘルプを見てください。エクセルのセルの書式設定とほぼ同じ物です。

QエクセルVBA テキストボックスへのセットフォーカスについて

エクセルVBAでユーザーフォーム内に配置されたテキストボックス
への数値の入力時に、指定範囲内になければメッセージボックスで
規格外であることを警告し、その規格外が入力されたテキストボックス
を強制的に空欄にし、次のテキストボックスにフォーカスを移動させずに、入力間違いのテキストボックスにフォーカスを戻したいのですが
どうすればよいのでしょうか?
自分で考えた構文です。
Private Sub TextBox1_AfterUpdate()
Dim A As Single

A = TextBox1.Text
If A < 1.99 Or A > 3.00 Then
MsgBox "規格外!!"
    TextBox1.Text = ""
TextBox1.SetFoucus
End If
Exit Sub

End Sub

これですと、次のテキストボックスにフォーカスが移動してしまいます。
次のテキストボックスにフォーカスを移動させずに、規格内の値が
入力されるまでフォーカスを移動させない方法を教えて下さい。
お願い致します。

エクセルVBAでユーザーフォーム内に配置されたテキストボックス
への数値の入力時に、指定範囲内になければメッセージボックスで
規格外であることを警告し、その規格外が入力されたテキストボックス
を強制的に空欄にし、次のテキストボックスにフォーカスを移動させずに、入力間違いのテキストボックスにフォーカスを戻したいのですが
どうすればよいのでしょうか?
自分で考えた構文です。
Private Sub TextBox1_AfterUpdate()
Dim A As Single

A = TextBox1.Text
If A < 1.99 Or A...続きを読む

Aベストアンサー

こんにちは。Wendy02です。

>イベントをAfterUpdateにしましたが、Wendy02さんはExitを使っていますが、AfterUpdateではなぜ正しく動作しないのでしょうか?

イベント自体の問題よりも、イベントの機能を良くみたほうがよいですね。
_Exit(ByVal Cancel As MSForms.ReturnBoolean)

ここで、Return(戻り値)のブーリアン値があるようなので、それを利用しただけです。

>Cancel = True
が、フォーカスの移動をキャンセルしています。

別に、Exit でなくても良いのです。例えば、

_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
のKeyCode に入った 「13(Enter)」のコードを 0 で打ち消す方法でも、可能です。

If が True の時に、
 MsgBox "規格外!!",16
 TextBox1.Text = ""
 KeyCode = 0

でも可能です。

「なぜ?」というよりも、そういうパターンがあるということです。たぶん、AfterUpDateでも、方法によってはできるとは思いますが、かなり難しくなるのではないかなって思うだけです。

こんにちは。Wendy02です。

>イベントをAfterUpdateにしましたが、Wendy02さんはExitを使っていますが、AfterUpdateではなぜ正しく動作しないのでしょうか?

イベント自体の問題よりも、イベントの機能を良くみたほうがよいですね。
_Exit(ByVal Cancel As MSForms.ReturnBoolean)

ここで、Return(戻り値)のブーリアン値があるようなので、それを利用しただけです。

>Cancel = True
が、フォーカスの移動をキャンセルしています。

別に、Exit でなくても良いのです。例えば、

_KeyDown(By...続きを読む

Qエクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?

エクセルのVBAでユーザーフォームの中に
テキストボックスとラベルがあります。

ラベルの縦幅とテキストボックスの縦幅は
同じです。(文字1行分くらい)

そのテキストボックスの左隣にラベルを置いて、
項目名的なものを表示させたいと思うのですが
ラベルの値が上に寄っているので、垂直方向に
中央揃えさせたいのですが、設定の仕方が
分からず困っています。

ちなみにエクセルはXPで、VBAは詳しくありません。
詳しくないけど調べながらちょっとずついろいろ
作業しています。

どうぞよろしくお願いします。

Aベストアンサー

文字の上下中央設定は、確かにできませんね。
代案ですが、次のような操作はいかがでしょうか。

1.双方を選択した状態でプロパティを表示し、AutuSize の値を True にする。
2.前回のようにコントロールの位置を上下中央で揃える。
3.各コントロールの長さ(幅)や文字サイズを調整する。

Qテキストボックスの番号を使ったFor~Next文について

宜しくお願い致します。
エクセルのマクロのフォーム上にtextbox1~textbox10を作成してあります。
これら全てがきちんと入力されているかどうかを調べる命令を書きたいと思っております。
どのようにすればよろしいのでしょうか?

【エラー表示される私の考え】
For i = 1 To 10
If TextBox("& i & ").Value = "" Then
MsgBox ("データを再度入力してください。")
Exit Sub
End If
Next i

if文のところでエラーが出ます。textboxの表示方法がまずいと思うのですが、どうすればよいのかわかりません。ご指導の程宜しくお願い致します。

なお、For~Next文を使わない方法でも構いません。

Aベストアンサー

こんにちは。

Excelの場合コントロール配列は使えません。

TextBoxがTextBox1~TextBox10という名前であれば

Dim i As Integer
For i = 1 To 10
If Me.Controls("TextBox" & i).Value = "" Then
MsgBox ("データを再度入力してください。")
Exit Sub
End If
Next

TextBoxの名前を変更している場合は

Dim myctrl As Control
For Each myctrl In Controls
If TypeName(myctrl) = "TextBox" And myctrl.Value = "" Then
MsgBox ("データを再度入力してください。")
Exit Sub
End If
Next

でどうでしょうか。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報