次の方法で共有

Excel 2007 入れ子フレームの動的生成が動作しない。

Anonymous
2013-01-10T11:36:14+00:00

お世話になります。Excel 2007のユーザフォーム上に入れ子のフレームを使用したマクロを

作成していますが、うまく動作しなくて困っています。入れ子のフレームは実行時に動的に生成する作りとしたいのです。

手順と現象としては以下のようになります。

1.フォームエディタでUserForm1上にフレームを作成(オブジェクト名"Frame1"のまま)し、下記ソースを標準モジュールに作成。

標準モジュール=================================================

Option Explicit

Sub frametest()

Dim subFrameCtl                 As MSForms.Frame

With UserForm1.Frame1

Set subFrameCtl = .Controls.Add("Forms.Frame.1", "tempFrame")

subFrameCtl.BackColor = RGB(0, 0, 0)

End With

UserForm1.Show

End Sub

===========================================================

上記コードを実行すると、正常に"Frame1"上に子フレームが表示されます。

2.上記UserForm1上のFrame1のオブジェクト名を"FrameRenamed"に変更し、標準モジュールのソースも同じく変更する。

標準モジュール=================================================

Sub frametest()

Dim subFrameCtl                 As MSForms.Frame

With UserForm1.FrameRenamed ' ←リネーム後の名前に変更

Set subFrameCtl = .Controls.Add("Forms.Frame.1", "tempFrame")

subFrameCtl.BackColor = RGB(0, 0, 0)

End With

UserForm1.Show

End Sub

===========================================================

上記コードも正常に動作しました。

3.上記の後、フォームエディタで、UserForm1上にもう一つFrameを追加(デフォルトのまま、オブジェクト名は"Frame1")。

標準モジュールは上記手順2のまま何も変更せず、再度"frametest"を実行→「Micro Soft Excelは動作を停止しました。」と表示され、マクロが実行できない。

関係あるかどうかわからないのですが、このとき、「コンピュータの管理」で「Windowログ」→「アプリケーション」でエラーログを見ると、

『障害が発生しているアプリケーション名: EXCEL.EXE、バージョン: 12.0.6665.5003、タイム スタンプ: 0x5061d2a8

障害が発生しているモジュール名: ole32.dll、バージョン: 6.1.7601.17514、タイム スタンプ: 0x4ce7b96f

例外コード: 0xc0000005』

と表示されています。いろいろネット上を探したのですがヒットできず、申し訳ありませんがご教示頂ければありがたく。

因みに、実行環境ですが、

Windows 7 Home Premium SP 1 (64bit OS)

Core(TM) i7-2677M 1.80GHz

RAM:400GB

になります。私の環境だけでしょうか?

Microsoft 365 と Office | Excel | 家庭向け | Windows

ロックされた質問。 この質問は、Microsoft サポート コミュニティから移行されました。 役に立つかどうかに投票することはできますが、コメントの追加、質問への返信やフォローはできません。

0 件のコメント コメントはありません

質問作成者が受け入れた回答

Anonymous
2013-01-10T14:56:17+00:00

引続きテストしてみました。

全く解決にはつながらないのですが、手動、自動を問わず、ユーザーフォームに最後に置かれたFrame以外のFrameにFrameを置こうとするとエラーになるようですね。

例1

UserForm1に数個のFrameを配置して実行

Sub aaa()

Dim wCtrl

For Each wCtrl In UserForm1.Controls

  If LCase(TypeName(wCtrl)) = "frame" Then

    On Error Resume Next

      With wCtrl.Controls.Add("forms.frame.1")

        .BackColor = RGB(0, 0, 0)

      End With

      If Err <> 0 Then

        MsgBox wCtrl.Name

      End If

    On Error GoTo 0

  End If

Next

UserForm1.Show

Unload UserForm1

End Sub

例2

空のUserForm2に対して実行

Sub bbb()

With UserForm2

  Set wctrl1 = .Controls.Add("forms.frame.1")

  Set wctrl2 = .Controls.Add("forms.frame.1")

  With wctrl1

   .Controls.Add "forms.frame.1"

  End With

  .Show

End With

なお、両方共ユーザーフォームは表示されますが、これはエラーエスケープしているためらしく、フォームがUnloadされる時にExcelがクラッシュすることは同じです。

珍しいと思われるケースでも英語圏の情報を検索して見ると結構いろいろ出てくるのですが、これに関しては、ざっと見たところ1件くらいしかなく、それも単に上手く行きませんレベルの情報になっていて複数のFrameがあるのかどうか判然としませんし、解決にも至っていませんでした。

Excel2003でも発生するので、昨日今日の話ではないのですが、こんなことやる人少ないみたいですね。

VBAの場合バグであるとMSが認めても、影響範囲が大きいもの以外の対応は非常に遅くなるようですので大体手段がないか思いつくままにためしてみたのですが、全部だめでした。

悪しからず。

この回答は役に立ちましたか?

0 件のコメント コメントはありません

5 件の追加の回答

