忙しい現代人の腰&肩のお悩み対策!

VBA初心者です。いろいろ調べて徐々に進められていますが、、
こちらもなかなか見つからなかったので質問させていただきます。

現在、ユーザーフォームにテキストボックスをいくつか配置し、
さまざまな計算などをさせて、最終的にエクセルシートに反映させる。
といったことが出来るようにプログラムをしています。

ユーザーフォームのテキストボックスに一度入力したものを、
エクセルシートを閉じるまで残すことはできるでしょうか?

一度、×ボタンで閉じてしまうと、次に呼び出したときには初期の状態になってしまいます。

ユーザーフォームに入力し、エクセルシートで確認、
その後 再度ユーザーフォーム呼び出して修正する
といった作業をするために、一度入力したものが消えないようにしたいです。

よろしくお願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

閉じるボタンで閉じるとき、Hideで閉じればいいだけの様な気がします。



UserFormのモジュールに記述します。

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode <> 1 Then
 Cancel = True
 Me.Hide
End If
End Sub
    • good
    • 9
この回答へのお礼

回答して頂いてありがとうございます。
希望している通りの動きになりました。

お礼日時:2012/03/26 17:48

こんばんは。



シートにデータを保存する方法ですが、ControlSourceプロパティを使うのはどうでしょうか。

このプロパティは、Sheet1!A1 と言うように設定し、設定したセルにValueプロパティの値を保存できます。
    • good
    • 0
この回答へのお礼

回答して頂いてありがとうございました。

お礼日時:2012/03/26 17:50

#1です。


そういう予感はしたのですが、小出し質問・ついでに質問は避けて下さい。
さて、UserForm_Terminate()の方を書き換えて下さい。
Select Caseで、valueをメンバに持たずエラーになるものや、CommandButtonの様に記録したく無いものを列挙して下さい。

Private Sub UserForm_Terminate()
Dim myControl As Control
Dim destSh As Worksheet, destRange As Range

Set destSh = ThisWorkbook.Worksheets("temp")
destSh.Cells.Clear
Set destRange = destSh.Range("A1")
For Each myControl In Me.Controls
'Debug.Print TypeName(myControl)
Select Case TypeName(myControl)
'valueをメンバに持たずエラーになるものや、記録したくないものを列挙
Case "Frame", "Label", "CommandButton"

Case Else
destRange.Value = myControl.Name
destRange.Offset(0, 1).Value = myControl.Value
Set destRange = destRange.Offset(1, 0)
End Select
Next myControl
End Sub
    • good
    • 1
この回答へのお礼

小出し質問してすいません。
非常に勉強になりました。
ありがとうございました。

お礼日時:2012/03/26 17:45

「temp」という名前のワークシートに保持する方法です。


ワークシートを閉じても保存されてしまいますが、気に入らなければWorkbook_BeforeCloseででも保存データをクリアして下さい。ご参考まで。
Private Sub UserForm_Initialize()
Dim tempSh As Worksheet, tempRange As Range, myRow As Range

Set tempSh = ThisWorkbook.Worksheets("temp")
Set tempRange = tempSh.Range("A1").CurrentRegion
If tempRange.Cells.Count = 1 Then Exit Sub
For Each myRow In tempRange.Rows
Me.Controls(myRow.Cells(1).Value).Value = myRow.Cells(2).Value
Next myRow
End Sub

Private Sub UserForm_Terminate()
Dim myControl As Control
Dim destSh As Worksheet, destRange As Range

Set destSh = ThisWorkbook.Worksheets("temp")
destSh.Cells.Clear
Set destRange = destSh.Range("A1")
For Each myControl In Me.Controls
If TypeName(myControl) = "TextBox" Then
destRange.Value = myControl.Name
destRange.Offset(0, 1).Value = myControl.Value
Set destRange = destRange.Offset(1, 0)
End If
Next myControl
End Sub
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
保存することができました。
すいませんがついでに、チェックボックスや、オプションボタンの情報も残すには
どのようにすればいいのでしょうか?

もし、よろしければご指導ください。

お礼日時:2012/03/25 19:00

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

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

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

Aベストアンサー

