- ベストアンサー
〔ExcelVBA〕ユーザーフォームテキスト
KenKen_SPの回答
- KenKen_SP
- ベストアンサー率62% (785/1258)
こんにちは。KenKen_SP です。 電卓のような入力...ということでクラスを作ってみました。取り合えず、 サンプルとして手順説明通り試してみて下さい。なお、クラスを他ブックに インポートし、Form_Initialize イベントにクラス関連付けのコードを追加 するだけで、他案件でも簡単に使いまわせます。 長いソースですが、慣れると簡単な作業です。 注) クラスとフォームと2つのソースがあります。 ' ソース1 の貼り付け手順 ' 1. VBE [挿入]-[フォーム] をクリック ' 2. 1. で挿入したフォームに次のコントロールを配置 ' Textbox1 ' Textbox2 ' CommandButton1 ' 3. ソース1 をフォームモジュールへコピペ ' ソース1 Option Explicit ' 冒頭で NumTextbox クラスを使うことを宣言します ' 今回は2つのテキストボックスを使うので(1 TO 2) Private NumCtrl(1 To 2) As New NumTextbox Private Sub UserForm_Initialize() ' 数値用テキストボックスにそれぞれ NumTextbox クラスを関連付けます Set NumCtrl(1).Bind = Me.TextBox1 Set NumCtrl(2).Bind = Me.TextBox2 End Sub Private Sub CommandButton1_Click() On Error GoTo ERROR_HANDLER MsgBox "合計:" & CStr(CCur(TextBox1.Value) + CCur(TextBox2.Value)) Exit Sub ERROR_HANDLER: If Err.Number = 6 Then MsgBox "テキストボックスの値は文字列なので整数部29桁まで" & vbLf _ & "入力可能ですが、計算時はオバーフロー対策が必要です。", _ vbCritical, "注意事項" End If End Sub ' ソース2 の貼り付け手順 ' 1. VBE [挿入]-[クラスモジュール] をクリック ' 2. 1. で挿入したクラスのプロパティーウインドウでモジュール名を ' を [NumTextbox] に変更 ' 3. ソース2 をコピペ ' ソース2 Option Explicit ' // 数値入力用テキストボックス制御クラス Private WithEvents TextBoxCtrl As MSForms.TextBox ' ------------------------------------------------------------------- ' コンストラクタ・デストラクタ ' ------------------------------------------------------------------- Private Sub Class_Terminate() Set TextBoxCtrl = Nothing End Sub ' ------------------------------------------------------------------- ' プロパティー ' ------------------------------------------------------------------- Public Property Set Bind(ByVal Ctrl As MSForms.TextBox) Set TextBoxCtrl = Ctrl With TextBoxCtrl ' IME モードを無効にしてテキストを右揃えにする .IMEMode = fmIMEModeDisable .TextAlign = fmTextAlignRight End With End Property ' ------------------------------------------------------------------- ' イベント ' ------------------------------------------------------------------- ' 特定キー以外の入力を不可にする Private Sub TextBoxCtrl_KeyDown( _ ByVal KeyCode As MSForms.ReturnInteger, _ ByVal Shift As Integer) Dim lPeriodPos As Long Dim sNum As String Select Case KeyCode ' 数字キー許可 Case 48 To 57, 96 To 105 ' ただし整数部が29桁以上ならフォーマットできないのでキャンセル With TextBoxCtrl If Len(.Text) > 0 Then lPeriodPos = InStr(.Text, ".") If lPeriodPos > 0 Then sNum = Left$(.Text, lPeriodPos - 1) Else sNum = .Text End If sNum = Replace(sNum, ",", "") sNum = Replace(sNum, "-", "") If Len(sNum) = 29 Then KeyCode = 0 End If End With ' Enter等の特定制御キーは許可 Case vbKeyReturn, vbKeyTab, vbKeyDelete, vbKeyBack Case vbKeyLeft To vbKeyDown ' マイナスは冒頭で一つまで許可 Case vbKeySubtract With TextBoxCtrl If Len(.Text) > 0 Or InStr(.Text, "-") > 0 Then KeyCode = 0 End With ' ピリオドは一つまで許可 Case 110, 190 If InStr(TextBoxCtrl.Text, ".") > 0 Then KeyCode = 0 ' その他キーキャンセル Case Else: KeyCode = 0 End Select End Sub ' 値が変化したらフォーマットする Private Sub TextBoxCtrl_Change() Dim lPeriodPos As Long Dim sNum As String Dim lNum As String On Error Resume Next With TextBoxCtrl If Len(.Text) > 0 Then lPeriodPos = InStr(.Text, ".") If lPeriodPos > 0 Then lNum = Left$(.Text, lPeriodPos - 1) sNum = Mid$(.Text, lPeriodPos) Else lNum = .Text End If .Text = FormatNumber$(lNum, 0, vbTrue, vbFalse, vbUseDefault) & sNum End If End With End Sub
関連するQ&A
- ExcelVBAでセルをクリックしてユーザーフォームを表示するには
OfficeExcel2003を使用しています。 ユーザーフォームのテキストボックスやコンボボックスに文字や数値を入力し、OKボタンを押せばエクセルのセルに記入できるようにしようと思ってます。 フォームはなんとか(形だけですが..)作成できたのですが、そのフォームを呼び出す方法として、入力したい行のA列のセルをクリックすればユーザーフォームが表示されるようにしたいのです。 ネット上でいろいろ検索してみましたがなかなか見つけることができませんでした。 初歩的な質問かもわかりませんが、教えて頂けないでしょうか。 宜しくお願い致します。
- ベストアンサー
- オフィス系ソフト
- VBAユーザーフォームで
エクセルVBAでユーザーフォームより、テキストボックスで入力させたものをセルに表示させようとしています。 テキストボックスは1と2があり、テキストボックス1で入力した値の最初の5文字+固定値をテキストボックス2に自動で入力(表示)したいのですがなかなかうまくいきません。(自動入力後、手動で一部修正します。) VBAをはじめたばかりの初心者ですが、どうぞよろしくお願いします。
- ベストアンサー
- オフィス系ソフト
- エクセルのユーザーフォームについて
エクセルマクロのユーザーフォームのテキストボックスに セルの値を表示する方法で質問です。 ユーザーフォームを表示するとその時点での セルの値はテキストボックスに表示されているのですが ユーザーフォームを表示したまま 別のブックのセルを選んだ際に そのセルの内容がテキストボックスに表示されるようにしたいです。 ボタンや、なにかをするわけではなく 自分で任意のセルを選択したら、という事です。 ユーザーフォームには selectionchange などがないのでどうすれば良いかわかりません。 宜しくお願いします。
- ベストアンサー
- Excel(エクセル)
- 【VBA】ユーザーフォームから、シート上のテキストボックスを操作
ユーザーフォームで入力した値を、シート上にあるテキストボックスに入力させたいのですが、 どのように記述すればいいのでしょうか?(ボタンで操作) またおなじくテキストボックスの大きさ、フォントの大きさ、などを操作するにはどのようにしたらいいですか?
- ベストアンサー
- オフィス系ソフト
- ユーザーフォームについて
エクセル2002です。 ユーザーフォーム内のテキストボックスを使用して、 (1)A1のセルに1と入力されている状態でマクロを起動した場合、 (2)ユーザーフォーム内のテキストボックスには2と表示される (3)ユーザーフォーム内のボタンを押すと、A2のセルに2と入力される。 このような流れで、A列のデータ最終行に番号をふっていきたいです。 (A列のデータ最終行がA30なら、A31に31と番号をふる) ユーザーフォームのテキストボックスとボタンは作ってあるのですが、 それぞれに入れるコードを教えていただけないでしょうか。 よろしくお願いします。
- ベストアンサー
- オフィス系ソフト
- ユーザーフォームのテキスト印刷
ユーザーフォームでテキストだけ印刷させる方法はありますか? ユーザーフォームに何箇所か入力するリストボックス、テキストボックスなどがあり、すべてを入力した後、最後にエクセルに登録するようなフォームなのですが、登録する前にそれらを印刷できればと思います。 登録したエクセルを印刷してもいいんですが、他の情報とかがあるのでユーザーフォームだけを印刷したいです。また、ユーザーフォームをそのまま印刷するとよけいな装飾なども印刷されトナーがもったいないのでそれもしたくはありません。 宜しくお願いします。
- ベストアンサー
- Visual Basic
- ExcelVBA テキストボックスについて
フォーム上100個のテキストボックスがあります このテキストボックスに入力制限を加えたいのですが、どのように書けばよろしいでしょうか? ・半角数字だけしか入力できない(計算に使う) ・入力すると、1,234,567のような表示になり、右詰め ・10桁までしか入力できない ・予定の計算結果だと、10億を超えない ・計算結果は数字が入力されるたびLabel1に表示される 私の作ったマクロだと、全てのテキストボックスに同じようなマクロを登録する結果になってしまい、これってもっと短くかけるのでは?と思い、質問いたしました よろしくおねがいします
- ベストアンサー
- オフィス系ソフト
- ユーザーフォームで数字にカンマを付けたい
今EXCEL2003を使用しています。 ユーザーフォームのテキストボックスに数値を入力した際 例えば1000→1,000のように自動で千単位でカンマを表示させる事は可能でしょうか?
- ベストアンサー
- オフィス系ソフト
- ユーザーフォームのテキストボックスに配列の値を読み込む方法を教えて下さい
お世話になります ユーザーフォームのリストボックスにAddItemで記述したデータを表示するような形で、ユーザーフォームのテキストボックスに配列にとりこんであるデータの値を順番に読み込むようにしたいのですが、このようなことができるのでしょうか? どなたか教えて頂けないでしょうか
- ベストアンサー
- Visual Basic
- ExcelVBA ユーザーフォームに関しての質問です。
ExcelVBA ユーザーフォームに関しての質問です。 ユーザーフォームでフレームを使って、 フレーム内に複数のチェックボックスを配置したとします。 行いたい作業としては次の2点 ?フレーム内に配置したチェックボックスのうち、チェックが入っているものだけの数を調べる ?チェックが入っているボックスの値(caption)を取得して、変数に入れる 以上のことができるでしょうか?
- ベストアンサー
- オフィス系ソフト
お礼
KenKen_SP さん。ありがとうございます。 私はまだまだ未熟ですので、このコードを全て読みこなすことはできませんが、確かに電卓になりました。とりあえずテキストボックス入力中にリアルタイムで3桁区切り表示されればよかったのでChangeイベントで解決したのですが、KenKen_SPさんからご教示いただいたコードは本当に電卓みたいですね! ところで、「クラス」って初めてなのですが、簡単に言うとどのような利用の仕方をするものなのでしょうか? VBAって本当に奥が深いですね。私のような未熟者でもVBAをはじめてから仕事のスピードが10倍になりました。