VBAユーザーフォームを速く開く方法

このQ&Aのポイント
  • Excel2000を使用し、VBAでユーザーフォーム1と2を作成しています。ユーザーフォーム1のコマンドボタンを押すと、userform2.showが実行されてユーザーフォーム2が開きます。しかし、フォーム2には約400個のテキストボックスなどが設置されており、フォームの開くのに8〜10秒ほどかかります。フォームを速く開く方法について教えてください。
  • VBAを使用し、Excel2000でユーザーフォーム1と2を作成しています。ユーザーフォーム1のコマンドボタンを押すと、userform2.showが実行されてユーザーフォーム2が開きますが、フォーム2にはおよそ400個のテキストボックスなどが設置されており、フォームの開く時間が8〜10秒ほどかかっています。フォームを1〜2秒で速く開く方法を教えてください。
  • Excel2000を使用し、VBAでユーザーフォーム1と2を作成しています。ユーザーフォーム1のコマンドボタンを押すと、userform2.showが実行されてユーザーフォーム2が表示されますが、フォーム2には約400個のテキストボックスなどがあるため、フォームの表示に8〜10秒ほどかかります。フォームを速く開くための方法を教えてください。
回答を見る
  • ベストアンサー

VBA ユーザーフォームを速く開く方法について

VBA ユーザーフォームを速く開く方法について 現在Excel2000を使用しています。 VBAにてユーザーフォーム1と2を作成して、ユーザーフォーム1のコマンドボタンを押すと userform2.showが実行されてユーザーフォーム2が開きますが、フォーム2にはテキスト ボックスなどが約400個程設置してあり、そのせいかフォーム2が開くのに約8~10秒程かかり ます。 そこでそのフォームを速く開きたいのですが、(1秒~2秒程で)どうしたら速く開くでしょうか? Application.DisplayFullScreen = Falseなどを使用しても余り効果がありません。 パソコン自体の処理速度もあると思いますが、できるだけ速くしたいです。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.5

コントロール数の多さに加え、そのひとつひとつに表示切替のようなイベントプロシージャを 書いているのなら、「遅くなる」のは当たり前です。起動速度を改善したいのなら、 そちらを何とかすべきだと思いますよ。たとえば、 1. タブストリップコントロール等を用いて TextBox コントロールを使いまわす   ページの切り替え時に値を入れ替える処理を行います。 2. ユーザーフォームはあくまでインターフェースとし、核となる処理は標準   モジュールに書く。結果、ユーザーフォームのメモリ使用量は減り、起動は   早くなります。 など。

yasu7r
質問者

お礼

回等ありがとうございました。

yasu7r
質問者

補足

返答ありがとうございます。 1.については値を入れ替える処理を行うと一度に見れなくなってしまうのでできれば避けたいです。 2.についてはほぼ全てのイベントプロシージャは標準モジュールに書いてあり、ユーザーフォームはインターフェースとして使用しています。 TEXT BOXのひとつひとつにイベントプロシージャを書いているわけではなくFrameでテキストボックスを20個単位くらいでくくり、そのうちのひとつのテキストボックスでkey downすると次のFrameが表示されるようにしてあります。(Visible=True) なのでユーザーフォームにはサブの呼び出しと上記のFrameの表示の程度のプロシージャなのですがどうでしょうか?

その他の回答 (4)

  • hige_082
  • ベストアンサー率50% (379/747)
回答No.4

メモリへ読み込みのみ表示はしない Load UserForm1 フォームの表示 UserForm1.Show フォームの非表示 UserForm1.Hide メモリから削除 Unload UserForm1 ファイルを開いた時に Loadでメモリにフォームを読み込んでおいて 必要な時にShowでフォームを表示 Hideでフォームを閉じる ファイルを閉じる時に Unloadでメモリから削除する 参考まで

  • myRange
  • ベストアンサー率71% (339/472)
回答No.3

最初でUserForm1,2を同時に開いて、 UserForm2はHideにしておき 使うときだけShowしてみたらどうでしょうか。 以上です。

回答No.2

リストビューを使うのは駄目でしょうか? リストビュー 追加ボタン、削除ボタン、編集ボタン等と いくつかのテキストボックス で複数行の入力をするとか。 (1列であればリストボックスで同様な感じで) 参考 ListViewコントロールの使い方 http://officetanaka.net/excel/vba/listview/index.htm

yasu7r
質問者

補足

このやり方であれば処理は早そうですね! リストボックスを使用する所には気付きませんでした。 しかし今かなりの量のマクロをuserform2で使用している為、リストボックスを使用する方法にすると また1から作り直さないといけない部分があるので、できたらやはり今のまま高速化したいです。。。

回答No.1

>はテキストボックスなどが約400個程 そんなにテキストボックスがあって、一気にすべてユーザが入力するということなのでしょうか? (200個ほど入力して、誤って画面を閉じちゃったりしたら全てやり直し?) 別のコントロールや、複数の段階に分けて入力するということが可能か検討してみてはどうでしょうか?

yasu7r
質問者

補足

