プロが教える店舗&オフィスのセキュリティ対策術

「問題が発生したため、MicroSoft Office Excelを
Excel 2007 のVBAで日報を入力する簡単なフォームを作ったのですが、コントロールのTextBoxをダブルクリックすると標題の「問題が発生したため、MicroSoft Office Excel を終了します。ご迷惑をおかけして申し訳ありません。」のエラーが出ました。そこで「作業内容を回復し、MicroSoft Office Excel を再起動する(R)」のチェックを入れて、「送信しない」をクリック、待つことしばらくして回復した後に上記の作業のコントロールを再度ダブルクリックすると、正常に作動しました。しかし一度アプリケーションを終了したのち、再起動後に又行うと同じエラーになります。ちなみに上記のダブルクリックで別のメニューのフォームをVBAマクロで開くようにしています。かなりコントロールを追加したり削除してますので、ファイルが壊れたのでしょうか?。作り替えないで回復する方法はありますでしょうか?どなたかお分かりになる方がいらっしゃいましたら、教えていただければ思います。

A 回答 (5件)

>その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 内の項目には反映されません。
    • good
    • 0
この回答へのお礼

ありがとうございました。
そうですねListBoxにじかに表示すれば安定しますね。実は今ひとつの難点を質問では申しあげませんでしたが、入力フォームのPCのデスプレイの解像度の問題がありまして、フォームは画面ほぼ一杯で、しかもこのメインフォームにListBoxを貼り付ける余裕すらないんです。しかたなくもう1枚フォームを開かざるをえないと言う状況です。むろんフォームの表示は転記入力するTextBoxの上の表示は駄目ですので
Top,Leftで邪魔にならないところに表示と・・・・苦労に耐えません・・・・・。なんとかしたい。
でも何となく不安なことは確かです。

お礼日時:2010/05/14 17:43

>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
    • good
    • 0

他にも、複雑なものは、もうひとつブックを立ち上げてシートを使ったり、UserForm のSpreadSheet Control を使う方法もあります。



>設定は、シートのTab から、挿入
これは、ワークシートのシートタブです。
Ver.5 マクロは、Excel 2007ではなくなると思ったのですが、Excel2007では、Ver.4 マクロコマンドを刷新したようです。あえて使う必要はないけれども、試してみる価値はあると思います。

図を参考にしてください。
「「問題が発生したため、MicroSoft」の回答画像4
    • good
    • 0
この回答へのお礼

ありがとうございました。

>試してみる価値はあると思います。

ほんとに、こんなSheetがあったんですね。
ところで、このDialogにフォームのようにListBoxを貼り付けられるんでしょうか?、それとこのDialogのコードウインドウはあるんでしょうか?それとも1つのオブジェクトとしてイベントプロシージャは標準モジュールに書くのでしょうか?
はじめてなものでどうもそのあたりがよくのみこめません。

>UserForm のSpreadSheet Control を使う方法もあります。

これも全くはじめてです。でも名前からして何となく興味がありますし、試してみたいです。
で、リファレンスにもこのコントロールは載っていませんで、ユーザーフォームの挿入のようにVBAのツールバーにもないようなんですが・・・・・・。その使用方法は?

お礼日時:2010/05/18 17:08

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
    • good
    • 0
この回答へのお礼

ありがとうございます。

>よほど、大きなデータなのでしょうか?

いえ、データそのものは全然大きくないんです。
ただ、やたら入力項目とその選択肢が多いんでどうしてもその表示でフォームを一杯使ってしまうと言うことかと・・・・。

>一般的なのは、MultiPage の上で使う方法があります。

実はMultiPageは既に1枚張り付いてまして、2枚目を貼るには既に場所的に余裕がない状態です。

>二番目は、DialogSheet を使う方法です。

全くはじめて聞く方法です。

>設定は、シートのTab から、挿入

この挿入はシートのツールバーの挿入?<テーブル・図・グラフ・リンク・テキスト>
それともVBAの挿入?<ユーザーフォーム・標準モジュール・クラスモジュール>
私の何か勘違か両方共 < MS Excel 5.0 ダイヤログ > の項目が無いようなんですが・・・・。

すみません、はじめてのことで。

お礼日時:2010/05/17 12:00

>コントロールのTextBoxをダブルクリックする


>ダブルクリックで別のメニューのフォームをVBAマクロで開くようにしています。

ダブルクリックで、一覧か何かを出すのでしょうか。二重に出すわけですよね。
もしそうなら、それは、可能だとしても無茶ではないでしょうか。
私は、自分だけのものならともかく、UserForm を2個使うのは、失敗が多いです。
何か代わりのものを探してみたらいかがですか?ComboBox, ListBox にするとか。また、DialogSheet(Ver.5スタイル) でも良いと思います。

それとも、ダブルクリックで、UserForm が入れ替えになるのですか?
そうしたら、Cancel= True は入っていますか?

私も、正確にこれだとは言い切れません。ただ、読んでみた範囲では、アブない感じかなっていう気がします。
普通は、「ダブルクリックで別のメニューのフォームをVBAマクロで開く」っていうことは、理由は分からなくても、そういうことはしません。たぶん、オブジェクトのひとつをSelect した状態から、次のUserForm などには移れないので、コンフリクトするのかもしれません。

>ファイルが壊れたのでしょうか?。
特に、Offfice 2007 では、それはないと思います。

私のコードでは、コントロールを外す時に順序を間違えると、アプリケーションのハングが出ます。
    • good
    • 0
この回答へのお礼

ありがとうございました。
フォームを再度作り直して解決しました。何だったんでしょうね?
おっしゃるやはり二重フォームのせいでしょうかね・・・・・?

>UserForm を2個使うのは、失敗が多いです。
>何か代わりのものを探してみたらいかがですか?ComboBox, ListBox にするとか。また、>DialogSheet(Ver.5スタイル) でも良いと思います。

実はその2枚目のフォームにListBoxを貼り付けまして、そのListBoxにやたら多い入力用の項目(多いものだと300位)をRowSourceで表示して、その項目をクリックでメインのフォームのダブルクリックしたTextBoxに転記入力という誠に面倒なことをしてます。なぜかと言いますとこのフォームを使う連中(10人ほどの職人)はほとんど普段パソコンなどさわったこともなく、なるべく入力を簡単ににとのことで考えた末そのようになったしだいです。きっともっと安全な方法があるでしょうね、なにせVBAはほぼど素人に近いので考え出せませんでした・・・・・・。とりあえずこれでやってみます。

お礼日時:2010/05/14 12:37

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!