• ベストアンサー

エクセルでフォーム中のテキスト値の保存方法

今までは、エクセル(VBA)で、フォームを作成しテキストボックスを貼り付け入力された値の保存が必要な場合、シートに複写して保存しておき、フォームのイニシャライズの時に値を設定する。ってなことをしていました。ところが、ふと気づいたのですが、VBEでプロパティを直接設定(入力)した値は、シートに保存しておかなくとも、また、イニシャライズ時に値を設定しなくとも値が自動的に再設定されますよね? あれを、VBAから実現できないのでしょうか?必ずどこかに値の保存が自動的にされていると思うのですが・・・・? Me.TextBox1.Text = "test"ってVBA中で設定しても、値は保存されません。ところが、VBEでTextプロパティに直接入力した値は、次に、UserForm.showとした時に自動的に表示されます。なぜですか? どなたか?詳しい方いらっしゃいましたら保存する方法を教えてください。よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんばんは。 >この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

cbr4001964
質問者

お礼

CustomDocumentPropertiesって全く知りませんでした。というよりも、私の持っているVBAの辞典にも載っておりません。プロは、辞書に載っていないのも知っているんですね!!恐れ入ります。 教えて頂いたサンプルは、内容をよく理解した上で活用していきたいと思います。 ありがとうございました。

その他の回答 (4)

回答No.5

No4、kobouzuです。 Wendy02さんの回答を読み、第3の質問を無視していたことに気づきましので それも踏まえ今回の質問の回答を簡潔に纏めてみたいと思います。 質問1.プロパティウィンドウの値はどこにあるか? 回答1.Userform.frxファイルに保持されている -------------------------------------------------------------------- 質問2.frxファイルは扱えるか 回答2.バイナリーエディタ等で扱えるがレイアウトが不明なので扱い禁止 --------------------------------------------------------------------- 質問3.TextBoxの値を次回のデフォルト値にしたい 回答3. ●Textプロパティに手動で設定した値は【何もしなくても】次回もデフォルト値になるが、他のプロパティなどを利用してそのような動作をさせる方法はない ●コードにより前回の値をデフォルト値としたい場合は、Wendy02さんの回答にもあるように、隠しシートであれ、何であれ、その値を保持しておく場所を【自分で確保】しておき、次回は、Userform_Initializeイベント等で【自分で確保した場所】の値を、改めてTextBoxに設定しなければならない。 こんなことではないでしょうか。  

cbr4001964
質問者

お礼

重ね重ね教えて頂きありがとうございます。 基本的には、今までやってきたことで正しいのがわかりました。でも、frxファイルなんて今まで、全く気付きませんでした。 教えて頂いたことを、今後に活用していきたいと思います。 今後ともよろしくお願いいたします。

回答No.4

こんばんは。No2,kobouzuです。 >何かのプロパティ-をTrueにすると、.Textに代入した値をfrxファイルに保存するとか?ってのは無いのでしょうか? そういったものはありません。 Userform.frxファイルに保存されるものは、VBEのプロパティウィンドウで手動で設定したものだけです。 ですから、例えば、質問のTextプロパティやTextのフォントなどをコードで設定してもそれは保存されません。 また、Userform.frxはバイナリー形式のファイルですから、バイナリーエディターで読み込めば、実際どういう形で格納されてるかメモ帳で開くよりも少しばかり詳しく分かります。 また、Textプロパティへの文字の設定も同じ長さの文字列であれば修正も可能です。 が、仰るようにfrxの仕組みを理解しないままの修正はしない方がいいです。と言うよりするべきではありません。 興味があれば、Vectorのサイトからフリーのバイナリーエディタをダウンロードして、UserForm.frxを読み込んで覗いてみてください。 因みに、UserForm.frmはテキストファイルですからメモ帳でもちゃんと表示されます。   それから、TextBoxへのデフォルト文字列の設定は、UserForm_Initializeイベントで行うか、手動でTextプロパティに設定するのがふつうです。  

回答No.2

