• ベストアンサー

ExcelVBA初心者

いろいろとVBAサイトやQ&Aサイトを見ましたがあまりこれというのがなかったので質問させてください。 社員名簿を作成しているのですが、登録用フォームと検索用フォームの2つのユーザーフォームを使いデータを検索、入力ができるようにしたいのです。 登録用フォーム…ID、名前、生年月日、性別、住所を登録し、データ入力用シートへ転記する(登録用フォーム内には登録ボタンのほか、新規ボタン、データ訂正用ボタン、検索ボタンを配置する) 検索用フォーム…ID、名前、生年月日、性別、住所どれからでも絞込み検索ができるようにし、さらに絞り込んだリストを選び「選択して登録フォームへ」ボタンを押すと登録用フォームへジャンプし直接そのデータの書き換えができるようにしたい 形はできてきたのですがどうしてもわからず煮詰まってしまいました。 検索用フォームに配置したリストボックスの値のひとつを選び「選択して登録フォームへ」ボタンを押すと登録用フォームには飛ぶのですがどうやったらリストボックスで選択したデータがでてくるのかということです。 もしお分かりになられましたら教えてください。お願いします。

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

  • ベストアンサー
  • onlyrom
  • ベストアンサー率59% (228/384)
回答No.5

もう見てないかもしれませんが。。 FoundDataRowを持ってくるところが抜けたましたね。(^^;;; ●「選択して登録フォームへ」ボタンクリックイベントコードです。 行番号用変数 : FoundDataRow 登録フォーム : UserForm1 名簿用シート : Sheet1 ListBoxの表示は複数列  1列目 : 名簿一覧シートの行番号  2列目 : ID  3列目 : 名前 以下、お気に召すまま(^^;;; '------------------------------------------ Private Sub CommandButton2_Click()  Me.Hide  FoundDataRow = ListBox1.List(ListBox1.ListIndex, 0)    With Sheets("Sheet1")     UserForm1.TextBox1 = .Cells(FoundDataRow, "A")     UserForm1.TextBox2 = .Cells(FoundDataRow, "B")      以下、必要な分だけ転記    End With  UserForm1.Show End Sub '------------------------------------------------- 標準モジュールに   Public FoundDataRow As Long '-------------------------------------------------   ListBox未選択などのエラー処理は省略。 それから、数万行程度のデータの処理であればExcelで十分お釣りがきますよ。 要はどう効率的なコードを書くかということだけです。   折角ですから、VBAをマスターしませう。 以上。  

blue_sky02
質問者

お礼

補足説明ありがとうございました。教えてもらったとおりに作ってみたところ、希望通りのものができあがりました。 多分、いや間違いなく一人ではできなかったと思います。 本当に本当にありがとうございました。

その他の回答 (4)

  • onlyrom
  • ベストアンサー率59% (228/384)
回答No.4

>検索用フォームに配置したリストボックスの値のひとつを選び「選択して登録フォームへ」ボタンを押すと登録用フォームには飛ぶのですが ということは少なくとも ListBoxを選択して「選択して登録フォームへ」ボタンを押す ところまではコードはできてるんですよね。 できてるということで話しを進めます。 ListBoxで選択したデータを「登録フォーム」に表示するためには 選択したデータが「名簿一覧シート」のどの行にあるのか 特定しなければならないことはお分かりだと思います。 特定するための方法はいつくかありますが、一番簡単な方法は ListBoxにAddItemするときに、必要項目だけではなく、データの行番号もとっておく方法です。 そして、「選択して登録フォームへ」ボタンを押したとき、(ListBoxで選択したときでもいい) そのデータ番号をとってきて変数にいれ(別に変数を使わなくてもいいが、使った方が便利) それを利用して「名簿一覧シート」からデータを引っ張り「登録フォーム」のテキストボックスに表示する。 簡単なサンプル。 行番号用変数 : FoundDataRow 登録フォーム : UserForm1 名簿用シート : Sheet1 With Sheets("Sheet1") Userform1.TextBox1.Value = .Cells(FoundDataRow,"A").Value Userform1.TextBox2.Value = .Cells(FoundDataRow,"B").Value  Userform1.TextBox3.Value = .Cells(FoundDataRow,"C").Value   以下、必要な分だけ転記 End With なお、行番号用変数 FoundDataRow は、Publicで宣言しておく。   以上。

blue_sky02
質問者

お礼

onlyromさん、とても細かくご指導いただきありがとうございます。 早速教えて頂いた通りやってみたいと思います。身近にVBAを聞ける方がおらず一人で行き詰っていました。本当にとてもありがたいです。 また、カテゴリ違いにもかかわらず皆さん親切に回答してくれるんですね!すごく感動しました!!!

noname#221368
noname#221368
回答No.3

>ここはVisualBasicのカテゴリですし  まぁ~、いいじゃないですか。Visualな開発環境でBasicを使い、Applicationを作成すると考えれば、VBもVBA(?)ですので~~。  方針は3つあると思います。 (1)ExcelのSheetは、Cellに読み書き出来るだけの、でっかい表示用コントロールと割り切って使用する。データの検索などは、全データを配列などに読み込み、配列の検索機能も自前で書く。Applicationスタイルとしては明解ですが、非常に手がかかる。 (2)Excelの機能を可能な限り利用する。例えば、検索データのCell位置などは、最初にAuto Filter機能をマクロ記録で書かせて、自分の目的に合うようにチューニング,一般化する。Excelの機能が、思ったほど言う事をきいてくれないのと、機能のヘルプの解析に不要な手間がかかるのが欠点。また非常に細かいコードの積み重ねなりやすく、メンテ,デバックが大変。 (3)本当のData Baseを使用する。結局やってみると、(1)にも(2)にもなる。でも、これから始めるのだったら、これでもいいかも。ExcelもAccessもVBAの基本は同じですし、Accessは、VBAの使用を前提に作られている製品だと思えます(使わないやり方も可能ですが)。  ふつうは、(1),(2),(3)のどこかで妥協します。

blue_sky02
質問者

お礼

とても細かくご指導いただきありがとうございます。いろんな本を見ながらやっていたつもりですが、VBAは奥が深いですね。 皆さんのご意見を聞いていると一般的にこういうことはAccessの方が向いているのですね。私自身Accessはまだまだ不勉強ということもあり、今度そちらの方でもやってみようと思います。 また、初めて投稿し不慣れな為、カテゴリ違いすみませんでした。 皆さんの様々な意見を参考にもう一度がんばって取り組んでみたいと思います。

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.2

#1さんの回答に近いかも知れませんが、質問内容から察するに Accessの方が向いているのでは?と感じます。 Excelとmdbをつないで行なうって方法も検討済みでしたでしょうか? ”う~ん、ここでVBAをあきらめてしまうのは惜しいのです。” との事ですが、ここはVisualBasicのカテゴリですし。

blue_sky02
質問者

お礼

そうなんですね、やはり一般的にこういうことはAccessの方が向いているのですね。私自身Accessはまだまだ不勉強ということもあり、今度そちらの方でもやってみようと思います。 また、初めて投稿し不慣れな為、カテゴリ違いすみませんでした。 皆さんの様々な意見を参考にもう一度がんばって取り組んでみたいと思います。

回答No.1

お役に立つか判りませんが、私も同じようにエクセルで住所管理簿を作ろうとした経験がありますが、このようなフォームを作成して管理簿を作るのであれば、Microsoft Accessを使用されると簡単だと思います。Microsoft Accessは難しい!と思われるかもしれませんが、望まれているDB等は書店で売っている本に作り方が書いてあります。具体的な本は判りかねますが、しばらく見てると見つかると思います。

blue_sky02
質問者

お礼

う~ん、ここでVBAをあきらめてしまうのは惜しいのです。(一応少しできてきたところなので…)やはりエクセルで名簿を作るのは初心者にはむずかしいのでしょうか?本などいろいろ見ましたが、もう少しがんばってやってみようと思います。ご回答ありがとうございました。参考にさせていただきます。

関連するQ&A

  • EXCEL ユーザーフォームを使ったマクロ

    データの登録をするのにユーザーフォームを使おうと思うのですが、なかなかうまくいきません。教えてください。 ユーザーフォームにはコンボボックス、テキストボックス、コマンドボタンが貼り付けてあります。(コンボボックスのリストには呼び出したいシートの名前が入っています) コンボボックスのリストの中から呼び出したいシートを選択し、テキストボックスに入力した内容を、コマンドボタンを押すことで選択されたシート上の、あるセルに登録したいのですがどうすればよいでしょうか?

  • ExcelVBAでユーザーフォームが勝手に閉じてしまいます。

    ExcelVBAでユーザーフォームが勝手に閉じてしまいます。 ExcelVBAを独学で始めてまだ2週間足らずの超初心者です。 Excelワークシートにコマンドボタン配置してそのコマンドボタンを押すとユーザーフォーム1が開き、ユーザーフォーム1に配置してあるリストボックスからリストをダブルクリックで選択すると、ユーザーフォーム2が開くように設定しています。ただ、ユーザーフォーム1のリストをダブルクリックして選択した時点でユーザーフォーム1が勝手に閉じてしまいます。ユーザーフォーム1を勝手に閉じさせないでコマンドボタンで閉じるようにしたいのですがどうしたらよいのでしょうか。レベルの低い質問かもしれませんが困っています。宜しくお願い致します。

  • accessのフォームで参照しながら入力

    access初心者です。教えてください。 今、以下のようなテーブルがあるとします。 TBL_A ID,名前,TEL,FAX TBL_B ID,顧客ID,年月日,メモ 新規でTBL_Bのデータを追加するときにリストボックスから顧客を選び、年月日とメモを入力するフォームを作成しています。 このときにリストボックスより選択後、年月日とメモを入力するテキストボックス等の横に該当顧客の直近(TBL_Bの該当顧客の年月日が最新のもの)のデータを表示したいです。 要するに前回のデータを見ながら入力したいです。 表示はテキストボックスでもラベルでもかまいません。 実際には項目数は20個程度あります。 VBAでもかまいません。どのような方法があるでしょうか? 教えて頂きたいです。

  • 【ACCESS】リストボックスに抽出してからテキストボックスに代入するには?

    ACCESS2003、初心者です。 医療事務のデータベースを作っています。 予約フォーム(frm予防接種予約)を作っていますが、次の(1),(2)の作業がうまくできなくて困っています。 (1)リストボックスへの抽出(検索ボタンを押すまではリストボックスの中は空の状態) frm予防接種予約のフォームで非連結テキストボックスに生年月日を入力して、検索ボタンを押す ↓ tbl患者個人票テーブルの生年月日と一致するレコード(氏名や住所)をリストボックスに表示させたい。 (2)表示されたリストボックスの中のレコードをクリックすると、そのレコードが氏名や住所に代入される。 一連の作業をfrm予防接種予約フォーム上で行いたいのですが、どのようにしたら良いのでしょうか?

  • ACCESSでコンボボックスからの入力でリスト外の追加をフォームを使っ

    ACCESSでコンボボックスからの入力でリスト外の追加をフォームを使って登録 ACCESSのフォームを使ってデータ入力を作成しています、"顧客名"をコンボボックスを使って選択するようにしていますが。 リスト外の新規顧客を入力する際には別の"顧客登録"フォームが開いて、顧客情報(読み仮名、顧客名、都道府県コード、所在地)を入力して、閉じると登録した"顧客名"がコンボボックスから選択できるようにしたいと思い、マクロを使用して(VBはよくわからないので) イベント→リスト外入力時→”顧客登録”フォームが開く 必要事項を入力し、閉じるボタンをクリック。 してみたのですが、コンボボックスのリストに先に入力した新規データが出てきません。 何が足りないのかご教授お願いいたします

  • ACCESSのマクロを使った抽出について

    質問をさせてください。 私は今、アクセス2002を使ったデータベース管理をしています。 そこで、データベースを検索方式でレポート形式表示しようと思い、フォームに抽出するテキストボックスとボタンを作りました。 その抽出するためのボタンに仕込んだマクロ「フォームを開く」のWHEREに [名前] Like "*" & [Forms]![フォーム]![テキストボックス] & "*" と入力して使っています。一応動きますが抽出できるのは1項目のみです。 このままでは使いにくいので、抽出する条件を複数指定して抽出をしたいと考えているのですが どうも上手く行きません。専門に扱っている本にも詳しくはのっていませんでした。 そこで ---------------------------------- 名前[テキストボックス1] 住所[テキストボックス2]         [ボタン] ---------------------------------- というようなフォームで、 レポート中の名前に○○を含み、 なおかつ住所に○○を含むデータを1度の検索で抽出するには どうしたら良いのでしょうか。 そして、もうひとつ。 同じようなものなのですが、コンボボックスを使って性別の抽出を行おうと思っているのですが 男性女性全てを抽出するためにはコンボボックスの文字が"すべて"では上手く動きません。 原因は"すべて"というワードを性別が含んでないからなのですが "すべて"を指定した時、全ての性別を抽出するにはまくロにどういった命令を書けば良いのでしょうか。 よろしくお願いします。

  • Access2003でコンボボックスからデータを抽出したい

    自己啓発でAccess2003を勉強しています。 Access2003でコンボボックスで名前を選択して、データ(住所)を抽出したものをリストボックスに表示させたいのですがどこがまちがっているかわかりません。こんなことで3週間ぐらい悩んでいます。 回答またはアドバイスをお願いします。 もしくはもっと簡単なやりかたがあればお願いします。 (1)「氏名」、「住所」のテーブルを作成。テーブル名は「01データ」 (2)「氏名」、「住所」のクエリを作成。クエリ名は「クエリ1」 (3)フォームでコンボボックスとリストを作成。フォーム名は「印刷」 ⇒コンボボックスの名前は「検索」。 ⇒値集合ソースはSELECT [01データ].ID, [01データ].氏名 FROM 01データ; これで「氏名」が選択できた。 (4)クエリの「氏名」抽出条件にLike [forms]![印刷]![検索] (5)検索するマクロを作成。マクロ名「M検索」 アクションは 全レコードの表示 フィルタの実行 ⇒Where条件は[Forms]![印刷]![検索]=[クエリ1]![氏名] (6)マクロ「M検索」をコンボボックスのプロパティ「イベント」タブから変更時に設定する。 (7)フォーム「印刷」を開き、コンボボックスで氏名を選択すると『クエリ1!氏名』と表示されてしまいます。 (8)フォーム「印刷」のリストボックスは全レコードが表示されている。

  • インポートしたデータが検索でヒットしない

    登録名簿フォームにて コンボボックス→値集合ソース→クエリツールにて Noと名前と生年月日で情報を取ってくる検索ボックスを使用していました。 ある日インポートの機能を使用してインポートしたデータが その検索ボックスで引っかからないことに気付きデータを確認したところ 「確かにデータは格納されているけれども検索ボックスでは検索できない」 という現象になっていることが判明しました。 検索ボックスで対象データを検索した際のメッセージボックスには 「指定した項目はリストにありません。リストから項目を選択するか、リスト項目と同じテキストを入力してください。」 と出てきます。 名前を削除して再入力して保存してもNG コンボボックスを同じ条件で作り直してもNG クエリを使用したデータシートビュー等にはしっかりデータが出てくる そのためクエリツールにてテーブル参照部分をクエリ参照に作りかえたがNG ただし、 Noの検索窓もありますがそちらは問題なく使用できる。 何が原因なのかどうしてもわからずこちらに相談してみました。 もし何かヒントがありましたら是非お聞かせいただけると幸いです。 どうぞよろしくお願いいたします。

  • リストボックスから選択したデーターの一つだけを取得する

    VB5.0を使っています。 WIN2000です。 MDBとVBを使っています。 まず、顧客ID・顧客氏名・電話番号  この3つが1つのデータとして横並びの文字列で、リストボックスに表示されてゆきます。 リストボックスに表示したデータを選択し、その選択したデータの”顧客ID”だけを取り出して同じフォーム内のテキストボックスにいったん出し、そこから別のフォームに飛んでその”顧客ID”を元にデータの詳細を出す、といったものを作っていますが、 今のわたしの書いてるコードだけでは、何番の顧客IDを出しても、 別のフォーム(契約入力)に行くときには同じ1番の人のデータ詳細しか出ません。 「リストボックスから選択したデーターの一つだけを取得する」 には、どのようなコードを書けばいいか、教えていただけないでしょうか・・。 リストボックス(List1)から選択してテキストボックス(Text5)に取得する際にはすでに”顧客ID”だけを取り出したいのです。 今のコードでは、顧客ID・顧客氏名・電話番号 とすべてテキストボックス(Text5)にでてきてしまいます。 Private Sub cmnd2_Click()’選択ボタンclickでリストボックスのデータを取得。 Dim ListIndex As Integer Dim SelectedIndex As Integer Text5.Text = List1.List(List1.ListIndex)'→ここでリストボックスからデータを取得しています。 End Sub

  • Excel VBAについて質問です。

    VBA初心者です。 フォームを2つ作成しております。 1つはフォーム名[入力用] もう1つはフォーム名[要求元]です。 フォーム[要求元]はリストボックス[リスト]と コマンドボタン[入力]と[終了]があります。 リストボックスのデータはRowsourceでセル番地を直接指定してます。 フォーム[要求元]においてリストボックスでデータを選びコマンドボタン[登録]を押すと、 フォーム[入力用]のテキストボックスに代入する方法がわかりません。 どなたか御教授お願い致します。