並べ替え方法: 最も役に立つ
  1. Anonymous
    2013-01-10T16:46:54+00:00

    いえ、面白いと言うと語弊がありますが、私も最近いじりまわしていたところでしたので、非常に興味深く拝見いたしました。

    こちらこそありがとうございました。

    この回答は役に立ちましたか?

    1 人がこの回答が役に立ったと思いました。
    0 件のコメント コメントはありません
  2. Anonymous
    2013-01-10T15:32:43+00:00

    貴重な参考情報ありがとうございます。

    > Excel2003でも発生するので、昨日今日の話ではないのですが、こんなことやる人少ないみたいですね。

    > VBAの場合バグであるとMSが認めても、影響範囲が大きいもの以外の対応は非常に遅くなるようですので

    > 大体手段がないか思いつくままにためしてみたのですが、全部だめでした。

    なるほど、そういうことですか。

    確かに私のところで動作していた例は、UserForm上に1個だけ配置し、その上にフレームを生成していた

    ものでした。

    とりあえずは、フォーム上にフレーム1個に限定して作りを考え直してみようと思います。

    貴重なお時間、それも遅くまでおつきあい頂き誠にありがとうございました。

    この回答は役に立ちましたか?

    1 人がこの回答が役に立ったと思いました。
    0 件のコメント コメントはありません
  3. Anonymous
    2013-01-10T15:04:27+00:00

    貴重なご意見、感謝します。わたくしのミスだけではないかと心配していましたが、そちらでも再現するとのこと、変な意味でひとまず安心(?)しました。

    > 因みにごちゃごちゃやってると言うサンプルコードに興味があるようでしたら、私のサイトの

    「Excelユーザーフォームのテキストボックスのコピー&ペースト」にサンプルファイルとして同封してありますのでご覧ください。

    早速参照させていただきました。

    因みに、ダウンロードさせていただいたソースのボタンAでの処理の部分を勝手ながら以下のように書き直して実行してみたところ、やはり同様な(でもエラー表示内容がちょっと違う)現象となりました。

    =====================================================

    Sub ButtonAProc(ByVal dummy)

    With UserForm3

      With .Controls.Add("Forms.TextBox.1")

        .Left = 15

        .Top = 90

        .Height = 20

        .Width = 70

      End With

      With .Frame1

    '    With .Controls.Add("Forms.TextBox.1") ' TextBoxの生成をコメントアウト

    '      .Left = 10

    '      .Top = 30

    '      .Height = 20

    '      .Width = 70

    '    End With

        With .Controls.Add("Forms.Frame.1") ' 代わりにFrameを生成

            .Left = 10

            .Top = 30

            .Height = 20

            .Width = 70

        End With

      End With

    (以下、省略)

    =======================================================

    『「実行時エラー'-2147417848(80010108)'

     オートメーションエラーです。

     起動されたオブジェクトはクライアントから切断されました。

    』 

    念のためにアプリケーションログを見ると、

    『 障害が発生しているアプリケーション名: EXCEL.EXE、バージョン: 12.0.6665.5003、タイム スタンプ: 0x5061d2a8

    障害が発生しているモジュール名: VBE6.DLL、バージョン: 6.5.10.54、タイム スタンプ: 0x4f85ffc9

    例外コード: 0xc0000005』

    と同様のログが吐かれてました(このへん詳しくないですが、モジュール名が私のオリジナルの場合と異なってますが)。

    なお、私自身も自分のコードで、ほかにも入れ子でフレームを動的生成している箇所があるんですが、そこは問題なく動作していましたので、「あれっ!?」と思って困っている次第です 。^^;

    上記実行時エラーNoは、私のソースでは表示されなかったのですが、ネットで見るといくつかひっかかるようです。ちょっと、こちらでもさらに調べてみようと思っています。

    取り急ぎ、ご返事まで。

    この回答は役に立ちましたか?

    0 件のコメント コメントはありません
  4. Anonymous
    2013-01-10T13:49:32+00:00

    全く違う環境、Vista+2003でも再現します。

    こんなことをのべつやっているわけではありませんが、最近サンプルコードで、FrameやらMultiPageやらにごちゃごちゃコントロールを追加するコードを書いたのですが、その時同じようなことをやっているはずと思ってチェックしてみたら、Frameに関しては新規Frameを作り、その上に新規Frameというパターンでした。

    Sub test()

    With UserForm1

      With .Controls.Add("forms.frame.1")

         .Controls.Add "forms.frame.1"

      End With

       .Show

    End With

    End Sub

    因みにこちらはフォーム上に幾つ既存のFrameがあろうとまともに動くようです。

    もう少し調べて見ますがExcelの問題くさいですね。

    参考まで。

    因みにごちゃごちゃやってると言うサンプルコードに興味があるようでしたら、私のサイトの

    「Excelユーザーフォームのテキストボックスのコピー&ペースト」にサンプルファイルとして同封してありますのでご覧ください。

    http://www16.plala.or.jp/ysakuda/ystop.htm

    この回答は役に立ちましたか?

    0 件のコメント コメントはありません