「問題が発生したため、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を知っている人だけの使いこなしになっています。
No.4
- 回答日時:
他にも、複雑なものは、もうひとつブックを立ち上げてシートを使ったり、UserForm のSpreadSheet Control を使う方法もあります。
>設定は、シートのTab から、挿入
これは、ワークシートのシートタブです。
Ver.5 マクロは、Excel 2007ではなくなると思ったのですが、Excel2007では、Ver.4 マクロコマンドを刷新したようです。あえて使う必要はないけれども、試してみる価値はあると思います。
図を参考にしてください。
ありがとうございました。
>試してみる価値はあると思います。
ほんとに、こんな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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ExcelのComboboxでマウスのスク...
-
スクロールバーをVBAで操作したい
-
実行エラー'424' ????
-
ACCESS フォームのサイズ調整
-
Access2000 フォーム表示位置が...
-
access 最大化した時の画面の...
-
ACCESSアクションマクロでイン...
-
エクセル上に画像を貼り付けて...
-
Access サブフォームでの選択行...
-
エクセルで、抽出したデータだ...
-
AccessでIDを入力したら他の項...
-
Access2000、これはいったい・...
-
Accessフォームが入力できません。
-
ACCESSでVBAから選択クエリの抽...
-
Accessのサブフォームから値を...
-
ACCSESS2013VBA フォームのレコ...
-
access別のテーブルを参照して...
-
アクセスでサブフォームのレコ...
-
PDFファイル/抽出許可され...
-
access ダブリ登録を防止したい
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ExcelのComboboxでマウスのスク...
-
スクロールバーをVBAで操作したい
-
実行エラー'424' ????
-
ACCESS フォームのサイズ調整
-
access 最大化した時の画面の...
-
エクセル上に画像を貼り付けて...
-
エクセルのVBAでマクロ実行...
-
Access2000 フォーム表示位置が...
-
Accessで任意のフォーム以外直...
-
マクロボタンが勝手に飛び回る
-
ACCESSアクションマクロでイン...
-
access 背面は最大画面、前面...
-
ACCESS VBEが勝手に起動します
-
Access起動時の設定について
-
「問題が発生したため、MicroSo...
-
エクセルで、抽出したデータだ...
-
Access サブフォームでの選択行...
-
ACCESSでVBAから選択クエリの抽...
-
ACCESS 複数のフォームから同一...
-
前のレコードの値を自動で入れたい
おすすめ情報