こんにちは。 Userformのプロパティ値は、UserForm.frxファイルに保存されます。 試しに新しいブックで以下を試してください。 新しいブックでVBEを開きUserFormを挿入 TextBoxをひとつ配置 TextBoxのプロパティ画面で、Textプロパティに手動で、"abc333"と半角の文字列を入れる プロジェクトエクスプロラーのUserForm1を右クリック フィルのエクスポートをクリック 適当なフォルダーを選択して保存 エクセルを終了 その保存したフォルダーを開く UserForm1.frmとUserform1.frxの2つのファイルが保存されている メモ帳でもいいので、そのUserform.frxを開く 最後の方に、TextBoxのTextプロパティに設定した値が保存されているのが分かる 序に、後学の為にUserform1.frmもメモ帳で開いてみましょう。  

cbr4001964
質問者

お礼

早速の回答ありがとうございます。 早速、メモ帳で開いてみました。なるほど!って思いました。貴重な情報の提供本当にありがとうございます。 ついでってわけではないのですが、もし、宜しければもうひとつ教えて頂けないでしょうか?このfrxファイルって我々は使えないのでしょうか?当然、ファイルに直接書き込もうなんて恐れ多いことを考えているのではありません。 何かのプロパティ-をTrueにすると、.Textに代入した値をfrxファイルに保存するとか?ってのは無いのでしょうか?重ね重ね教えて頂けないでしょうか?よろしくお願いいたします。

  • meron_
  • ベストアンサー率40% (51/127)
回答No.1

Me.TextBox1.Text = "test"  と VBEでTextプロパティ   は同じだと思うのですが。

cbr4001964
質問者

補足

私も、そう思っていたのですが、現実は、VBEでTextプロパティに入力した値は、ブックを閉じて再度フォームを表示しても、同じように表示されます。途中で、Me.TextBox1.Text = "test"と変更して終了させても、その前の値にリセットされます。 一度、VBEでTextプロパティに”1回目”と入力して、ブックを保存し、再びブックを読み込み、フォームを表示すると。Textボックスには、”1回目”と表示されます。その時に、VBEを起動して、Textプロパティに”2回目”と入力して、ブックを保存すると、次にブックを開き、フォームを表示すると”2回目”と表示されます。どこかに値が保存されているようです。 ところが、”1回目”と表示されている時に、VBAで、Me.TextBox1.Text = "test"と入力(VBEでTextプロパティに入力するのと同じたど考えてた)して、ブックを保存しても、次のときには、”1回目”と表示されてしまいます。 なぜでしょうか?よろしくお願いいたします。

