• ベストアンサー

ユーザーフォームで入力するときに、値を残して訂正分だけ訂正して入力したいのですが、できません。

マクロの初心者です。 参考書を見ながらマクロを書きましたが、ユーザーフォームからセルに書き込み後、Cmmandと、Txtに入力データを残しておいて、次は訂正部分だけを訂正して書き込みをしたいのですが、コードがわかりません。 まだマクロをほとんど理解していませんので、よろしくお願いします。 Option Explicit Public MyDlg As Boolean Sub 鳥獣入力() 'データ入力ダイアログを呼び出す MyDlg = True 'MyDlgにtrueを代入する '入力開始位置の取得 Sheets("様式1").Select Range("B9909").End(xlUp).Activate ActiveCell.Offset(1, 0).Activate 'MyDlgにFalseが代入されるまで繰り返しダイアログを表示する Do Until MyDlg = False Form鳥獣入力.Show Loop End Sub -------------------------------- Private Sub Cmd終了_Click() '「終了」ボタンクリック時の処理 'MyDlgにFalseを代入し、ダイアログを閉じる MyDlg = False Unload Form鳥獣入力 End Sub -------------------------------- Private Sub Cmd入力_Click() '入力クリック時の処理 'ダイアログのデータをワークシートに入力する ActiveCell.Value = Cmb登録種別.Value ActiveCell.Offset(0, 1).Activate ActiveCell.Value = Txt登録証.Value ActiveCell.Offset(0, 1).Activate ActiveCell.Value = Cmb年月日.Value ActiveCell.Offset(0, 1).Activate ActiveCell.Value = Cmb鳥獣名.Value ActiveCell.Offset(0, 1).Activate ActiveCell.Value = Cmb雌雄の別.Value ActiveCell.Offset(0, 1).Activate ActiveCell.Value = Txt捕獲数.Value ActiveCell.Offset(0, 1).Activate ActiveCell.Value = Cmbメッシュ番号.Value ActiveCell.Offset(0, 1).Activate ActiveCell.Value = Cmb市町村名.Value ActiveCell.Offset(0, 1).Activate ActiveCell.Offset(1, -8).Activate Unload Form鳥獣入力 End Sub -------------------------------- 入力、書き込みはできましたがユーザーフォームにデータを残すことができません。 よろしくお願いします。

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

  • ベストアンサー
  • myRange
  • ベストアンサー率71% (339/472)
回答No.1

Unload した後、Showするとコントロールの値は初期化されますので Show,Unloadとも一回だけにしておかなければいけません。 また、Activecell.offset(0,1).SelectなどのSelectは不要です。 '========= 標準モジュール ========= Option Explicit Sub 鳥獣入力()   Sheets("様式1").Select   Form鳥獣入力.Show End Sub '======== 以下UserFormモジュール =========== Private Sub Cmd終了_Click()   Unload Form鳥獣入力 End Sub '-------------------------------- Private Sub Cmd入力_Click()  With Range("B9909").End(xlUp).Offset(1, 0)    .Value = Cmb登録種別.Value    .Offset(0, 1).Value = Txt登録証.Value    .Offset(0, 2).Value = Cmb年月日.Value    .Offset(0, 3).Value = Cmb鳥獣名.Value    .Offset(0, 4).Value = Cmb雌雄の別.Value    .Offset(0, 5).Value = Txt捕獲数.Value    .Offset(0, 6).Value = Cmbメッシュ番号.Value    .Offset(0, 7).Value = Cmb市町村名.Value  End With End Sub '----------------------------------------------- 以上です。

daibaas
質問者

お礼

myRange様 早速の回答ありがとうございました。 思い通りに動きました。 ずいぶん余分なものがあったようです。 じっくりと勉強させていただきます。 感謝、感謝です。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.2

>Unload Form鳥獣入力 ↓ Form鳥獣入力.Hide Unloadの代わりにHide メソッドを使ってみては 非表示にするだけでアンロードしませんのでユーザーフォーム上の データは次回Showしたときも残ります。

daibaas
質問者

お礼