こんばんは。

>この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

こんばんは。

>このfrxファイルって我々は使えないのでしょうか?

もちろんできますが、非常に特殊で、Frxの中にしか存在しない情報を取得するときにしか使わない、非常にレアなマクロです。しかし、それをインポートすれば、UserForm は二重になってしまいますが、UserForm をいったん削除することになりますが、おそらくは、オブジェクトを失ってしまいエラーが発生するかもしれません。それに、いちいち、エクスポートしたファイルを読み出すなんていうのは、面倒でしょうがないです。

VB経験者ですと...続きを読む

Qエクセル VBA ユーザーフォームを閉じる

ユーザーフォームを開く時は
UserForm1.Showですが
閉じる時は?
UserForm1.Close
だとコンパイルエラーになります。
End
にするしかないですか?

Aベストアンサー

Unload Me とか Unload UserForm1 でユーザーフォームを閉じることができます。

QExcel VBAで、ユーザーフォームの値を、モジュールで使用したい。

VBA初心者です。(おそらく)基本的な質問で、申し訳ありません。
ユーザーフォーム1には、テキストボックス1とコマンドボタン1が配置されているとします。

Sub TEST ()
Dim N
Userform1.Show
MsgBox N
End Sub

Private Sub CommandButton1_Click()
Dim N
N = TextBox1.Text
UserForm1.Hide
End Sub

Sub TESTを実行した時に、ユーザーフォーム1からNの値を引き継ぐには、どうしたら良いのでしょうか?よろしくお願いします。

Aベストアンサー

'モジュールに変数宣言(グローバル変数)
'Public 宣言すると他のモジュールやフォームと
'共有できる変数になります。
Public AA As String

'sample
'A1 を実行する。

Sub A1()
Call A2
AA = InputBox("input", , AA)
End Sub

Sub A2()
AA = InputBox("input", , AA)
End Sub

Qユーザーフォームを表示中にシートの操作をさせるには

ユーザーフォームを表示中にシートの操作をさせる事はできるのでしょうか。
セルへの入力、画面のスクロールなどは、ユーザーフォームからマクロを実行させたり、.hideでユーザーフォームを一時的に隠すなどすればいいのでしょうが、そういう手段をとらないでユーザーフォームを表示中にシートの操作をさせる事はできるのでしょうか。

Aベストアンサー

ユーザフォームの
ShowModalプロパティを
falseにすればよいかと。

QエクセルVBAでテキストボックスの値の取得と変更について

エクセルのVBAを使ってシート上のテキストボックスのテキストを取得・変更するマクロを作成したいと思っていますがうまく行きませんので、お知恵を拝借したいとおもいます。

環境:WindowsXPでオフィス2002
状況:
エクセルブックa.xlsのシートに「コントロールツールボックス」のテキストボックスを配置(オブジェクト名はTEXTBOX_C)
エクセルブックb.xlsにコードを書き、a.xlsのTEXTBOX_CのプロパティのValueかTextを取りだしたい

試した事:
コントロールを配置したシートに次のマクロ
TEXTBOX_C.Text = "これはコントロールのテキストボックス"
を書くとテキストボックスに文字を入れ込めますが、別のエクセルブックからだと上手く行きません。

また、オートシェイプのテキストボックスの場合は簡単に出きるのですが、コントロールツールボックスではどうしても上手く行きませんので、対象法などご存知の方いらっしゃいましたら教えてください

Aベストアンサー

エクセルを新規に開きました。
そのSheet1に(コントロールツールボックスの)TextBoxを貼りつけました。
そのBook1から、ファイル-開くで別ブックを開きました。
別ブックのMojule1側に下記を書いて
Sub test02()
MsgBox Workbooks("book1").Worksheets("sheet1").textbox1.Text
End Sub
を実行すると、Book1のTextBoxに入れた文字列が表示
されました。
がそんな質問ではないのですか。

QExel VBA 別ブックから該当データを検索し、必要なデータを取得する方法について

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数ではなく、マクロで処理を希望します。

自分では、部品表の商品番号をコピーして、コード一覧表で検索し、検索結果の右隣のセル(B列のコード)の値を部品表のC列に貼り付ければよいかと思い、書いてみたんですが…

