- ベストアンサー
エクセルでフォーム中のテキスト値の保存方法
今までは、エクセル(VBA)で、フォームを作成しテキストボックスを貼り付け入力された値の保存が必要な場合、シートに複写して保存しておき、フォームのイニシャライズの時に値を設定する。ってなことをしていました。ところが、ふと気づいたのですが、VBEでプロパティを直接設定(入力)した値は、シートに保存しておかなくとも、また、イニシャライズ時に値を設定しなくとも値が自動的に再設定されますよね? あれを、VBAから実現できないのでしょうか?必ずどこかに値の保存が自動的にされていると思うのですが・・・・? Me.TextBox1.Text = "test"ってVBA中で設定しても、値は保存されません。ところが、VBEでTextプロパティに直接入力した値は、次に、UserForm.showとした時に自動的に表示されます。なぜですか? どなたか?詳しい方いらっしゃいましたら保存する方法を教えてください。よろしくお願いいたします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 >このfrxファイルって我々は使えないのでしょうか? もちろんできますが、非常に特殊で、Frxの中にしか存在しない情報を取得するときにしか使わない、非常にレアなマクロです。しかし、それをインポートすれば、UserForm は二重になってしまいますが、UserForm をいったん削除することになりますが、おそらくは、オブジェクトを失ってしまいエラーが発生するかもしれません。それに、いちいち、エクスポートしたファイルを読み出すなんていうのは、面倒でしょうがないです。 VB経験者ですと、その情報を、テキストファイルや、 ini ファイルに出力します。しかし、中身を見られないように、ランダムファイルにするかのも考えます。 しかし、Excelに詳しい人なら、非表示ワークシートや、CustomDocumentProperties なり、内部で、終了のTerminate のときに保存できるのではありませんか?Intialize のときに、そこに書き込みがあれば、それを呼ぶようなコードを書けばよいと思います。そのほうがずっと簡単だと思います。 簡単な方法は、非表示(SheetVeryHidden)ワークシートに出力します。 私は、CustomDocumentPropertiesを使っています。 例: Private Sub UserForm_Initialize() '起動時 On Error Resume Next TextBox1.Text = ThisWorkbook.CustomDocumentProperties("MyString").Value On Error GoTo 0 End Sub Private Sub UserForm_Terminate() '終了時 On Error GoTo ErrHandelr ThisWorkbook.CustomDocumentProperties("MyString").Value = TextBox1.Text Exit Sub ErrHandelr: '初回だけ働きます。ダミーを入れます。 With ThisWorkbook.CustomDocumentProperties .Add Name:="MyString", _ LinkToContent:=False, _ Type:=msoPropertyTypeString, _ Value:="" End With Resume End Sub
その他の回答 (4)
- kobouzu_su
- ベストアンサー率45% (24/53)
No4、kobouzuです。 Wendy02さんの回答を読み、第3の質問を無視していたことに気づきましので それも踏まえ今回の質問の回答を簡潔に纏めてみたいと思います。 質問1.プロパティウィンドウの値はどこにあるか? 回答1.Userform.frxファイルに保持されている -------------------------------------------------------------------- 質問2.frxファイルは扱えるか 回答2.バイナリーエディタ等で扱えるがレイアウトが不明なので扱い禁止 --------------------------------------------------------------------- 質問3.TextBoxの値を次回のデフォルト値にしたい 回答3. ●Textプロパティに手動で設定した値は【何もしなくても】次回もデフォルト値になるが、他のプロパティなどを利用してそのような動作をさせる方法はない ●コードにより前回の値をデフォルト値としたい場合は、Wendy02さんの回答にもあるように、隠しシートであれ、何であれ、その値を保持しておく場所を【自分で確保】しておき、次回は、Userform_Initializeイベント等で【自分で確保した場所】の値を、改めてTextBoxに設定しなければならない。 こんなことではないでしょうか。
お礼
重ね重ね教えて頂きありがとうございます。 基本的には、今までやってきたことで正しいのがわかりました。でも、frxファイルなんて今まで、全く気付きませんでした。 教えて頂いたことを、今後に活用していきたいと思います。 今後ともよろしくお願いいたします。
- kobouzu_su
- ベストアンサー率45% (24/53)
こんばんは。No2,kobouzuです。 >何かのプロパティ-をTrueにすると、.Textに代入した値をfrxファイルに保存するとか?ってのは無いのでしょうか? そういったものはありません。 Userform.frxファイルに保存されるものは、VBEのプロパティウィンドウで手動で設定したものだけです。 ですから、例えば、質問のTextプロパティやTextのフォントなどをコードで設定してもそれは保存されません。 また、Userform.frxはバイナリー形式のファイルですから、バイナリーエディターで読み込めば、実際どういう形で格納されてるかメモ帳で開くよりも少しばかり詳しく分かります。 また、Textプロパティへの文字の設定も同じ長さの文字列であれば修正も可能です。 が、仰るようにfrxの仕組みを理解しないままの修正はしない方がいいです。と言うよりするべきではありません。 興味があれば、Vectorのサイトからフリーのバイナリーエディタをダウンロードして、UserForm.frxを読み込んで覗いてみてください。 因みに、UserForm.frmはテキストファイルですからメモ帳でもちゃんと表示されます。 それから、TextBoxへのデフォルト文字列の設定は、UserForm_Initializeイベントで行うか、手動でTextプロパティに設定するのがふつうです。
- kobouzu_su
- ベストアンサー率45% (24/53)
こんにちは。 Userformのプロパティ値は、UserForm.frxファイルに保存されます。 試しに新しいブックで以下を試してください。 新しいブックでVBEを開きUserFormを挿入 TextBoxをひとつ配置 TextBoxのプロパティ画面で、Textプロパティに手動で、"abc333"と半角の文字列を入れる プロジェクトエクスプロラーのUserForm1を右クリック フィルのエクスポートをクリック 適当なフォルダーを選択して保存 エクセルを終了 その保存したフォルダーを開く UserForm1.frmとUserform1.frxの2つのファイルが保存されている メモ帳でもいいので、そのUserform.frxを開く 最後の方に、TextBoxのTextプロパティに設定した値が保存されているのが分かる 序に、後学の為にUserform1.frmもメモ帳で開いてみましょう。
お礼
早速の回答ありがとうございます。 早速、メモ帳で開いてみました。なるほど!って思いました。貴重な情報の提供本当にありがとうございます。 ついでってわけではないのですが、もし、宜しければもうひとつ教えて頂けないでしょうか?このfrxファイルって我々は使えないのでしょうか?当然、ファイルに直接書き込もうなんて恐れ多いことを考えているのではありません。 何かのプロパティ-をTrueにすると、.Textに代入した値をfrxファイルに保存するとか?ってのは無いのでしょうか?重ね重ね教えて頂けないでしょうか?よろしくお願いいたします。
- meron_
- ベストアンサー率40% (51/127)
Me.TextBox1.Text = "test" と VBEでTextプロパティ は同じだと思うのですが。
補足
私も、そう思っていたのですが、現実は、VBEでTextプロパティに入力した値は、ブックを閉じて再度フォームを表示しても、同じように表示されます。途中で、Me.TextBox1.Text = "test"と変更して終了させても、その前の値にリセットされます。 一度、VBEでTextプロパティに”1回目”と入力して、ブックを保存し、再びブックを読み込み、フォームを表示すると。Textボックスには、”1回目”と表示されます。その時に、VBEを起動して、Textプロパティに”2回目”と入力して、ブックを保存すると、次にブックを開き、フォームを表示すると”2回目”と表示されます。どこかに値が保存されているようです。 ところが、”1回目”と表示されている時に、VBAで、Me.TextBox1.Text = "test"と入力(VBEでTextプロパティに入力するのと同じたど考えてた)して、ブックを保存しても、次のときには、”1回目”と表示されてしまいます。 なぜでしょうか?よろしくお願いいたします。
お礼
CustomDocumentPropertiesって全く知りませんでした。というよりも、私の持っているVBAの辞典にも載っておりません。プロは、辞書に載っていないのも知っているんですね!!恐れ入ります。 教えて頂いたサンプルは、内容をよく理解した上で活用していきたいと思います。 ありがとうございました。