ユーザーは全て入力する訳ではありません。 テキストボックスは多く設置してありますが、例えばテキストボックス1でkey downしたらテキストボックス2が表示されるような感じで最初から全て表示されてはいません。 あとユーザーではフォーム2のコマンドボタンの閉じるを押さないと、フォームを閉じられないように右上の×ボタンは非表示にしてあります。コマンドボタンの閉じるを押すと入力した内容はエクセルシートに全て保存されるマクロにしてあります。 できれば複数の段階に分けずにに一つのフォームで行った方が作業効率が良いのでそうしたいのですが、 やはり難しいでしょうか?

関連するQ&A

  • Excel VBAで、ユーザーフォームの値を、モジュールで使用したい。

    VBA初心者です。(おそらく)基本的な質問で、申し訳ありません。 ユーザーフォーム1には、テキストボックス1とコマンドボタン1が配置されているとします。 Sub TEST () Dim N Userform1.Show MsgBox N End Sub Private Sub CommandButton1_Click() Dim N N = TextBox1.Text UserForm1.Hide End Sub Sub TESTを実行した時に、ユーザーフォーム1からNの値を引き継ぐには、どうしたら良いのでしょうか?よろしくお願いします。

  • Excel VBAで別のブックからユーザーフォームの閉じる

    Excel VBAで別のブックからユーザーフォームの閉じたいのですが うまくいきません。 教えてください。 Private Sub CommandButton2_Click() Application.Visible = False Unload Workbook.("材料リスクマップ検索Ver2.xls")UserForm3・・・・※ Workbooks.Close userform3:=ThisWorkbook.Path & "あああ.xls" Workbooks("\いいい.xls").Close savechanges:=False UserForm1.Show vbModeless End Sub ※印のところが赤字にかわります。 コマンドボタン2は、いいい.xlsにあり、フォームを閉じたいのはあああ.xlsのUserform3です。 その後、ファイル名いいい.xlsは閉じます。 コードが間違っているかと思いますが、どんな風にすればよいかわかりません。初歩的なこととは思いますがよろしくお願い致します。

  • エクセルVBAのユーザーフォーム上のテキストボックスについての質問です

    エクセルVBAのユーザーフォーム上のテキストボックスについての質問です。 Aのユーザーフォームの内容をBのユーザーフォームのテキストボックスへ引き継いで、Bのユーザーフォーム上で内容を編集するという仕組みにしたいのです。 Bのユーザーフォームは新規入力もかねたユーザーフォームなので、テキストボックスのイベントにAfterUpdateを使用して、テキストボックスの内容が書き換えられるとデータベースから検索して新規か既存か判断させています。 AのユーザーフォームからBのユーザーフォームのテキストボックスへ引継ぎさせるときにこのAfterUpdateを発生させたくないのですが、Application.EnableEvents=Falseなどを使ってもイベントが発生してしまいます。 また、イベントがどのタイミングで発生するかと、コードをステップで実行させると、このイベントは発生しません。そのために、いきづまってしまいました。 AのユーザーフォームからBに引き継ぐ処理  ユーザーフォームB.Load ---ユーザーフォームBのイニシャライズが実行される  ユーザーフォームB.テキストボックス = ユーザーフォームA.テキストボックス  ユーザーフォームB.Show ちょっと簡単に書きすぎですがこんな感じです。 コードをステップで実行するとユーザーフォームBのAfterUpdateは実行されません。(VBAエディタのバグ?) どなたか回答お願いします。

  • VBA ユーザーフォーム

    エクセルVBAのユーザーフォームのInitializeでnに値を代入し Private Sub UserForm_Initialize() Dim n As Long n = 19 ・・・・・ End Sub 同じユーザーフォームのボタンコマンドが押されたら Private Sub CommandButton2_Click() MsgBox n Worksheets("AAA").Cells(n, 3).Value = Me.テキストボックスの値.Text n = n + 1 End Sub nの値を用いてセルにテキストボックスの値を入れるというプログラムです。 値をいれたら、nをひとつ増やして次に備えるようにしたいのですが。 そもそも最初にnの値が受け渡しできません。 ボタンコマンドの最初の行でメッセージボックスにnの値を表示して確認しても何も数字が表示されません。 nの値の受け渡しを方法を教えてください。

  • 複数のユーザーフォームをコマンドボタンにて表示・非表示させるには

    VBA勉強中のものです。 複数のユーザーフォームをコマンドボタンを使用して画面への表示切替を考えております。 例)ユーザーフォーム1,ユーザーフォーム2,ユーザーフォーム3のそれぞれにコマンドボタン1,コマンドボタン2,コマンドボタン3を作成し、   コマンドボタン1→ユーザーフォーム1を表示   コマンドボタン2→ユーザーフォーム2を表示   コマンドボタン3→ユーザーフォーム3を表示 とするようなことを考えおります。  そこで、下記のようにコードを作成したのでですが,一度表示させたユーザーフォームを再度表示させようとコマンドボタンをクリックしたら、「フォームはすでに表示させているのでモーダル表示はできません」とエラーがでてしまいます。   どなたか、どのようにしたらいいかご教授ねがいます。 サンプルコード) --------------------------------------------------- 'UserForm1のコード Private Sub CommandButton2_Click() Call UserForm2_show UserForm1.Hide End Sub Private Sub CommandButton3_Click() Call UserForm3_show UserForm1.Hide End Sub ---------------------------------------------------- 'UserForm2のコード Private Sub CommandButton1_Click() Call UserForm1_show UserForm2.Hide End Sub Private Sub CommandButton3_Click() Call UserForm3_show UserForm2.Hide End Sub ------------------------------------------------------- 'UserForm3のコード Private Sub CommandButton1_Click() Call UserForm1_show UserForm3.Hide End Sub Private Sub CommandButton2_Click() Call UserForm2_show UserForm3.Hide End Sub ------------------------------------------------------------ '標準モジュール コード Sub UserForm1_show() UserForm1.Show End Sub Sub UserForm2_show() UserForm2.Show End Sub Sub UserForm3_show() UserForm3.Show End Sub

  • Excel vbaでフォームの起動が失敗する

    Excelシート上に設置したユーザフォームを開くボタンを実行するとフォームが開かずに新規のExcelシートが開いてしまいます。 以前までは正常に作動していたんですが••• ちなみにボタンの実行前に vbaの編集画面を一度でも開いた後はボタンを押したら正常にフォームが開くんです。 フォームを開くコード sub 起動() UserForm1.Show End Sub フォームのInitializeはコンボボックスのみです。 原因がわかりましでしょうか?

  • VBAでユーザーフォームの表示を確認

    VBAでユーザーフォームが表示されていなかったら UserForm1.Show vbModeless で表示させるようなプログラムを組みたいのですが 表示されているかどうかはそのようなコードで調べることができますでしょうか?

  • EXCEL VBA ユーザーフォーム内に入力パットを設置する方法について

    EXCEL VBAについて質問があります。うまく説明できるかちょっと自信が無いのですが。 Userformを挿入し、フォーム内にテキストボックスを一個と コマンドボタンを複数設置する。 コマンドボタンはTakeFocusOnClickをFalseにする。 Private Sub CommandButton1_Click() SendKeys "{A}" End Sub これで テキストボックスに「A」という文字が入るはずですが、 このやり方で日本語入力を行い、スペースキーを押して 漢字変換が出来るようにするにはどうしたらよろしいのでしょうか。 SendKeys "{あ}" では確定された「あ」が入力されてしまい、 スペースキーを押しても変換が出来ません。 SendKeys "{a}" だと変換は出来るのですが、あ~おまでの母音だけしか入力ができず、か行以降の入力が出来ませんでした。 IMEの設定と関係があるのかなとも思ったのですが、色々いじっても どうもうまく出来ませんでした。 どうぞよろしくお願いいたします。

  • 2つのユーザーフォームの表示切替(Excel2002VBA)

    Excel2002VBAを使用しています。 UserForm1 に CommandButton1 を配置したものと UserForm2 に CommandButton2 を配置したもの があります。 UserForm1が表示されている時、CommandButton1 を クリックすると、UserForm2 が表示され UserForm1 が非表示になり、 UserForm2 が表示されている時  CommandButton2 をクリックすると UserForm1 が 表示され UserForm2 が非表示になる というように 画面上にどちらか一方だけユーザーフォームを表示 させたいのですが上手くいきません。 CommandButton1 の Clickイベントに UserForm2.show vbmodeless Unload UserForm1 CommandButton2 の Clickイベントに UserForm1.show vbmodeless Unload UserForm2 と記述したのですが、実行すると、 ”このオブジェクトは、ロードまたはアンロード することはできません。”とエラー表示が出てき ます。 何とぞご教授よろしくお願いいたします。

  • EXCEL VBAのユーザーフォームに引数を渡す方法について

    すいません、EXCEL VBAのユーザーフォームに引数を渡す方法についてご質問があります。 シート上にコマンドボタンを2つ用意する。 コマンドボタン1を押すと変数mは1 コマンドボタン2を押すと変数mは2 としてユーザーフォームを呼び出す。 Public m As Integer Private Sub CommandButton1_Click()  m = 1  Call フォーム呼び出し(m) End Sub Private Sub CommandButton2_Click()  m = 2  Call フォーム呼び出し(m) End Sub Sub フォーム呼び出し(m As Integer)  UserForm1.Show End Sub 次にユーザフォームにコマンドボタンを1個置き、 ボタンを押したとき、mが1であれば「ボタン1」 mが2であれば「ボタン2」 とメッセージボックスを出し、ユーザーフォームを閉じる。 Private Sub CommandButton1_Click()   If m = 1 Then    MsgBox "ボタン2"   ElseIf m = 2 Then    MsgBox "ボタン2"   End If  Unload UserForm1 End Sub プロシージャ間の引数渡しは色々なテキストに載っているのですが ユーザーフォームに引数を渡す方法はどうも見つからず、 Private Sub CommandButton1_Click(m) としても、コンパイルエラーとなってしまいます。 よろしくご教示をお願いいたします。