Sub 別ブックから貼り付ける()
  Dim 検索する As Long
Windows("部品表.xls").Activate
検索する = cells(i,2).Value
Windows("コード一覧表.xls").Activate
ActiveWindow.SmallScroll Down:=-3
Selection.AutoFilter Field:=3, Criteria1:="=検索する", Operator:= xlAnd

と、してみたものの、検索しても、その検索結果の隣のセルのコードをどうやって取得すればいいのかが、わかりませんでした。

基本事項は本で学びましたが、呪文のようなコードはよく理解できません。懸命にネットで検索して、訳して理解する努力をしてはいますが。

どうぞよろしくお願いします。

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数...続きを読む

Aベストアンサー

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks.Open("C:\★★\コード一覧表.xls") '★要変更★
 I = 2
 Do While Range("A" & I).Value <> ""
  ThisWorkbook.Worksheets("Sheet1").Range("C" & I).Value = Application.VLookup(ThisWorkbook.Worksheets("Sheet1").Range("B" & I).Value, xlBook.Worksheets("Sheet1").Range("A2:B65535"), 2, 0)
  I = I + 1
 Loop
 xlBook.Close
 Application.ScreenUpdating = True
 MsgBox ("完了")
End Sub

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks....続きを読む

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。

QSub ***( ) と Private Sub ***( ) の違い

初歩的な質問で申し訳ありませんが・・・

自分でコードを書いていても、イベントが発生したりした時の処理で、コードのウィンドウで上のドロップダウンリストで選択できる時の処理などは自動的に[Private Sub Command1_Click( )]などと出てくるのでそのまま使っています。自分で別途プロシージャーを作成する時は[Sub ****( )]としています。
ですがその違いを理解しないまま、自分で作成する時は[Private Sub]ではなくて[Sub]を使っています。

Sub ***( ) と Private Sub ***( ) の違いは何なんでしょうか?
どなたか説明頂けませんか?
よろしくお願いします。

Aベストアンサー

「Sub」の部分にカーソルを置いて[F1]を押せばヘルプが起動します。
「指定項目」のところに「Public」と「Private」の説明がありますよ。
省略して「Sub hogehoge()」とした場合は「Public」とみなされます。

Publicは「すべてのモジュールから呼び出せるプロシージャ」ということになります。
Privateとすると「同じモジュールの中からしか呼び出せないプロシージャ」となります。

もしExcelをお持ちでしたらExcelのVBEで標準モジュールを追加し、「Sub Test1()」と「Private Sub Test2()」を作成してみてください。
そしてExcelの[ツール]-[マクロ]-[マクロ(Alt+F8)]でマクロ実行のダイアログを表示させてみるとわかります。
ここには実行できるプロシージャの一覧が表示されますが、Test1は表示されているけれどTest2は表示されません。
Test1はPublicで、Test2はPrivateだからです。

QVBAフォームのテキストボックスに初期値を表示するには?

VBAのフォームのテキストボックスに、初期値としてフォームを開いた当日の日付を表示したいのです。
開いたときは今日の日付が既に表示されていて、必要に応じて書き換える、そんなふうにしたいのですが。

Aベストアンサー

こんにちは。

こういうことかな?

Private Sub UserForm_Initialize()
  TextBox1.Text = Format$(Date, "yy/mm/dd")
End Sub

Qユーザーフォームの入力をシートに反映

かなりの初心者(始めて3日)ですが宜しくお願いします。
しかも2点あります。。。

(1)ユーザーフォームにある大量のテキストboxないし、optionboxをエクセルのsheet2に反映させたいです。
で、地道に
With Sheets(2)
.Range("A22").Value = OptionButton184.Value
.Range("A23").Value = OptionButton185.Value
.Range("A24").Value = OptionButton186.Value
.Range("A25").Value = OptionButton187.Value
とAの行を手で直していたのですが、途中で間違えて、手直しは断念しました。そこで、思いついたのが、「ひとつ下のセルに記述する」ということでした。
で、本を見ながら考えたのが、
With Sheets(2)
Range("A1").Select
ActiveCell.Offset(1, 0).Value = TextBox1.Text
ActiveCell.Offset(1, 0).Value = TextBox2.Text
ActiveCell.Offset(1, 0).Value = TextBox3.Text
まずA1を指定させて、下にずらしていけるかと思ったのですが、全然上手くいきません。しかもsheet1のA1を選択してるようです。どうしてでしょうか???

