• ベストアンサー

VBAでユーザーフォームを再表示させたい。

ExcelのVBAでユーザーフォームを作成し、 Initializeイベントで初期化をし、コマンドボタンを クリックしたら処理を行うように作成しました。 ところがコマンドボタンによって処理を行った後、 再度Initializeイベントを呼びたいんです。。 (コンボボックスの表示を更新する処理を 含んでいるため) なんとかうまい方法はないでしょうか??

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

  • ベストアンサー
回答No.3

まったく、トンチンカンな答えかも知れませんが・・・ > まったく、このコンボボックスの内容が変化しないんです。 UserForm4.ComboBox1.AddItem は後へ後へと追加するばかりだと思うんです。 つまり、下の方に変化した内容がありませんか? 最初から入れ直したいのであれば、コンボボックスをクリアする必要があると思うのですが。 で、3行目にクリアするのを追加してみました。 Private Sub UserForm_Initialize() Dim i As Integer UserForm4.ComboBox1.Clear Worksheets("Sheet1").Select Range("B4").Select For i = 4 To 200 If Range("B" & i).Value <> "" Then UserForm4.ComboBox1.AddItem Range("B" & i).Value End If Next i End Sub

その他の回答 (3)

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.4

#2です。 #3さんのおっしゃるように追加されているだけです。 10行くらいのリストで下記のようにすると解かります。 Private Sub CommandButton1_Click()  Call UserForm_Initialize  ComboBox1.ListRows = ComboBox1.ListCount End Sub #3さんの回答で解決と思いますが、途中に空白行が無いリストなら RowSource を使って処理をした方がモードレスでユーザーフォームを呼んだ時にセルの値がタイムリーに変化するように出来ます。 '**************************** 'フォームモジュール '↓フォームモジュールの一番上に宣言 Dim LRow As Long Private Sub CommandButton1_Click()  '---最下部にランダムな数字を追加する-----------  Randomize  Worksheets("Sheet1").Range("B" & LRow + 1) = _           Int((100 - 1 + 1) * Rnd + 1)  '----------------------------------------------  Call UserForm_Initialize End Sub Private Sub UserForm_Initialize() Dim s As String  With Worksheets("Sheet1")    LRow = .Range("B65536").End(xlUp).Row    s = .Range("B4:B" & LRow).Address  End With  ComboBox1.RowSource = s End Sub '**************************** '標準モジュール Sub フォーム表示()  UserForm1.Show 0 End Sub

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.2

#1さんの回答通り、単純に Call してもOKですし、 Private Sub CommandButton1_Click()  'ほげほげの処理  Call UserForm_Initialize End Sub こんな感じで別のルーチンにしても良いと思います。 *********************** Private Sub UserForm_Initialize()  myMsg ("起動") End Sub Private Sub CommandButton1_Click()  myMsg ("ボタン押下") End Sub Private Sub myMsg(s As String)  MsgBox s End Sub ***********************

noriemon
質問者

補足

お返事ありがとうございます。 ところが、Callしてもコンボボックスには元のデータが表示されたままなんですよね。 ちなみにInitializeイベントはこんな感じなのですが、、、 Private Sub UserForm_Initialize() Dim i As Integer Worksheets("Sheet1").Select Range("B4").Select For i = 4 To 200 If Range("B" & i).Value <> "" Then UserForm4.ComboBox1.AddItem Range("B" & i).Value End If Next i End Sub まったく、このコンボボックスの内容が変化しないんです。 コンボボックスの中身のリセットみたいなことをしたほうがいいんでしょうか?また、どのようにやったらいいのか、思いつきません。よいアイディアがあったら教えてください。

noname#6715
noname#6715
回答No.1

callで呼べませんか?

関連するQ&A

  • 【VBA】ユーザーフォームでvbYesNo

    VBA ユーザーフォームのコマンドボタンで「はい」「いいえ」を作成し、ダイアログボックスのvbYesNoと同等の事をしたいのですが、どうすればよろしいでしょうか? コマンドボタンを押すと「0」か「1」が返ってくるようにしたのですが、ユーザーフォームだけ表示され、回答を待たず次へ進んでしまいます。 ダイアログボックスのように選択の回答待ちのような状態にするにはどうすればよいかご教授おねがいします。

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

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

  • 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のユーザーフォーム・・

    教えてください。 ユーザーフォームのテキストボックス・コンボボックスに入力した文字列をコマンドボタンを押したら、セルC1・B1に反映させたいのですが、できません。 このコマンドボタンには他のプログラムも入っており、同時にプログラムを実行したいのですが。

  • エクセルVBAのユーザーフォームのコンボボックス

    エクセルVBAのユーザーフォームのコンボボックスの入力と ファイルの保存で質問です。 エクセルVBAで ユーザーフォームのコンボボックスを使用して 1月から12月までを選択してもらい、 選択した月を コマンドボタン押した際に、 セルにその値を入力するような マクロを作成しようとしています。 またコンボボックスは標準で6月が表示されるようにしたいと思います。 ユーザーフォームのコードの一部です。 Private Sub UserForm_Initialize() Dim m As Integer For m = 1 To 12 UserForm1.ComboBox1.AddItem m Next ComboBox1.ListIndex = 6 Private Sub CommandButton1_Click() 'ユーザーフォームを閉じる Unload UserForm1 mold  '↑フォームを閉じた後に実行される標準モジュールのマクロ名です End Sub 標準モジュールのコード 名称 「mold」 Sub mold() ActiveWorkbook.SaveAs _ Filename:="C:\_" & UserForm1.ComboBox1.Text & "月", _ FileFormat:=xlOpenXMLWorkbook ActiveWorkbook.Close ThisWorkbook.Activate ' End Sub の様に作成して実行してみたのですが、 コンボボックスで11月を選択しても 6月のままのファイルになってしまいます。 どのようにしたら、 コンボボックスで選択した値を ファイル名として保存できるでしょうか? 全部のコードを記載しますと 長くなってしまうと思い、 関連するコードを記載して質問しました。 分かりづらい所もあるかと思いますが よろしくお願いします。

  • VBAのユーザーフォームの使い方

    皆様、こんにちは。 VBAのユーザーフォームを習い始めた初心者です。本の説明を読んでもユーザーフォームの使い方がよく分かりません。例えば、あるセールをクリックしたら、フォームが表示される、そしてフォームの中にあるコンボボックスのリストの中から選ばれた値が最初に選択したセールに入力されるという使い方がありえますか?申し可能でしたら、コード作成の例をいただけないでしょうか? どうぞよろしくお願いいたします。

  • エクセル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のマクロでユーザフォームにボタンを配して、それによってエクセルシートのデータを更新するようなマクロを作りたいのですが、ユーザフォームの挿入でボタン配置まではできるのですけど、どのようにリンク付けするのかコーディング等、解りません。お教え下さい。簡単なサンプルコーディングがあれば助かります。

  • エクセルのユーザーフォームについて

    エクセルのユーザーフォームについて教えてください。 ユーザーフォームにてメニュー画面を作成しました。 ユーザーはメニューからの操作だけでエクセルシートを作成できるようなマクロをつくりました。 ユーザーフォームのコマンドボタンでEXCELを終了させることはできますか? VBAの記述方法も教えてください。

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

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

専門家に質問してみよう