• ベストアンサー

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