(2)フォームOKボタンを押して、上記の処理をしても、フォームに記入したものが次にフォームを開いた時に消えていないように、
Me.Hide
End Sub
で終わらせたのですが、次に開いても残っていません。

無知でお恥ずかしいですが、宜しく御願い致します。

かなりの初心者(始めて3日)ですが宜しくお願いします。
しかも2点あります。。。

(1)ユーザーフォームにある大量のテキストboxないし、optionboxをエクセルのsheet2に反映させたいです。
で、地道に
With Sheets(2)
.Range("A22").Value = OptionButton184.Value
.Range("A23").Value = OptionButton185.Value
.Range("A24").Value = OptionButton186.Value
.Range("A25").Value = OptionButton187.Value
とAの行を手で直していたのですが、途中で間違えて、手直しは断念しました。そこで、思いついた...続きを読む

Aベストアンサー

>まずA1を指定させて、下にずらしていけるかと思ったのですが、全然上手くいきません。しかもsheet1のA1を選択してるようです。どうしてでしょうか???

  With Sheets(2)
    Range("A1").Select
    ActiveCell.Offset(1, 0).Value = TextBox1.Text

多分、Sheet1からこのユーザーフォームが開かれているのでは?
『Range("A1").Select』があり『ActiveCell』を基準にしているので、『With Sheets(2)』が意味をなしていません。
書くなら、
  Sheets(2).Activate
  With Sheets(2).Range("A1")
    .Offset(1, 0).Value = TextBox1.Text
これでSheet2のA2から書き出すはずです。(未確認です)

>で終わらせたのですが、次に開いても残っていません。
『残っていない』のではなく、最初にデザインした状態が再度表示されているわけです。

残すためには、プロパティ『ControlSource』にセルを指定する必要があります。
または、下の例示のように『Initializeイベント』で値を取得する必要があるでしょう。



質問では、オプションボタンやテキストボックスが沢山あるみたいですが、一括で処理する例です。

オプションボタン1~80の値をA1~A80に、
テキストボックス1~80の値をB1~B80に 書き込んでいます。

説明を簡略化するために、オプションボタン等の番号と書き出すセルの行番号を一致させています。

終了後、最後フォームを開いた時に書き込んだ値を取得するために、『Unload』で終わり、
『UserForm_Initialize』で取り込んでいます。コード表現は書き込みと逆ですね。


'Sheet2へ書き込む
Private Sub CommandButton1_Click()
  Dim i As Integer

  With Worksheets(2)
    'オプションボタンの値を書き出し
    For i = 1 To 80
      .Range("A" & i) = UserForm1.Controls("OptionButton" & i).Value
    Next
    'テキストボックスの値を書き出し
    For i = 1 To 80
      .Range("B" & i) = UserForm1.Controls("TextBox" & i).Text
    Next
  End With
End Sub


'Formを呼び出したとき、Sheet2から読み込む
Private Sub UserForm_Initialize()
  Dim i As Integer

  With Worksheets(2)
    'オプションボタンの値を読み込み
    For i = 1 To 80
      UserForm1.Controls("OptionButton" & i).Value = .Range("A" & i)
    Next
    'テキストボックスの値を読み込み
    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

>まずA1を指定させて、下にずらしていけるかと思ったのですが、全然上手くいきません。しかもsheet1のA1を選択してるようです。どうしてでしょうか???

  With Sheets(2)
    Range("A1").Select
    ActiveCell.Offset(1, 0).Value = TextBox1.Text

多分、Sheet1からこのユーザーフォームが開かれているのでは?
『Range("A1").Select』があり『ActiveCell』を基準にしているので、『With Sheets(2)』が意味をなしていません。
書くなら、
  Sheets(2).Activate
  With Sheets(...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング