• ベストアンサー

プログラムの実行時にフォーム上のコントロールを消したい

WinXP、VB.NET 2005で開発しております。 プログラムの実行時に フォーム上のすべてのコントロールを消したいのですが、 全部削除されません。 削除する部分のコードは以下の通りです。  For Each objcontrol As Control In Me.Controls   objcontrol.Dispose()   objcontrol = Nothing  Next デバッグで追っていくと、 いくつか実行した後にループを抜けてしまいます。 すべて消す方法をご存じの方、教えて下さい。 お願いいたします。

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

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.1

For Each を使いながら、該当オブジェクトを削除するからでは? コントロールに限らず、VBに限らず、こういうコードは危険です。 For I = Me.Controls.Count - 1 To 0 Step -1   Me.Controls(I).Dispose(); Next このようにしては如何でしょう?

mohmori77
質問者

お礼

ありがとうございます。 一発で解決しました。 頂いたアドバイスでなぜ駄目だったかもわかりました。 とても助かりました。

関連するQ&A

  • 全てのフォームを削除したい アクセス2010

    フォーム1とフォーム2がありまして、どちらもvbaで削除したいのですが Sub Sample() Dim obj As AccessObject For Each obj In CurrentProject.AllForms Debug.Print obj.Name & "を削除します" DoCmd.DeleteObject acForm, obj.Name Debug.Print obj.Name & "を削除しました" Next End Sub これを実行すると、フォーム2は削除できるのですが、 Nextの部分で、 実行時エラー'-2147467259(80004005)' オートメーションエラーです。エラーを特定できません。 と出て、 デバッグを押して再度実行すると、 実行時エラー92 for ループが初期化されていません にかわります。 デバッグウインドウには フォーム2を削除します フォーム2を削除しました が出力されます。 DoCmd.DeleteObject acForm, obj.Nameをなしにして、コードを実行すると、 フォーム2を削除します フォーム2を削除しました フォーム1を削除します フォーム1を削除しました が出力されます。 フォームを削除することによって順番が狂いエラーが発生するようですが、 そうであれば、どうすればすべてのフォームを削除することができるのでしょうか?

  • フォーム上の全てのコントロールを取得したい

    フォーム上の全てのコントロールを取得したいです。 (サブフォームも含め) 自分なりにVBAで考えてみたのがこれです。 Sub test() Dim 数 As Long For Each 数 In Form_フォーム1.Controls.Count ’Debug.Print ? End If Next End Sub でもこれだけでもデバックしてみると 「コンハ゜イルエラー for Eachは、コレクション オブジェクトまたは配列でのみ繰り返しを実行します。」 となります。 答えを教えてください! よろしくお願いします。 (アクセス2003です)

  • 2つ目以降のフォームを実行して表示させることができません

    もし同じような質問があったらすみません。(検索したのですが急いでいるので) Windowsフォームアプリケーションでデザインしたフォームが複数あります。(VBです) 1つ目をデバッグし、実行させ表示させることはできるのですが、 2つ目のフォームをデバッグさせると1つ目のフォームが実行して表示されてしまいます。 どのようにして2つ目以降のフォームをデバッグして表示させればいいのでしょうか?よろしくお願いします。

  • フォーム上のコントロールの名前を配列に格納したい

    アクセスです フォーム上のコントロールの名前を配列に格納したいのですが もっとスマートな方法はありますか? 私が考えたコードは Dim avarContorol As Variant Dim ctl As Control Dim mystr As String For Each ctl In Forms(Me.Name).Controls mystr = mystr & ctl.Name & "," Next ctl '右から1文字消す mystr = Left(mystr, Len(mystr) - 1) avarContorol = Split(mystr, ",") なのですが、 ループのみで格納できる方法があれば教えてください。

  • コントロールタイプを絞ってループしたい

    アクセスのフォーム上のコントロールをループする際に テキストボックスだけ絞ってループしたいのですが Sub Sample() Dim myFormName As String Dim ctl As Control myFormName = "フォーム1" For Each ctl In Forms(myFormName).Controls If ctl.ControlType = acTextBox Then End If Next ctl End Sub これだとテキストボックスの量が多くて、2秒くらいかかるのですが For Each ctl In Forms(myFormName).Controls この時点で、テキストボックスだけ絞る方法はありますか? For Each ctl In Forms(myFormName).ControlType(acTextBox) こうするとエラーになりました。 ご教授よろしくお願いします。

  • 実行時に、フォームを印刷

    WindowsXP, vb.net2005で開発しております。 プログラム実行時にフォームを印刷したいと考えております。 フォーム上には下記の3種類のコントロールが貼り付けてあります。  ラベル、  picturebox(イメージを表示)、  panel(バーコードを表示) 印刷はPrintDocumentを使用しています。 フォームをキャプチャーし、画像を印刷するようにしています。 印刷を行うと、必ずpictureboxの画像が最前面に表示されてしまいます。 フォームに指定した重なり順のまま印刷するにはどうすればよいのでしょうか? 以下、PrintDocument のPrintPageのソースです。 Private Sub pd_PrintPage(  ByVal sender As System.Object,  ByVal e As System.Drawing.Printing.PrintPageEventArgs)  Handles pd.PrintPage  'コントロールの外観を描画するBitmapの作成  Dim bmp As New Bitmap(Me.Size.Width, Me.Size.Height)  'キャプチャする  Me.DrawToBitmap(bmp,          New Rectangle(0, 0, Me.Size.Width,          Me.Size.Height))  '画像を描画する  e.Graphics.DrawImage(bmp, 0, 0, e.PageBounds.Width,            e.PageBounds.Height)  '後始末  bmp.Dispose()  '次のページがないことを通知する  e.HasMorePages = False End Sub

  • もしフォームヘッダーにコントロールがあるのなら

    アクセスのフォームの、フォームヘッダーに検索用テキストボックスとコンボボックスがあり、 詳細エリアにレコードソース(コントロールソース)に紐付いたテキストボックスが複数あります。 フォームヘッダーのフィルタを解除するコマンドを実行して、 フォームヘッダーのテキストボックスとコンボボックスをnullにしたいのですが、 vbaで「もしフォームヘッダーなら」ってするにはどうすればいいでしょうか? フォームヘッダーのコントロール名も詳細エリアのコントロール名も 区別のないコントロール名でなのでコントロール名で条件分岐をすることは不可能です。 Private Sub フィルタを解除コマンド_Click() Dim ctl As Control For Each ctl In Me.Controls If (ctl.ControlType = acTextBox) Or (ctl.ControlType = acComboBox) Then 'ここで、もしフォームヘッダーにコントロールがあるのならってしたい Me.Controls(ctl.Name) = Null End If Next ctl Me.Form.FilterOn = False End Sub このコードに付け加えてくれませんか? Debug.Print ctl.Name でコントロール名を取得するとフォームヘッダーも詳細もどちらのコントロール名も取得されてしまいます。 On Error Resume Next 以外でお願いします。

  • コントロールを削除すると、一つ飛ぶ アクセス

    こんばんは。よろしくお願いします。 フォーム上のイメージを削除してるのですが Sub test() Dim ctl As Control Dim FormName As String FormName = "フォーム2" DoCmd.OpenForm FormName, acDesign For Each ctl In Forms(FormName).Controls If ctl.Name Like "イメージ*" Then Debug.Print ctl.Name DeleteControl FormName, ctl.Name End If Next ctl End Sub これをすると、コントロールが一つ飛ばされます。 イミディエイトウインドウで値を確認すると イメージ0 イメージ2 イメージ4 になりました。 1、3、5が飛ばされました。 実行結果は画像のような感じです。 なぜ飛ばされちゃうのでしょうか? 普段、For Each ctl In Forms(FormName).Controlsを使う分には値が飛ばされる事はないので DeleteControl FormName, ctl.Nameが原因だと思うのですが、 全ての「イメージ」で始まるコントロールを削除したい場合、どうすえばいいですか?

  • null 参照の例外が実行時に発生する可能性があります

    VB初心者です。色々調べてみたのですが分からなくて、ヒントでも結構ですので教えていただけないでしょうか。 現在VB.Net2003 からVB2005に移行しているのですが下記の関数で現在開いているフォームを調べていますがVB.Net2003だとなんら問題なかったのにVB2005では「関数 'FormIsLord_Tag' は、すべてのコード パス上では値を返しません。結果が使用されるときに、null 参照の例外が実行時に発生する可能性があります。」という警告が出てしまいます Function FormIsLord_Tag(ByVal GetTag As String) As Form Dim LoopForm As Form Try For Each LoopForm In Forms If LoopForm.Tag = GetTag Then Return LoopForm End If Next Catch ex As Exception MessageBox.Show(ex.ToString) End Try End Function If LoopForm.Tag = GetTag Then とかの前にLoopFormがNothingだったらとか色々やってみましたがわからなくて・・・ 警告なので動かないって訳ではないのですが・・・ よろしくお願いします。

  • 全てのフォームを閉じるには?

    かなり昔の質問を引っ張り出しますがご容赦ください http://oshiete1.goo.ne.jp/qa4158345.html のように 今度はフォームを閉じたいのですが Sub 全てのフォームを閉じる() Dim フォーム As DAO.QueryDef For Each フォーム In CurrentDb().FormDefs DoCmd.Close acForm, フォーム.Name Next End Sub で、デバッグすると 「.FormDefs」の部分が ”コンパイルエラー メソッドまたはデータ メンバが見つかりません。 (Error 461)” になってしまいます。 Sub QueryAllClose() Dim Q As DAO.QueryDef For Each Q In CurrentDb().QueryDefs DoCmd.Close acQuery, Q.Name Next End Sub は問題なく行なえます。 フォームは不可能なのでしょうか?