関連するQ&A

  • エクセルVBA テキストボックス

    いつもお世話になっております。 エクセルでVBAを使いユーザーフォームのテキストボックスで 文章入力をしようと思っているのですが、少しトラブルがありましたのでお教え願います。 エクセルシートの横がa~k、縦を9~34までのシートを結合して その中にテキストボックスで入力した文章を入れるように作っています。 MultiLineとEnterKeyBehaviorをTrueにして Private Sub CommandButton1_Click() Unload Me End Sub Private Sub TextBox1_Change() Sheets("sheet1").Range("a9") = UserForm1.TextBox1 End Sub Private Sub UserForm_Initialize() TextBox1.Value = Range("a9").Value End Sub Private Sub UserForm_Activate() With Me .Left = Application.Left .Top = Application.Top .Left = .Left + 350 .Top = .Top + 80 End With End Sub という状態になっているのですが、文章を入力して16行目で改行するとシートの方で「#VALUE!」と出てきてしまうので一旦ユーザーフォームを閉じてもう一度フォームを立ち上げると 「実行時エラー’-2147352571(80020005) Valueプロパティが設定できません。種類が一致しません。」 と出てきます。 デバッグすると  Private Sub CommandButton1_Click() → UserForm1.Show  End Sub と出てきます。 なにがおかしいのでしょうか? 今回初めてVBAを作っているので初歩的な間違いかもしれませんがよろしくお願いします

  • フォームのリストボックスに値を表示させたい

    VBA フォームのリストボックスに値を表示させたい A1→aaa A2→bbb リストボックスに上記の値を表示させたいなら、 Private Sub UserForm_Initialize() UserForm1.ListBox1.RowSource = "Sheet1!A1:A2" End Sub で出来ますが、シート上のセルで表示する値を指定するのではなく、VBA上で、リストボックスに表示させる値を指定したいのです。 Private Sub UserForm_Initialize() UserForm1.ListBox1.RowSource = "aaa,bbb" End Sub を実行すると、VBA実行時エラー380になってしまいます。 UserForm1.ListBox1.RowSource = "aaa;bbb" もダメでした。 ご回答よろしくお願いします。

  • ExcelのVBAでフォームが表示されない

    Sub フォーム起動() UserForm1.Show End Sub 上記の内容をModule1にしてショートカットキーをを設定し、いつでも他に作ってあるユーザーフォームが起動するようにしていました。しかし先日、久しぶりに使ってみようと、設定したショートカットキーを押したら、VBAもマクロも全くいじっていないにも関わらず、「UserForm1.Show」の部分で「実行時エラー'380': Valueプロパティを設定できません。プロパティの値が無効です。」とエラーが表示されフォームが起動できません。これはいったい何が原因なのでしょうか。

  • エクセルユーザーフォームで困ってます。

    エクセル初心者です。 自分のユーザーフォーム(住所、商品登録)を作りたくて大変困ってます。 下記は、ネットなどをみて貼り付けたのですが、上手くいきません。 まずTOPページを作り、ユーザーフォームを呼び出すボタンを作り、クリックすると フォームが出るようにしてあります。 そこに、自分の入力したいものをユーザーフォームにテキストでつくり、シート9に 登録ボタンを作りクリックしたら、シートに反映させたいと思ってます。 登録ボタンを押したら、入力画面はクリアにしたいです。 他にいろいろやりたい事もあるのですが、入力した順番に001・002・003と顧客番号をつけたり 検索ボタンを作って、名前や、顧客番号を入れると情報を呼び出したり、請求書用のプリントシートや、封筒シートに簡単に反映できればと思っています。 しかし、まだまだそこまではいかず、最初でつまずいてます。 現状は、フォームを呼び出すときに実行時エラーがでます。 どうしても、自分の使い勝手のいいものを作りたいので どうか、助けてください。大変まいってます。 長文になりますが、どうかよろしくお願いします。 下記の入力中のものをみていただけて、いろいろ意見をいただけるとありがたいです。 Sub FormShow() UserForm1.Show End Sub 'Sheet9へ書き込む Private Sub 登録_Click() Dim i As Integer With Worksheets(9) 'テキストボックスの値を書き出し For i = 1 To 80 .Range("B" & i) = UserForm1.Controls("TextBox" & i).Text Next End With End Sub 'Formを呼び出したとき、Sheet9から読み込む Private Sub UserForm_Initialize() Dim i As Integer With Worksheets(9) 'テキストボックスの値を読み込み For i = 1 To 80 UserForm1.Controls("TextBox" & i).Text = .Range("B" & i) Next End With End Sub '終了ボタン Private Sub CommandButton2_Click() Unload Me End Sub

  • エクセルVBA フォームの日付を指定

    データ登録フォームの日付を指定したいのですがどうすればよいでしょうか? まず、userform5を開きます。規定値は当日にしていますが、過去のものも入れられるようクリアして任意の日付を入力します。 その後、実行ボタンを押すとuserform2を開き、入力開始するのですが、その時の撮影日textboxの値にさきほど入力した値を入れたいです。 変数はPrivate torokudate As Dateこのような形でよいと思いましたが、どこに書けば他のフォームでも利用できるのでしょうか? うまくいってるのかどうかわかりませんが、表示が0:00とされました。 撮影日textboxのプロパティ設定がわるいのかどうかもよくわかりません。 初歩的なVBAですが、よろしくお願いします。

  • VBAでユーザーフォームのcaption表示

    VBAを初めたばかりです。 VBAでユーザーフォームを作成したのですが ユーザーフォームプロパティのcaptionで入力しても 下記プログラムで入力しても表示されません。 VBA作成時の画面にはしっかりと「項目」と 表示されていますが、プログラムを実行してユーザーフォームを 呼び出すと何も表示されていません。 ご教授ください。 Private Sub UserForm_Initialize() UserForm1.Caption = "項目" With ListBox1 .AddItem "1" .AddItem "2" End With End Sub

  • ユーザーフォームにデータを入力

    「開発」→「Visual Basic」→「フォーム」の「UserForm1」をクリックして表示されるUserFormに何個かのテキストボックスを作成しています。 そのテキストボックスに入力するデータをワークシートにあるデータを自動的に入力( 表示)させる方法はありませんか? ちなみに、ワークシート上でセルをクリックするとそのワークシート上にデータが自動的に入力されたUserFormが表示されるようにはしています。 今回の質問は、「開発」→「Visual Basic」→「フォーム」の「UserForm1」をクリックして表示されるUserFormのテキストボックスのことです。(この画面では、手入力しかできないのでしょうか?) Excel 2013 です。 よろしくお願いします。

  • エクセルVBAユーザーフォームの変数の設定方法について

    すいません、エクセルVBAのユーザーフォームの変数の設定方法について質問があります。 1 ユーザーフォームを2つ用意する。 2 それぞれにComboBox1をおく。 3 立ち上げたユーザーフォームについて、UserForm_InitializeでComboBox1に"a"のAddItemを作る。 この、「立ち上げたフォームのComboBox1に"a"のAddItemを作る」 という作業を各々のユーザーフォームに記載するのではなく、標準モジュールでまとめて記載する方法で躓いています。 Public m As String Private Sub UserForm_Initialize() ’フォーム1を立ち上げた場合   m = "UserForm1"   Call Test1(m) End Sub Private Sub UserForm_Initialize() ’フォーム2を立ち上げた場合   m = "UserForm2"   Call Test1(m) End Sub ↓ 標準モジュールに記載 Sub Test1(m As String) VBA.UserForms.Add(m).ComboBox1.AddItem "a" End Sub これだとUserForm_InitializeとTest1の間で無限ループが始まってしまい、うまく進んでくれません。 ヘルプを見ましたが、Add(変数)でユーザーフォームを変数で指定できるということ以上のことは発見できず行き詰っています。  それぞれのフォームに書けばいいだけの話なのかもしれませんが、メンテを考えると出来ればまとめて記述しておきたいと考えています。 解決方法がありましたらどうぞよろしくご教示願います。

  • ユーザーフォームのプロパティをVBAで設定したい

    いつも楽しく勉強させていただいております。 Excelのユーザーフォームを使い始めたところです。 コントロールのプロパティの設定を細かいVBAで行いたいのですが、方法がわかりません。 たとえばラベルの位置をそろえたいので 黒いラベル2.Left = 黒いラベル1.Left 黒いラベル3.Left = 黒いラベル1.Left といったコードを書いてUserForm_Initialize()で実行してみたのですが、フォームを閉じると元の値に戻っています。 どうすれば黒いラベル2と黒いラベル3の左端を黒いラベル1と同じにできますか。

  • エクセルVBAマクロで、一度テキストポックスに入力した値がコピーされて

    エクセルVBAマクロで、一度テキストポックスに入力した値がコピーされてしまう VBAマクロ初心者です。 エクセルVBAマクロで、以下の様なプログラムを作成し計算させていますが、 一度入力した値がテキストポックスに残ってしまい、なんとかならないかなと 思っています。 (1)複数シートにそれぞれコマンドボタンを配置し、クリックすると同じユーザー フォームが立ち上がるようになっています。 (2)そのユーザーフォーム内に、テキストボックスが複数あり、それぞれ値を入力 して計算スタートさせると、ワークシートの1行目から数千行目まで計算して 各行に計算結果を表示します。 (計算は、既に各行に入力済みのデータとこのテキストボックスの値を元に算出されます) (3)次に、別のシートでコマンドボタンをクリックし、ユーザーフォームを立ち上げると、 前のシートで入力した値がそのまま各テキストボックスに入ってしまいます。 (これは、必ず起こる訳ではなく、時々起こるのですが、起こる場合は、コマンドボタン をクリックしてからユーザーフォームが立ち上がるまでの時間が若干短い感じがします) ※一度、上記の計算をさせるとテキストボックスの値がそのシートの特定のセルに入り、 次回ユーザーフォームを立ち上げた際に、テキストボックスに入るようになっています。 (Private Sub UserForm Initialize を使っています) パソコンの構造を、私はよく知らないのですが、おそらく、一度テキストボックスに値 を入力して計算させると、どこかのメモリにそれが残っていて、次にユーザーフォーム を立ち上げた際にそれが入ってしまうのかな、と思っています。 (ただし、もし前の値が入ってしまったとしても、一度そのユーザーフォームを消して から、再度立ち上げると、正常な値(そのシートの特定のセルを参照)が必ず入ります) 何か、プログラムにより、このメモリ?を消す?、あるいはうまく解決する方法など 考えられませんでしょうか? もし、詳しい方がおられましたら、御教示いただけませんでしょうか。 よろしくお願いいたします。

専門家に質問してみよう