エクセルのユーザーフォームでご教授ください

このQ&Aのポイント
  • マクロの知識がない人でもエクセルの入力用のユーザーフォームを作成する方法について教えてください。
  • ユーザーフォーム1を開いてボタンをクリックすると、ユーザーフォーム2が表示され、ボタンをクリックするとユーザーフォーム1に戻ります。ただし、エクセルを開いた直後には正常に動作しません。
  • ユーザーフォーム1を開くと、ボタンをクリックしても閉じず、もう一度クリックしても閉じず、三回目で閉じます。
回答を見る
  • ベストアンサー

エクセルのユーザーフォームでご教授ください

マクロの知識はほぼなく、調べながらエクセルの入力用のユーザーフォームを作りましたが、うまく作動しません。 UserForm1 ~~~~~~~~~~~~~~~~~~~~~~~~~ Option Explicit Private Declare Function ReleaseCapture Lib "user32" _ () As Long Private Sub UserForm_Initialize() Me.Show End Sub Private Sub Button_cxl_Click() Me.Hide End Sub Private Sub ok_Click() Dim RowNum As Long Dim Ctrl As Control RowNum = Cells(Rows.Count, 1).End(xlUp).Row + 1 Cells(RowNum, 1).Value = Me.txt_date Cells(RowNum, 2).Value = Me.txt_guest Cells(RowNum, 3).Value = Me.txt_person Cells(RowNum, 4).Value = Me.txt_begin Cells(RowNum, 5).Value = Me.txt_finish For Each Ctrl In Me.Controls If Ctrl.Name Like "txt*" Then Ctrl.Value = "" RowNum = 0 End If Next Ctrl Me.Hide ReleaseCapture UserForm2.Show vbModal End Sub ~~~~~~~~~~~~~~~~~~~~~~~~~ UserForm2 ~~~~~~~~~~~~~~~~~~~~~~~~~ Option Explicit Private Declare Function ReleaseCapture Lib "user32" _ () As Long Private Sub UserForm_Initialize() End Sub Private Sub ButtonEnd_Click() Unload Me UserForm1.Hide End Sub Private Sub ButtonNext_Click() Unload Me ReleaseCapture UserForm1.Show vbModal End Sub ~~~~~~~~~~~~~~~~~~~~~~~~~ Module1 ~~~~~~~~~~~~~~~~~~~~~~~~~ Sub ユーザーフォーム() UserForm1.Show End Sub ~~~~~~~~~~~~~~~~~~~~~~~~~ UserForm1を開き、Button_cxlで閉じず、もう一度Button_cxlをクリックで閉じる。 UserForm1を開き、Button_okでUserForm2を出し、ButtonEndをクリックでUserForm1にもどる(1と2を数度行き来しても同じ) UserForm1を開き、Button_okでUserForm2を出しButtonNextをクリックでUserForm1にもどりButton_cxlをクリックで閉じず、もう一度クリックしても閉じず、三回目で閉じる。 現状、エクセルを開いた直後のみで発生してます。 一度ユーザーフォームを出し、閉じたあとは意図通り動き、再度エクセルを開くまで発生しません。 ちなみにUserForm2の Private Sub ButtonEnd_Click() Unload Me UserForm1.Hide End Sub 部分の、UserForm1.HideをUnload UserForm1にすると、「オブジェクト変数または With ブロック変数が設定されていません」と出てデバックでModule1の UserForm1.Show が黄色になります。 どこが悪いか教えてください。

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

  • ベストアンサー
  • oka_me
  • ベストアンサー率86% (26/30)
回答No.1

詳しい解説をしようとする当方のボキャブラリー不足の為自分が混乱してしまいそうなので(^-^;)、とりあえず解決策の提案のみですが・・・ (1)UserForm1内の Private Sub UserForm_Initialize() Me.Show End Sub の三行を削除 (2)UserForm2のButtonEnd_Click内の UserForm1.Hide を Unload UserForm1 に変更 (※質問文内ではエラーになったと記載がありましたが、(1)の修正を行うことによってエラーは解消されるかと思います) 完璧に不具合解消されるかは分かりませんが、とりあえず上記2点の修正でどうでしょうか。。