watabe007様 ありがとうございます。 連絡が遅くなりました。 簡単なことで同じ結果が得られました。 大変勉強になります。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 画面のちらつきを無くす

    よろしくお願いします。 1:シート上のセルからユーザーフォーム(フォームあ)を開く。 2:ユーザーフォームには、リストボックスが3つあります。   (リスト1、リスト2、リスト3)  リスト1から項目を選択、次にリスト2を選択した時と、リスト3を  選択したときに、画面がちらつきます。 このチラつきがないように、出来ないでしょうか。 Private Sub Worksheet_SelectionChange(ByVal Target As Range)   If Target.Row > 4 And Target.Row < 233 And Target.Column > 5 And Target.Column < 7 Then   フォームあ.Show vbModeless   Else    Unload フォームあ   End If End Sub Private Sub リスト1_Click()  Application.ScreenUpdating = False   With リスト1ActiveCell.Offset(0, 0).Activate    ActiveCell.Value = .List(.ListIndex, 0)    ActiveCell.Offset(0, 0).Value = .List(.ListIndex, 0)     ActiveCell.Offset(0, 0).Activate   End With  Application.ScreenUpdating = True End Sub Private Sub リスト2_Click()  Application.ScreenUpdating = False   With リスト2    ActiveCell.Offset(0, 3).Activate    ActiveCell.Value = .List(.ListIndex, 0)    ActiveCell.Offset(0, 0).Value = .List(.ListIndex, 0)     ActiveCell.Offset(0, -3).Activate   End With  Application.ScreenUpdating = True End Sub Private Sub リスト3_Click()  Application.ScreenUpdating = False   With リスト3    ActiveCell.Offset(0, 3).Activate    ActiveCell.Offset(1, 0).Activate    ActiveCell.Value = .List(.ListIndex, 0)    ActiveCell.Offset(0, 0).Value = .List(.ListIndex, 0)     ActiveCell.Offset(-1, 0).Activate     ActiveCell.Offset(0, -3).Activate   End With  Application.ScreenUpdating = True End Sub

  • VBAプログラムについて

    VBAプログラムを本を見ながら作成していますが、はっきりいって素人です。 本に載っていないこととなるとちんぷんかんぷんで、いくつかあるプロシージャのどのプロシージャ内に記入したら良いのか分からないし、新しいプロシージャをどこに記入して良いのか分かりません。 例えば、 ----------------------------------------------------------- Private Sub CommandButton1_Click() ActiveCell.Value = TextBox1.Value ActiveCell.Offset(0, 1).Value = TextBox2.Value ActiveCell.Offset(0, 2).Value = TextBox3.Value ActiveCell.Offset(0, 3).Value = TextBox4.Value ActiveCell.Offset(0, 4).Value = TextBox5.Value ActiveCell.Offset(0, 5).Value = TextBox6.Value ActiveCell.Offset(0, 6).Value = TextBox7.Value ActiveCell.Offset(0, 7).Value = TextBox8.Value ActiveCell.Offset(0, 8).Value = TextBox9.Value ActiveCell.Offset(1, 0).Activate End Sub Private Sub CommandButton2_Click() Unload Me End Sub Private Sub Label1_Click() End Sub Private Sub UserForm_Click() End Sub Private Sub UserForm_Initialize() Range("A2").Activate End Sub ---------------------------------------------------------- テキスト入力フォームをいくつか作っており、コマンドボタン1とコマンドボタン2で入力ボタンと閉じるボタンにしています。   このプログラムでは、入力ボタンをクリックすることでデータが入力されて、入力された列のすぐ次の列の最初のセルがアクティブな状態になります。 (1)データ入力済みのエクセルシートにおいて、アクティブな状態にしたセルや列を削除したい場合、どこにどのように書けば良いのでしょうか? (2)データ入力が一度に終わらない時、途中の任意の列から入力を始めたい場合はどこにどのように書けば良いのでしょうか? 本に書かれていることは丸写しできますが、ちょっとでも違うと壁にぶつかってしまいます。 独学で勉強する時に良いと思われる方法はどんな方法なのでしょうか? おこがましいですが素人も分かりやすい説明をして頂けると助かります。 宜しくお願いします。

  • エクセル ユーザーフォーム 変数の定義

    エクセルでユーザーフォームを作成しました。 その中で郵便番号・住所を入れるテキストボックスがあるのですが、 郵便番号を入れると次のボックスに住所を表示させるのがかなり難しく、 自分で作成するほどのスキルは到底ないので、 下記のページにあったサンプルを利用して作成させて頂きました。 http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_130_050.html このページのサンプルだとシートのセルに飛ばないので、 シートのセルに飛ぶように下記のコードを入れました。 するとコマンドボタンを押すと 「変数を定義してください」 とエラーメッセージが出ました。 最初から自分で作成したフォーム上で下記のコードで実行した場合は うまくいったので行けるかと思ったのですが甘くありませんでした。 今までネットで調べたりしてマクロ等を使っていましたが、 変数は触ったことがなく未知の領域です。 こんな知識のまま手を突っ込むのは無謀かと思うのですが、 どなたかご教授いただけないでしょうか? 宜しくお願いいたします。 問題のコードはこちらです。 Private Sub cmdTouroku_Click() Range("B65535").End(xlUp).Offset(1).Select ActiveCell.Value = txtHinichi.Value ActiveCell.Offset(0, 1).Select ActiveCell.Value = txtKname.Value ActiveCell.Offset(0, 1).Select ActiveCell.Value = txtKumisu.Value ActiveCell.Offset(0, 1).Select ActiveCell.Value = txtName.Value ActiveCell.Offset(0, 1).Select ActiveCell.Value = txtParty.Value ActiveCell.Offset(0, 1).Select ActiveCell.Value = txtPartyp.Value ActiveCell.Offset(0, 1).Select ActiveCell.Value = txtSougei.Value ActiveCell.Offset(0, 1).Select ActiveCell.Value = txtMember.Value ActiveCell.Offset(0, 1).Select ActiveCell.Value = txtVisiter.Value ActiveCell.Offset(0, 1).Select ActiveCell.Value = ListBox1.Value ActiveCell.Offset(0, 1).Select ActiveCell.Value = txtPstyle.Value ActiveCell.Offset(0, 1).Select ActiveCell.Value = TXT_ZIPCODE.Value ActiveCell.Offset(0, 1).Select ActiveCell.Value = TXT_JUSYO.Value ActiveCell.Offset(0, 1).Select ActiveCell.Value = txtJusho2.Value txtKname.Value = "" txtKumisu.Value = "" txtName.Value = "" txtParty.Value = "" txtPartyp.Value = "" txtSougei.Value = "" txtMember.Value = "" txtVisiter.Value = "" txtPstyle.Value = "" TXT_ZIPCODE.Value = "" TXT_JUSYO.Value = "" txtJusho2.Value = "" UserForm1.txtHinichi.SetFocus End Sub

  • エクセルVBAで無限ループ

    教えてください。 以下の2つのエクセルマクロはまったく同じことをさせようとしているのですが、test02の方は.Offset(1).Activateが働かないのか、無限ループに陥ってしまいます。 単にActiveCell.という記述をWith~End Withでまとめただけなのになぜこうなるのでしょうか? Sub test01() ActiveSheet.Cells(1, 1).Activate Do While ActiveCell.Value <> "" If Not IsNumeric(ActiveCell.Value) Then ActiveCell.Offset(0, 1).Value = "文字" ElseIf ActiveCell.Value > 0 Then ActiveCell.Offset(0, 1).Value = "正数" ElseIf ActiveCell.Value < 0 Then ActiveCell.Offset(0, 1).Value = "負数" Else ActiveCell.Offset(0, 1).Value = "その他" End If ActiveCell.Offset(1).Activate i = i + 1 Application.StatusBar = i Loop End Sub Sub test02() ActiveSheet.Cells(1, 1).Activate With ActiveCell Do While .Value <> "" If Not IsNumeric(.Value) Then .Offset(0, 1).Value = "文字" ElseIf .Value > 0 Then .Offset(0, 1).Value = "正数" ElseIf ActiveCell.Value < 0 Then .Offset(0, 1).Value = "負数" Else .Offset(0, 1).Value = "その他" End If .Offset(1).Activate i = i + 1 Application.StatusBar = i Loop End With End Sub

  • ユーザーフォームからコメントを入力

    ユーザーフォームを作成し、フォームからシートのセルへコメント入力しようと考えております。 もともとシートにあるコメントの情報をユーザーフォームに表示させるまで至りましたが、ユーザーフォームからシートへ転記が出来ません。 ちなみにユーザーフォームからシートへの転記方法は、 ActiveCell.Offset(1,0)で一列ずつずらしながら転記しています。 自分で試した方法ですが、 コードを一部抜粋 ActiveCell.Offset(1,0) ActiveCell.value = NyukinForm.Kingaku.value ActiveCell.Offset(1,0) ActiveCell.value = NyukinForm.Seikyugaku.value ActiveCell.Comment = NyukinForm.SeikyugakuComment.value 上記コードだとまったく反映されません。 ActiveCell.Offset(1,0) ActiveCell.value = NyukinForm.Kingaku.value ActiveCell.Offset(1,0) ActiveCell.value = NyukinForm.Seikyugaku.value ActiveCell.AddComment = NyukinForm.SeikyugakuComment.value この方法だとコメントの赤マークは出ますが、内容がまったく表示されません。 どなたかフォームから入力したコメントをうまくシートへ反映させる方法をご存知でないでしょうか? よろしくお願い致します。

  • Excel・VBA フォーム入力で空欄によるエラーをなくすには?

    Excelで商品一覧表を作成し、フォームで入力できるようにしたいです。 登録ボタンを押すと、最終行に商品名等が各セルに入力されますが、 フォーム内の項目で、空欄箇所があるとエラーになってしまいます。 フォームで空欄箇所は空欄で処理できるようにしたいのですが、どのようにすればよいでしょうか? VBA初心者です。よろしくお願いします。 Private Sub commandbutton登録_Click() Worksheets("商品一覧表").Activate Range("A65536").End(xlUp).Offset(1, 0). SelectOffset(0, 0) = txt商品名.Value .Offset(0, 1) = CCur(txt価格.Value) .Offset(0, 2) = CLng(txt数量.Value) .Offset(0, 3) = txt詳細.Value .Offset(0, 4) = txt備考.Value

  • Excel ユーザーフォーム呼び出し時エラー

    WindowsVista HomePremium Excel 2007 Microsoft Visual Basic 6.5 です。 Excelでユーザーフォーム(UserForm1)を作り、   Sub Auto_Open()     UserForm1.Show   End Sub で起動時に呼び出すようにしました。 確認のため、一度Excelを閉じ起動し直したところ正常に動作しました。 もう一度確認のため同じように再起動をすると、  実行時エラー '2110': コントロールが表示されていない、利用できない、またはフォーカスを持てないため、そのコントロールにフォーカスを移すことはできません。 と出て、それ以降何度やっても動作しなくなってしまいました。 解決法か原因がわかる方いらっしゃいましたら、ぜひご教授ください。よろしくおねがいします。 ユーザーフォーム関係のコードを以下に書いておきます。(内容は小遣い帳のようなものです。) ―――――――――――――――――――― Private Sub CommandButton1_Click() Dim NUM As Integer If TextBox1.Text = "" Then MsgBox "概要が記入されていません。" TextBox1.SetFocus GoTo 100 ElseIf TextBox2.Text = "" Then MsgBox "収支が記入されていません。" TextBox2.SetFocus GoTo 100 ElseIf ComboBox1.ListIndex = -1 Then MsgBox "収支の種類が選択されていません。" ComboBox1.SetFocus GoTo 100 End If Range("F6").Select NUM = 0 Do While ActiveCell.Offset(NUM, 0) <> "" NUM = NUM + 1 Loop ActiveCell.Offset(NUM, 0).Select ActiveCell = TextBox1.Value If CheckBox1 = True Then TextBox2 = -TextBox2 End If If ComboBox1.ListIndex = 0 Or ComboBox1.ListIndex = 1 Then ActiveCell.Offset(0, ComboBox1.ListIndex + 1) = TextBox2.Value Else ActiveCell.Offset(0, ComboBox1.ListIndex + 2) = TextBox2.Value End If TextBox1 = "" TextBox2 = "" CheckBox = Falses ComboBox1.ListIndex = -1 100 End Sub ―――――――――――――――――――― Private Sub CommandButton2_Click() Dim NUM As Integer If TextBox3.Text = "" Then MsgBox "移動金額が記入されていません。" TextBox3.SetFocus GoTo 100 ElseIf ComboBox2.Text = "" Then MsgBox "移動元が選択されていません。" ComboBox2.SetFocus GoTo 100 ElseIf ComboBox3.ListIndex = -1 Then MsgBox "移動先が選択されていません。" ComboBox3.SetFocus GoTo 100 End If Range("F6").Select NUM = 0 Do While ActiveCell.Offset(NUM, 0) <> "" NUM = NUM + 1 Loop ActiveCell.Offset(NUM, 0).Select ActiveCell = "移動" If ComboBox2.ListIndex = 0 Or ComboBox2.ListIndex = 1 Then ActiveCell.Offset(0, ComboBox2.ListIndex + 1) = -TextBox3.Value Else ActiveCell.Offset(0, ComboBox2.ListIndex + 2) = -TextBox3.Value End If If ComboBox3.ListIndex = 0 Or ComboBox3.ListIndex = 1 Then ActiveCell.Offset(0, ComboBox3.ListIndex + 1) = TextBox3.Value Else ActiveCell.Offset(0, ComboBox3.ListIndex + 2) = TextBox3.Value End If TextBox3 = "" ComboBox2.ListIndex = -1 ComboBox3.ListIndex = -1 100 End Sub ―――――――――――――――――――― Private Sub CommandButton3_Click() Unload Me End Sub ―――――――――――――――――――― Private Sub CommandButton4_Click() Unload Me End Sub ―――――――――――――――――――― Private Sub UserForm_Initialize() myarray1 = Array("収支", "クレジット", "郵便局", "机", "500", "1") For i = 0 To 5 ComboBox1.AddItem myarray1(i) ComboBox2.AddItem myarray1(i) ComboBox3.AddItem myarray1(i) Next i TextBox1.SetFocus End Sub

  • For~Nextで印刷だけさせようとしましたが、うまく動きません

    マクロの初心者です。まだほとんどわかっておりませんので、よろしくお願いします。 ユーザーフォームにシートの表の任意の番号を入力して、業者1から業者2までの連番で封筒に住所が印刷したくてコードを書きました。 変数 i の使い方がわからないので教えてください、お願いします。 Private Sub Cmb業者1_AfterUpdate() '番号に対し業者名を表示する '変数の宣言 Dim MyKC As Long 'Txt業者に対応する業者名を表示する MyKC = Cmb業者1.Value Txt業者名1.Text = Application.WorksheetFunction. _ VLookup(MyKC, Range("電気住所"), 3) End Sub ------------------------------ Private Sub Cmb業者2_AfterUpdate() '番号に対し業者名を表示する '変数の宣言 Dim MyKCC As Long 'Txt業者に対応する業者名を表示する MyKCC = Cmb業者2.Value Txt業者名2.Text = Application.WorksheetFunction. _ VLookup(MyKCC, Range("電気住所"), 3) End Sub ------------------------------ Private Sub Cmd印刷_Click() '変数の宣言 Dim i As Long 'プリンターの設定 Application.ActivePrinter = "Canon iP4300:" '印刷クリック時の処理 For i = MyKC To MyKCC Range("A1").Value = i.Value            ここの i で止まります ActiveSheet.PrintOut Copies:=1 Next i Unload Form電気業者印刷 End Sub ------------------------------ Private Sub Cmd終了_Click() '「終了」ボタンをクリック時の処理 'MyDlgにFalseを代入し、フォームを閉じる MyDlg = False Unload Form電気業者印刷 End Sub 単純に印刷するだけです。 よろしくお願いします。

  • 行方向の同じ値のセルを結合するマクロ

    ネットで色々調べながら、A列方向の同じ値のセルを結合させるマクロ を作ってみたのですが、もっと簡単にできるようでしたら教えていただきたいです。 どうぞよろしくお願いいたします。 Sub セル結合() Dim r As Integer '行数 Dim i As Integer 'カウンタ r = Sheets(1).Range("a1").CurrentRegion.Rows.Count - 1 Application.DisplayAlerts = False For i = 1 To r Cells(i, 1).Activate '項目の一つ下のセルをアクティブに If ActiveCell.Value = ActiveCell.Offset(1).Value Then Range(ActiveCell, ActiveCell.Offset(1)).Merge End If Next Application.DisplayAlerts = True End Sub

  • 簡素化

    よろしくお願いします 下記構文の簡素化ができないでしょうか。 Application.ScreenUpdating = False Dim r As Range Set r = ActiveCell.MergeArea r.MergeCells = False With Sheets("注文伺い書入力") ActiveCell.Offset(0, 21).Activate ActiveCell = "" ActiveCell.Offset(0, 2).Activate ActiveCell = "" ActiveCell.Offset(0, 1).Activate ActiveCell = "" ActiveCell.Offset(0, 1).Activate ActiveCell = "" ActiveCell.Offset(0, 1).Activate ActiveCell = "" ActiveCell.Offset(0, 1).Activate ActiveCell = "" ActiveCell.Offset(0, 1).Activate ActiveCell = "" ActiveCell.Offset(0, 1).Activate ActiveCell = "" ActiveCell.Offset(0, 1).Activate ActiveCell = "" ActiveCell.Offset(0, 1).Activate ActiveCell = "" ActiveCell.Offset(0, 1).Activate ActiveCell = "" ActiveCell.Offset(0, 1).Activate ActiveCell = "" ActiveCell.Offset(0, 1).Activate ActiveCell = "" ActiveCell.Offset(0, 1).Activate ActiveCell = "" ActiveCell.Offset(0, 1).Activate ActiveCell = "" ActiveCell.Offset(0, 1).Activate ActiveCell = "" ActiveCell.Offset(0, 1).Activate ActiveCell = "" ActiveCell.Offset(0, 1).Activate ActiveCell = "" ActiveCell.Offset(0, 1).Activate ActiveCell = "" ActiveCell.Offset(0, 1).Activate ActiveCell = "" ActiveCell.Offset(0, 1).Activate ActiveCell = "" ActiveCell.Offset(0, 1).Activate ActiveCell = "" ActiveCell.Offset(0, 1).Activate ActiveCell = "" ActiveCell.Offset(0, 1).Activate ActiveCell = "" End With r.MergeCells = True Application.ScreenUpdating = True