- ベストアンサー
MicroSoft Office ExcelのVBAで日報入力するフォーム作成時に問題が発生
- Excel 2007 のVBAで日報を入力する簡単なフォームを作成した際、コントロールのTextBoxをダブルクリックするとエラーが発生。一度アプリケーションを終了して再起動すると正常に作動するが、再度アプリケーションを終了すると同じエラーが発生。
- フォーム作成時にコントロールの追加や削除を行ったが、ファイルが壊れた可能性があるかどうか。作り替えずに回復する方法はあるかどうかを知りたい。
- MicroSoft Office ExcelのVBAで日報入力するフォームを作成した際、ダブルクリックしたことによるエラーが発生。一度アプリケーションを終了して再起動すると回復するが、再度アプリケーションを終了すると同じエラーが発生する。ファイルが壊れた可能性があり、作り替えずに回復する方法を知りたい。
- みんなの回答 (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 内の項目には反映されません。
その他の回答 (4)
- Wendy02
- ベストアンサー率57% (3570/6232)
>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を知っている人だけの使いこなしになっています。
- Wendy02
- ベストアンサー率57% (3570/6232)
他にも、複雑なものは、もうひとつブックを立ち上げてシートを使ったり、UserForm のSpreadSheet Control を使う方法もあります。 >設定は、シートのTab から、挿入 これは、ワークシートのシートタブです。 Ver.5 マクロは、Excel 2007ではなくなると思ったのですが、Excel2007では、Ver.4 マクロコマンドを刷新したようです。あえて使う必要はないけれども、試してみる価値はあると思います。 図を参考にしてください。
お礼
ありがとうございました。 >試してみる価値はあると思います。 ほんとに、こんなSheetがあったんですね。 ところで、このDialogにフォームのようにListBoxを貼り付けられるんでしょうか?、それとこのDialogのコードウインドウはあるんでしょうか?それとも1つのオブジェクトとしてイベントプロシージャは標準モジュールに書くのでしょうか? はじめてなものでどうもそのあたりがよくのみこめません。 >UserForm のSpreadSheet Control を使う方法もあります。 これも全くはじめてです。でも名前からして何となく興味がありますし、試してみたいです。 で、リファレンスにもこのコントロールは載っていませんで、ユーザーフォームの挿入のようにVBAのツールバーにもないようなんですが・・・・・・。その使用方法は?
- Wendy02
- ベストアンサー率57% (3570/6232)
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 ダイヤログ > の項目が無いようなんですが・・・・。 すみません、はじめてのことで。
- Wendy02
- ベストアンサー率57% (3570/6232)
>コントロールの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はほぼど素人に近いので考え出せませんでした・・・・・・。とりあえずこれでやってみます。
お礼
ありがとうございました。 そうですねListBoxにじかに表示すれば安定しますね。実は今ひとつの難点を質問では申しあげませんでしたが、入力フォームのPCのデスプレイの解像度の問題がありまして、フォームは画面ほぼ一杯で、しかもこのメインフォームにListBoxを貼り付ける余裕すらないんです。しかたなくもう1枚フォームを開かざるをえないと言う状況です。むろんフォームの表示は転記入力するTextBoxの上の表示は駄目ですので Top,Leftで邪魔にならないところに表示と・・・・苦労に耐えません・・・・・。なんとかしたい。 でも何となく不安なことは確かです。