milkybey
質問者

お礼

完璧に意図通り動きました。 ありがとうございます。 どこかからかコピペし、動作には関係ないと思っていた構文だったので、完全に無視してました。 よく見ればInitializeって書いてありますよね(汗

関連するQ&A

  • ユーザーフォームに入力したデーターが転記できない

    いつもお世話になります。 Windows7 excell2010 です。 いろんなものに勉強してここまでに作成したユーザーフォームですが、データーは入力できるのですがコマンドボタンをクリックしても各セルに反映されません。 色々と試行錯誤していますがうまくゆきません。 どこに不具合があるかわからず恐れ入りますがどなたかご指導いただけませんか。 参考にコードは参考に下記にします。 ユーザフォームのVBAは下記です コード ※Module1 Sub 売上() Do UserForm1.Show Loop End Sub Sub 入金() Do UserForm2.Show Loop End Sub ※UserForm1 Private Sub UserForm_Initialize() With ComboBox1 .AddItem "1" .AddItem "2" .AddItem "3" End With End Sub Private Sub CommandButton1_Click() n = Cells(Rows.Count, 1).End(xlUp).Row + 1 Cells(n, 2) = UserForm1.TextBox1.Text Cells(n, 3) = UserForm1.TextBox2.Text Cells(n, 4) = UserForm1.TextBox3.Text Cells(n, 11) = UserForm1.ComboBox1.Text Unload Me End Sub Private Sub CommandButton2_Click() Unload Me End End Sub ※UserForm2 Private Sub CommandButton1_Click() n = Cells(Rows.Count, 1).End(xlUp).Row + 1 Cells(n, 2) = UserForm2.TextBox1.Text Cells(n, 3) = UserForm2.TextBox2.Text Cells(n, 4) = UserForm2.TextBox3.Text Unload Me End Sub Private Sub CommandButton2_Click() Unload Me End End Sub

  • ユーザーフォームVBAでCells(n, 7)が

    いつもお世話になります Windows7 excell2010 です ご指導を仰ぎたいのは参照図で言うと、 TextBox1~6 は順調に入力しますがTextBox7にすると「入力」に飛び 参照図のG13に入力されません。 VBAを勉強し始めたはかりですのでどこが悪いかわかりません。 恐れ入りますがご指導願えませんでしょうか。 下記参考にします。 Module のコードには Sub FormSample() Do UserForm1.Show Loop End Sub Sub Test() MsgBox "ボタンによるマクロの実行" End Sub UserForm1 Private Sub CommandButton1_Click() n = 1 Do n = n + 1 Loop While Cells(n, 1) <> "" Cells(n, 1) = UserForm1.TextBox1.Text Cells(n, 2) = UserForm1.TextBox2.Text Cells(n, 3) = UserForm1.TextBox3.Text Cells(n, 4) = UserForm1.TextBox4.Text Cells(n, 5) = UserForm1.TextBox5.Text Cells(n, 6) = UserForm1.TextBox6.Text Cells(n, 7) = UserForm1.TextBox7.Text Unload Me End Sub Private Sub CommandButton2_Click() Unload Me End End Sub

  • ユーザーフォームの入力時のマクロについて

    いつもお世話になります。 Windows7 excell2010 です。 今まさにVBAをやり出してあまりわかっていませんが下記のようにまでになったところです。 ご指導をいただきたいのは、 参照図にあるUserForm1に入力するとき、 「日付」 ime が 半角数値 「顧客名」ime が ひらがな 「売上」 ime が 半角数値 を自動的にする マクロ を記述したいです。 ご指導いたたければ幸いです。 下記のようなマクロが記述されています。 ※UserForm1 コード表示 Private Sub CommandButton1_Click() n = 1 Do n = n + 1 Loop While Cells(n, 1) <> "" Cells(n, 1) = UserForm1.TextBox1.Text Cells(n, 2) = UserForm1.TextBox2.Text Cells(n, 3) = UserForm1.TextBox3.Text Unload Me End Sub Private Sub CommandButton2_Click() Unload Me End End Sub ※標準モジュール Sub FormSample() Do UserForm1.Show Loop End Sub Sub Test() MsgBox "ボタンによるマクロの実行" End Sub

  • 複数のユーザーフォームをコマンドボタンにて表示・非表示させるには

    VBA勉強中のものです。 複数のユーザーフォームをコマンドボタンを使用して画面への表示切替を考えております。 例)ユーザーフォーム1,ユーザーフォーム2,ユーザーフォーム3のそれぞれにコマンドボタン1,コマンドボタン2,コマンドボタン3を作成し、   コマンドボタン1→ユーザーフォーム1を表示   コマンドボタン2→ユーザーフォーム2を表示   コマンドボタン3→ユーザーフォーム3を表示 とするようなことを考えおります。  そこで、下記のようにコードを作成したのでですが,一度表示させたユーザーフォームを再度表示させようとコマンドボタンをクリックしたら、「フォームはすでに表示させているのでモーダル表示はできません」とエラーがでてしまいます。   どなたか、どのようにしたらいいかご教授ねがいます。 サンプルコード) --------------------------------------------------- 'UserForm1のコード Private Sub CommandButton2_Click() Call UserForm2_show UserForm1.Hide End Sub Private Sub CommandButton3_Click() Call UserForm3_show UserForm1.Hide End Sub ---------------------------------------------------- 'UserForm2のコード Private Sub CommandButton1_Click() Call UserForm1_show UserForm2.Hide End Sub Private Sub CommandButton3_Click() Call UserForm3_show UserForm2.Hide End Sub ------------------------------------------------------- 'UserForm3のコード Private Sub CommandButton1_Click() Call UserForm1_show UserForm3.Hide End Sub Private Sub CommandButton2_Click() Call UserForm2_show UserForm3.Hide End Sub ------------------------------------------------------------ '標準モジュール コード Sub UserForm1_show() UserForm1.Show End Sub Sub UserForm2_show() UserForm2.Show End Sub Sub UserForm3_show() UserForm3.Show End Sub

  • ユーザーフォームの切り替えについて・・・

    UserForm1とUserForm2の2つのユーザーフォームがあります。 UserForm1の中にあるcommandButton1をクリックすると、UserForm2が表示される仕組みになっています。 (ちなみに、UserForm2にもコマンドボタンがあり、クリックするとUserForm1に戻るようになっています) UserForm1の方に、 Private Sub CommandButton1_Click() UserForm2.Show 0 Unload UserForm1 End Sub UserForm2の方に、 Private Sub CommandButton1_Click() UserForm1.Show 0 Unload UserForm2 End Sub と記述してあります。 ところが、それぞれのユーザーフォームには、閉じると同時にブックが閉じるように Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) ActiveWorkbook.Save 'ブックを保存 ActiveWorkbook.Close 'ブックを閉じる Application.Quit 'excelを終了 End If End Sub というコードを記述しているため、UserForm1からUserForm2へ移るときにブックが閉じてしまいます。 右上の「×」を押したときだけブックを閉じるようにしたいのですが、どういうコードを書いたらいいのですか? 宜しくお願いします。(*´Д`人)

  • ユーザーフォームをWorksheet上で表示

    数日前、このカテゴリで相談した事の続きです。 以前の相談は、次の通りです。 http://okwave.jp/qa/q8892460.html この相談の中で出来たことは 1 ユーザーフォームを保存終了 2 Worksheet上にボタンを作成、そのボタンをクリックでユーザーフォームを表示 以上のことはできました。 作成したコードは次のとおりです。   '// Private Sub UserForm_Initialize() With Worksheets("Sheet1")  TextBox1 = .Cells(1, 1).Value  TextBox2 = .Cells(2, 1).Value TextBox3 = .Cells(3, 1).Value TextBox4 = .Cells(4, 1).Value TextBox5 = .Cells(5, 1).Value ).Value End With End Sub Private Sub UserForm_Terminate() With Worksheets("Sheet1")  .Cells(1, 1).Value = TextBox1  .Cells(2, 1).Value = TextBox2 .Cells(3, 1).Value = TextBox3 .Cells(4, 1).Value = TextBox4 .Cells(5, 1).Value = TextBox5 End With End Sub '// Private Sub cmdsyuuryo_Click() Unload Me End Sub Private Sub UserForm_Click() Myform.Show vbModeless End Sub そこで質問です。 現在Worksheet上にボタンを作成、クリックしてユーザーフォームを表示しているの を、WorksheetのセルA1(名前を記述してある)をクリックするだけでユーザーフォー ムを表示する方法はありませんか? ユーザーフォームの保存先は「Sheet1」のA1からA5までです。 できれば、この設定で具体的なコードの記述をお願いします。 Excel2013です。 よろしくお願いします。

  • ユーザーフォームで別シートを検索できますか

    現在エクセルのユーザーフォームを勉強中です。職員データとメモの二つのシートがあります。職員データシート上で職員コード番号で検索し検索画面を閉じるとデータを表示するユーザーフォームが表示されるように作成しました。ここまでは出来ました。これを、コード番号の検索でメモシートの職員番号も検索し該当する番号があれば行番号を取得(変数名:メモRow)無ければカーソルを最終行に移動。データ表示フォームに職員のデータとその職員のメモデータを表示するように、メモを書きたいときはメモ表示ボックスに記入。記入したデータをメモシートにも記入できるようにしたい。 出来ないこと (1)職員データシートの検索画面でメモシートを同時に検索したい (2)メモシートの行番号を変数に格納したい (3)該当番号がなければ最終行にカーソルを移動したい (4)職員データのフォームに記入したデータをメモシートに反映させたい わかる方どうぞ教えてください。 こんな風に作りました Private Sub 初期化_Click() Unload UserForm検索 UserForm検索.次へ.Enabled = False UserForm検索.Label1.Caption = "検索値を入れて検索ボタンを押してください。" UserForm検索.Show vbModeless End Sub Private Sub 検索_Click() Dim 検索値 As String '変数を宣言。 On Error GoTo errhandler 検索値 = TextBox1.Value If 検索値 = "" Then MsgBox "検索する語句を入れてください。" TextBox1.SetFocus 'TextBox1にカーソルを移動。 Else Cells.Find(What:=検索値, After:=ActiveCell, LookIn:=xlValues, LookAt:= _ xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:= _ False, MatchByte:=False).Activate 検索.Enabled = False 次へ.Enabled = True Label1.Caption = "次をさがすには「次へ」ボタンを押してください。" 'Label1のメッセージを変える。 errhandler: ' Select Case Err.Number Case 91 MsgBox "その検索値は存在しません。" End Select ' End If End Sub Private Sub 次へ_Click() Cells.FindNext(After:=ActiveCell).Activate End Sub Private Sub 閉じる_Click() Unload Me DATA.Show End Sub 以上検索画面 ※別シートの検索は可能ですか? 以下は表示画面(DATA) Option Explicit Private myRow As Long Private Sub btm検索_Click() Unload Me 'DATAフォームを非表示に。 UserForm検索.Show '検索フォームを表示 End Sub Private Sub btm前_Click() '前へボタン myRow = myRow - 1 GetData End Sub Private Sub btnCancel_Click() '終了を確認する If MsgBox("終了しますか?", vbYesNo, "確認") = vbYes Then Unload Me End If End Sub Private Sub btn次_Click() '次へボタン myRow = myRow + 1 GetData End Sub ※以下はデータ表示コマンドが続きます最後に Me.tab3資格1.Value = ActiveSheet.Cells(myRow, 111).Value Me.tab3資格2.Value = ActiveSheet.Cells(myRow, 114).Value Me.tab4メモ.Value = Worksheets("メモ").Cells(メモRow, 3).Value                              ↑                  表示できない、具体的に行数を入れると表示する! End Sub ※変数:メモRowをどこで宣言すれば?

  • ユーザーフォームの内容が一部だけ残らない。

    VBAを始めてまだ1週間ほどなのでどの部分を変えればよいのかわかりません。 どなたかわかる方が居れば回答をお願いします。 問題:下記の構文でTextBox2の内容だけが残らない。 UserFoem1で記入場所が7つあり、ボタン1(入力)を押すと 7つの内容がSheet(履歴表)に転記されます。 ボタン2(終了)を押すとUserFormが消えます。 そして転記された後、内容をそのまま7つのTextBoxに残したいと思っています。 TextBox1(txtDate)日付を自動で表示して、 TextBox3~7までは転記後も内容は残るのですが、 TextBox2の内容だけが残らないのです。 下記の構文はネット上でいろんな方のものをコピペして製作したので、 訳の分からない文字がたくさんあり理解をしていない部分はあります。 ですので回答をいただけるならTextBox2の問題解決と 下記の内容をもっとスマートな形に変えて 不要な部分を削除して頂けたらと思っています。 宜しくお願い致します。 Sub ユーザーフォームで履歴表へ入力する() End Sub Private Sub CommandButton1_Click() Dim n As Long With Worksheets("履歴表") n = .Range("B" & Rows.Count).End(xlUp).Row  'Bの一番下を検索する Cells(n + 1, 2).Value = txtDate.Value    'テキストボックス2に自動で日付を入れてB列へ Cells(n + 1, 3).Value = TextBox2.Value 'C列へ代入 Cells(n + 1, 4).Value = TextBox3.Value 'D列へ代入 Cells(n + 1, 5).Value = TextBox4.Value 'E列へ代入 Cells(n + 1, 6).Value = TextBox5.Value 'F列へ代入 Cells(n + 1, 7).Value = TextBox6.Value 'G列へ代入 Cells(n + 1, 8).Value = TextBox7.Value 'H列へ代入 Range(Cells(n + 1, 2), Cells(n + 1, 2)).Offset(, -1).Value = Range(Cells(n + 1, 2), Cells(n + 1, 2)).Row - 4   'A列に番号を順番に入れる End With TextBox2.Value = "" TextBox2.SetFocus End Sub Private Sub TextBox2_Change() '商品名 End Sub Private Sub TextBox3_Change() '型式・形式 End Sub Private Sub TextBox4_Change() '数量 End Sub Private Sub TextBox5_Change() '客先 End Sub Private Sub TextBox6_Change() '担当 End Sub Private Sub TextBox7_Change() '備考 End Sub Private Sub txtDate_Change() End Sub Private Sub UserForm_Click() End Sub Private Sub UserForm_Initialize() UserForm1.txtDate.Value = Date End Sub Private Sub CommandButton2_Click() Me.Hide End Sub

  • ExcelVBA ユーザーフォーム間の変数について

    UserForm1のコントロールボタンbtn1又はbtn2をクリックするとUserForm2を開く。 UserForm1にはテキストボックスtxtN1、txtN2がある。 UserForm2のテキストボックスtxtN3に入力された値をbtnDecideをクリックすると、 UserForm1に自動入力するようにする。 その際btn1をクリックしてUserForm2を開いた場合はtxtN1に、btn2をクリックして開いた場合は txtN2に自動入力されるようにする。 以下のようにコードを組んでみました。 UserForm1のコード Public Number as integer Private Sub btn1_Click() Number = 1 UserForm2.Show End Sub Private Sub btn2_Click() Number = 2 UserForm2.Show End Sub UserForm2のコード Public Number as integer Private Sub btnDecide_Click() If Number = 1 Then UserForm1.txtN1 = txtN3.Text else:Number=2 UserForm1.txtN2= txtN3.Text End If Unload Me End Sub 以上になります。 どうもpublic 変数NumberがUserForm2を開いた段階でリセットされているようなのです。 何かいい方法はありますでしょうか。 教えていただける方がいましたらよろしくお願い致します。

  • エクセル2010のユーザーフォーム記述について。

    エクセル2010でセルのコピーペーストの質問です。次のような記述がユーザーフォームにあります。これだと、なぜか貼り付け先のセルのすぐ上のセルの条件付き書式まで貼り付け先に貼り付けられてしまいます。 どのような記述をすれば不具合を解消できますか。 Private Sub CommandButton1_Click() Selection.PasteSpecial Paste:=xlPasteAllExceptBorders Selection.PasteSpecial Paste:=xlPasteValues UserForm1.Hide End Sub Private Sub CommandButton2_Click() UserForm1.Hide End Sub

専門家に質問してみよう