![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?a65a0e2)
「問題が発生したため、MicroSoft Office Excelを
Excel 2007 のVBAで日報を入力する簡単なフォームを作ったのですが、コントロールのTextBoxをダブルクリックすると標題の「問題が発生したため、MicroSoft Office Excel を終了します。ご迷惑をおかけして申し訳ありません。」のエラーが出ました。そこで「作業内容を回復し、MicroSoft Office Excel を再起動する(R)」のチェックを入れて、「送信しない」をクリック、待つことしばらくして回復した後に上記の作業のコントロールを再度ダブルクリックすると、正常に作動しました。しかし一度アプリケーションを終了したのち、再起動後に又行うと同じエラーになります。ちなみに上記のダブルクリックで別のメニューのフォームをVBAマクロで開くようにしています。かなりコントロールを追加したり削除してますので、ファイルが壊れたのでしょうか?。作り替えないで回復する方法はありますでしょうか?どなたかお分かりになる方がいらっしゃいましたら、教えていただければ思います。
No.2ベストアンサー
- 回答日時:
>その2枚目のフォームにListBoxを貼り付けまして、
>そのListBoxにやたら多い入力用の項目(多いものだと300位)をRowSourceで表示して、
>その項目をクリックでメインのフォームのダブルクリックしたTextBoxに転記入力という誠に面倒なことをしてます。
「ListBoxにやたら多い入力用の項目(多いものだと300位)をRowSource」 問題は、ここですね。
それは、悪いけれど、そこは負担が大きすぎるようですから、直したほうがよいと思います。簡単な方法で済みます。
裏技的ですが、
Private Sub UserForm_Initialize()
Dim Ar As Variant
Ar = Application.Transpose(ThisWorkbook.Worksheets("Sheet1").Range("A1:A300").Value)
ListBox1.List = Ar
End Sub
こんな風にして、ListBox に登録することが可能です。とても軽くなります。RowSource は、常に、シートとオブジェクトがリンクされた状態ですから、不安定になりやすいです。ただ、セルを直しても、ListBox を直しても、Link していませんから、UserForm 起動中は、ListBox 内の項目には反映されません。
ありがとうございました。
そうですねListBoxにじかに表示すれば安定しますね。実は今ひとつの難点を質問では申しあげませんでしたが、入力フォームのPCのデスプレイの解像度の問題がありまして、フォームは画面ほぼ一杯で、しかもこのメインフォームにListBoxを貼り付ける余裕すらないんです。しかたなくもう1枚フォームを開かざるをえないと言う状況です。むろんフォームの表示は転記入力するTextBoxの上の表示は駄目ですので
Top,Leftで邪魔にならないところに表示と・・・・苦労に耐えません・・・・・。なんとかしたい。
でも何となく不安なことは確かです。
No.5
- 回答日時:
>DialogにフォームのようにListBoxを貼り付けられるんでしょうか?
ワークシートに貼り付けるフォーム・オブジェクトはお分かりになりますね。それは、本来、このダイヤログシートに使うものだったのです。
当然、ListBox も使えます。ドラッグして貼り付ければ使えますが、
>このDialogのコードウインドウはあるんでしょうか?
独自のものはなく、標準モジュールに書きます。
#3の
'//UserForm モジュール
Private Sub CommandButton1_Click()
で書いたように、ListBox のデータは、登録の仕方は、一般的には、Array 関数をつかいますが、A1:A300 と範囲が広かったりすると、大変な手間が掛かりますので、#3のような方法が好まれるわけです。
>はじめてなものでどうもそのあたりがよくのみこめません。
マニュアルがあると良いのですが……。今は、手に入りません。その内、いろいろ復活してくれるとよいのですが。
Excel 2007 で、ヘルプに出てこない部分があります。私は、Ver.4とVer.5 のVBAやマクロ関数のヘルプもあるのですが、Excel 2007 で復活したコマンドは、昔のものとは違う部分があります。
>>UserForm のSpreadSheet Control を使う方法もあります。
>
>これも全くはじめてです。でも名前からして何となく興味がありますし、試してみたいです。
>で、リファレンスにもこのコントロールは載っていませんで
そうなんですね。他にも、VB6 RunTimeの Common Dialog などが標準で入っているのですが、詳しく説明はありません。VB6を知っている人だけの使いこなしになっています。
![「「問題が発生したため、MicroSoft」の回答画像5](http://oshiete.xgoo.jp/_/bucket/oshietegoo/images/media/9/204119_5497f263039f9/M.jpg)
No.4
- 回答日時:
他にも、複雑なものは、もうひとつブックを立ち上げてシートを使ったり、UserForm のSpreadSheet Control を使う方法もあります。
>設定は、シートのTab から、挿入
これは、ワークシートのシートタブです。
Ver.5 マクロは、Excel 2007ではなくなると思ったのですが、Excel2007では、Ver.4 マクロコマンドを刷新したようです。あえて使う必要はないけれども、試してみる価値はあると思います。
図を参考にしてください。
![「「問題が発生したため、MicroSoft」の回答画像4](http://oshiete.xgoo.jp/_/bucket/oshietegoo/images/media/a/204119_5497efda002dc/M.jpg)
ありがとうございました。
>試してみる価値はあると思います。
ほんとに、こんなSheetがあったんですね。
ところで、このDialogにフォームのようにListBoxを貼り付けられるんでしょうか?、それとこのDialogのコードウインドウはあるんでしょうか?それとも1つのオブジェクトとしてイベントプロシージャは標準モジュールに書くのでしょうか?
はじめてなものでどうもそのあたりがよくのみこめません。
>UserForm のSpreadSheet Control を使う方法もあります。
これも全くはじめてです。でも名前からして何となく興味がありますし、試してみたいです。
で、リファレンスにもこのコントロールは載っていませんで、ユーザーフォームの挿入のようにVBAのツールバーにもないようなんですが・・・・・・。その使用方法は?
No.3
- 回答日時:
Excel 2007 を使いながら、解像度の問題だというと、よほど、大きなデータなのでしょうか?特別な方法で作りこまないといけないような気がしています。
>フォームは画面ほぼ一杯で、しかもこのメインフォームにListBoxを貼り付ける余裕すらないんです。
本当の問題は、これを解決したいし、それを解決していれば、そもそものハングの問題もでなかっただろうし、便利だったろうには違いないでしょう。そして、ListBox のようなものがポップアップすればよいわけですね。それは、サブフォームというわけですね。正直なところ、あまり、私は、UserForm が得意とは言えないので、豊富なアイデアが湧いてこないのですが、画面一杯を使っているなら、二種類の方法を考えてみました。
使ってみた感覚では、2番目のDialogSheetのほうが、遥かに軽いです。(マニュアルなんて、もう持っている人はいないでしょうけれど。)
最初は、月なみですが、一般的なのは、MultiPage の上で使う方法があります。
こうすれば、UserForm の入れ出しを気にしなくて済みます。
'//UserForm モジュール
'//TextBox をダブルクリックすると、MultiPage が切り替わる
Private Sub TextBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
MultiPage1.Value = 1
End Sub
'//次のページにListBox を置いておきます。
'//一応、MultiPageのフレームをダブルクリックをすると、切り替わる
Private Sub MultiPage1_DblClick(ByVal Index As Long, ByVal Cancel As MSForms.ReturnBoolean)
If MultiPage1.Value = 1 Then
MultiPage1.Value = 0
Else
MultiPage1.Value = 1
End If
End Sub
'(ただし、これは、ListBox 内にイベントを設けて、値をクリックしたら、戻しても良いと思います。)
**
二番目は、DialogSheet を使う方法です。さっぱり何をしているのか分からないかもしれませんが、テクニックのひとつです。DialogSheets(1) の設定は、シートのTab から、挿入--MS Excel 5.0 ダイヤログでシートを作る方法です。そこから、ListBoxを置きます。ここには、直接、マクロは置けません。
'//UserForm モジュール
Private Sub CommandButton1_Click()
Dim Ar As Variant
Dim buf As String
Ar = Application.Transpose(ThisWorkbook.Worksheets("Sheet1").Range("A1:A300").Value)
'//配列が数値の場合のオプション
ReDim Preserve Ar(0 To 299)
buf = Join(Ar, ",")
Ar = Split(buf, ",")
'//
With DialogSheets(1)
.ListBoxes(1).List = Ar
.Show
End With
End Sub
'//DialogSheetのListBoxのマクロに設定(標準モジュール)
Private Sub DialogBoxListClick() '名前は何でも可
Dim myVal As Variant
myVal = DialogSheets(1).ListBoxes(1).Value
UserForm1.TextBox1.Value = myVal
DialogSheets(1).Hide
End Sub
ありがとうございます。
>よほど、大きなデータなのでしょうか?
いえ、データそのものは全然大きくないんです。
ただ、やたら入力項目とその選択肢が多いんでどうしてもその表示でフォームを一杯使ってしまうと言うことかと・・・・。
>一般的なのは、MultiPage の上で使う方法があります。
実はMultiPageは既に1枚張り付いてまして、2枚目を貼るには既に場所的に余裕がない状態です。
>二番目は、DialogSheet を使う方法です。
全くはじめて聞く方法です。
>設定は、シートのTab から、挿入
この挿入はシートのツールバーの挿入?<テーブル・図・グラフ・リンク・テキスト>
それともVBAの挿入?<ユーザーフォーム・標準モジュール・クラスモジュール>
私の何か勘違か両方共 < MS Excel 5.0 ダイヤログ > の項目が無いようなんですが・・・・。
すみません、はじめてのことで。
No.1
- 回答日時:
>コントロールのTextBoxをダブルクリックする
>ダブルクリックで別のメニューのフォームをVBAマクロで開くようにしています。
ダブルクリックで、一覧か何かを出すのでしょうか。二重に出すわけですよね。
もしそうなら、それは、可能だとしても無茶ではないでしょうか。
私は、自分だけのものならともかく、UserForm を2個使うのは、失敗が多いです。
何か代わりのものを探してみたらいかがですか?ComboBox, ListBox にするとか。また、DialogSheet(Ver.5スタイル) でも良いと思います。
それとも、ダブルクリックで、UserForm が入れ替えになるのですか?
そうしたら、Cancel= True は入っていますか?
私も、正確にこれだとは言い切れません。ただ、読んでみた範囲では、アブない感じかなっていう気がします。
普通は、「ダブルクリックで別のメニューのフォームをVBAマクロで開く」っていうことは、理由は分からなくても、そういうことはしません。たぶん、オブジェクトのひとつをSelect した状態から、次のUserForm などには移れないので、コンフリクトするのかもしれません。
>ファイルが壊れたのでしょうか?。
特に、Offfice 2007 では、それはないと思います。
私のコードでは、コントロールを外す時に順序を間違えると、アプリケーションのハングが出ます。
ありがとうございました。
フォームを再度作り直して解決しました。何だったんでしょうね?
おっしゃるやはり二重フォームのせいでしょうかね・・・・・?
>UserForm を2個使うのは、失敗が多いです。
>何か代わりのものを探してみたらいかがですか?ComboBox, ListBox にするとか。また、>DialogSheet(Ver.5スタイル) でも良いと思います。
実はその2枚目のフォームにListBoxを貼り付けまして、そのListBoxにやたら多い入力用の項目(多いものだと300位)をRowSourceで表示して、その項目をクリックでメインのフォームのダブルクリックしたTextBoxに転記入力という誠に面倒なことをしてます。なぜかと言いますとこのフォームを使う連中(10人ほどの職人)はほとんど普段パソコンなどさわったこともなく、なるべく入力を簡単ににとのことで考えた末そのようになったしだいです。きっともっと安全な方法があるでしょうね、なにせVBAはほぼど素人に近いので考え出せませんでした・・・・・・。とりあえずこれでやってみます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excel起動時にエラーダイアログが表示される 3 2022/07/28 19:52
- Excel(エクセル) マクロの付いたExcelが開けません 3 2023/02/01 10:54
- Word(ワード) office 2021へ自分用のクイックアクセスとマクロをコピーしたい 2 2023/03/11 21:15
- その他(クラウドサービス・オンラインストレージ) Onedriveで実現したい事。2台のPC間で。 2 2023/04/10 20:42
- Visual Basic(VBA) vba メモリ節約 3 2022/09/16 21:45
- ノートパソコン EXCEL のドキュメントの回復について 2 2023/03/19 17:16
- Visual Basic(VBA) VBAコードを張り付け後のエクセルの進め方 2 2023/02/07 18:24
- Outlook(アウトルック) outlookの送信エラーについて 1 2022/05/13 12:04
- その他(Microsoft Office) Office Home & Business 2021で外付けHDにあるファイルを開く方法 3 2022/06/08 22:26
- Excel(エクセル) Excel2010 VBAが特定動作で実行出来なくなる 7 2022/12/29 14:26
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・「これはヤバかったな」という遅刻エピソード
- ・初めて自分の家と他人の家が違う、と意識した時
- ・いちばん失敗した人決定戦
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
実行エラー'424' ????
-
Access2000 フォーム表示位置が...
-
Access起動時の設定について
-
スクロールバーをVBAで操作したい
-
ACCESS フォームのサイズ調整
-
エクセルのVBAでマクロ実行...
-
ExcelのComboboxでマウスのスク...
-
Exitイベントから自分自身のコ...
-
エクセルで、抽出したデータだ...
-
インデックスまたは主キーにはn...
-
access サブフォームにリストを...
-
前のレコードの値を自動で入れたい
-
Access サブフォームでの選択行...
-
ACCESSでVBAから選択クエリの抽...
-
Excel 文字列から6桁の数値の抽出
-
Accessのコンボボックスでリス...
-
access クエリ yes/no型のクエ...
-
AccessのWHERE句において、変数...
-
入力した値をコンボボックスに...
-
Accessでデータを更新したらそ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ExcelのComboboxでマウスのスク...
-
スクロールバーをVBAで操作したい
-
ACCESS フォームのサイズ調整
-
Access2000 フォーム表示位置が...
-
access 最大化した時の画面の...
-
Accessで任意のフォーム以外直...
-
エクセル上に画像を貼り付けて...
-
実行エラー'424' ????
-
エクセルのVBAでマクロ実行...
-
マクロボタンが勝手に飛び回る
-
ACCESSアクションマクロでイン...
-
ACCESS VBEが勝手に起動します
-
Access起動時の設定について
-
ワークシート上に検索用のボッ...
-
Access2000形式からAccess2007...
-
Exitイベントから自分自身のコ...
-
エクセルで、抽出したデータだ...
-
Access サブフォームでの選択行...
-
Accessでデータを更新したらそ...
-
Access 複数フォームを...
おすすめ情報