- ベストアンサー
VBAで初歩的な質問です。ユーザーフォームについて。本文をご覧いただけないでしょうか?
お世話になります。 VBAで家計簿を作っております。 そこで、引っかかっている点があります。以下に記しますので、アドバイスをいただけないでしょうか? ユーザーフォームAとBとCがあります。詳細は以下です。 --- ユーザーフォームA・・・購入品の分類の登録画面 (例:「鉛筆」を購入したので、「筆記用具」で登録する) ユーザーフォームB・・・既に登録されてしまった場合に他の名前で登録するための"yes or No"画面 (例:例えば、「消しゴム」を買ったので「筆記用具」で登録しようと思ったが、既に登録されてしまっていた。そのため、他の名前(例:「文房具」)で登録するかどうか確認する ユーザーフォームC・・・他の名前で登録する場合の登録画面 (例:「消しゴム」を「文房具」で登録する) そこで質問なのですが、ユーザーフォームBでYesを選択した場合にユーザーフォームCを出したいのですが、(下記のソースはinputboxですが)msgbox.showを使うのでしょうか?いくつか試してみたのですが、「オブジェクトが定義されていない」とか「インデックスの範囲が有効ではない」とか、まだ初心者なせいもあり戸惑っています。 msgbox.showを使えばよいか?という聞き方自体、センスがないとは思いますが、何卒ご教示の程宜しくお願い致します。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
要するにマスター登録画面のようなものを作りたいのかな?と思い、サンプルを書いてみました。 少しでも参考になれば。 新規ブックで 1)UserForm1 に CommandButton を1つ置く 2)UserForm2 に CommandButton を2つとTextBox を1つ置く 3)標準モジュールを追加する 4)それぞれに下記コードをコピペする 5)ツール-マクロ-マクロで MainFormShow を実行 '******************UserForm1ここから************************** Private Sub UserForm_Initialize() Me.Caption = "メインフォーム" CommandButton1.Caption = "分類登録" End Sub Private Sub CommandButton1_Click() UserForm2.Show End Sub '**********************ここまで******************************** '******************UserForm2ここから************************** Private Sub UserForm_Initialize() Me.Caption = "分類登録" CommandButton1.Caption = "登録" CommandButton2.Caption = "キャンセル" End Sub Private Sub CommandButton1_Click() Dim cnt As Long If TextBox1.Text = "" Then Exit Sub With Worksheets("Sheet1") cnt = Application.WorksheetFunction.CountIf(.Columns(1), TextBox1.Text) If cnt = 0 Then .Range("A65536").End(xlUp).Offset(1, 0).Value = TextBox1.Text MsgBox "「" & TextBox1.Text & "」を登録しました", _ vbInformation + vbOKOnly, "登録完了" Else MsgBox "「" & TextBox1.Text & "」は既に登録済みです", _ vbCritical + vbOKOnly, "重複エラー" End If End With TextBox1.Text = "" TextBox1.SetFocus End Sub Private Sub CommandButton2_Click() Unload Me End Sub '**********************ここまで******************************** '******************標準モジュールここから********************** Sub MainFormShow() UserForm1.Show End Sub '**********************ここまで********************************
その他の回答 (3)
- imogasi
- ベストアンサー率27% (4737/17069)
実際のケースを、質問に出すために、家計簿に置き換えたのではないかと思います。 それで実例で言わんとすることが、判りにくくなってませんか。 #2でもおっしゃっている、「・・ためになぜ3つもユーザーフォームを使っているのか」ということと関連してると思いますが、構想そのものをベテランに質問してみてください。 もし思いつくままや、自分はそれしかできないということから、素人っぽい構想で、そのコーディング方法を聞いて実現しても、進歩がなく、使い勝手も悪いです。構想(デザイン・仕様)こそが大切です。 推測では、多段式絞り検索のことに行き着き、1フォームの複数の コンボボックスで実現することではないでしょうか。 >既に登録されてしまった場合に他の名前で登録 この必要性が、家計簿からは、なぜそうするかその理由が、イメージできません。
お礼
お礼が遅くなってしまい、大変申し訳ございません。 (本当にスミマセン・・・) 素人でコーディングしたのでこれで合っているのか不安でならないです。確かにベテランさんに聞きたいところですが・・・周りにベテランさんの知り合いがいない場合、どうなさっていますか?もしお知恵を拝借できるようでしたら、お勧めのサイトなど教えてくださらないでしょうか? 最後に返事が遅くなってしまい、申し訳ございませんでした。 これからも宜しくお願い致します。
- taocat
- ベストアンサー率61% (191/310)
こんにちは。 A,Bと同じにShowメソッドで表示すればいいのではありませんか? ---------------------------------- Case vbOK C.Show --------------------------------- >InputBox "新しいカテゴリーを入力してください" これはいらないのではありませんか? 新しい分類は、Userform C のTextBox等で登録するのですよね。 >「オブジェクトが定義されていない」とか「インデックスの範囲が有効ではない」 これは提示のコードのどの部分で出るのでしょうか。 そこらの情報も書いておくとより的確な回答が寄せられると思います。 それよりも何よりも気になったのは「分類登録」のためになぜ3つもユーザーフォームを使っているのかという点です。 以上です。
お礼
ご連絡が遅くなってしまい、大変申し訳ございません。 (本当にスミマセン) アドバイスをいただいた結果、何とか思うような家計簿ができそうです。 にもかかわらず、御礼が遅くなってしまいすみませんでした。 これからも宜しくお願い致します。
- jcn0221
- ベストアンサー率0% (0/1)
ソースを見せてもらえませんか?
補足
すみません・・・ Private Sub cmd_reg_Click() '登録を行う '動作チェック 未 'シート(category)参照し、"txt_reg_category"と照合 'なし→シート(category)へ登録/あり→登録できない '登録した場合は、「登録しました」を表示 Dim カテゴリー検索 As Range Dim 他のカテゴリー登録 As Long Set カテゴリー検索 = Worksheets("category").Columns("a").Find(txt_reg_category.Text) If txt_reg_category = "" Then Exit Sub If カテゴリー検索 Is Nothing Then Worksheets("category").Range("a65536").End(xlUp).Offset(1).Value = txt_reg_category txt_reg_category = "" MsgBox "新しくカテゴリーに登録しました", , "登録完了" Else 他のカテゴリー登録 = MsgBox("他のカテゴリーで登録しますか?", vbOKCancel, "既に登録されています") Select Case 他のカテゴリー登録 Case vbOK InputBox "新しいカテゴリーを入力してください" Case vbCancel MsgBox "トップメニューに戻る" End Select End If End Sub
お礼
御礼が遅くなってしまい、申し訳ございません。 (本当にスミマセン・・・) しかも、参考のコードまでアドバイスいただきありがとうございます。 このおかげで何とかうまくコーディングできました。 大変助かりました。 (にもかかわらず、お礼が遅くなってしまい、本当に申し訳ございません) これからも宜しくお願い致します。