- ベストアンサー
エクセルデータをVBで検索できますか?
お世話になります。 VBは学校で半年かじっただけの初心者です。 よってちぐはぐな点があるかもしれませんが お許し下さい。 エクセルで住所録を作ったとします。 別にVBのフォームで検索窓を作り、そこに単語を記入してボタンを押すと 下の表示窓にエクセルの中の該当する行が出てくる、という ことは果たして可能でしょうか。 もし可能でしたら、そのプログラムを公開している サイトを教えて頂きたく思います。 もしそれが無理でしたら、 住所録のデータをボタンを押せば検索できるシステムというのは どのようにすればできるでしょうか。 HTML化して検索となるのでしょうか。 Excelでのフィルタなどではなく、ボタンを押して出てきて欲しいんです。 どんな些細なことでもいいので書きこみお願い致します。 ポイントはきちんと発行致します。 よろしくお願い致します。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
ExcelでSheet1のA、B列に文字列を入力したBookを用意。(下記例:VBopenExcel.xls) VBのフォームに、Commandボタンを1つ。TextBoxを2つ配置。 Command1で、『Text1に入力した文字』を『ExcelのSheet1のA列』で検索し、『検索結果セルの右のB列』をText2に表示するコードです。 下記のように問題なく書けます。余り複雑さも感じませんが・・・(VB6とExcel2000です) これと同じことをExcelのみで行えますが、ユーザーフォームを使えば、ほぼVBのコードと同じになってしまうでしょう。ただ、テキストボックスやラベルを使って、フォーム上にデータ内容を表示する場合は、VBAにはコントロール配列の機能がないため、工夫をしたり、さもなくば、コントロール分のコードを書く必要があります。 VBAで込み入ったフォームは作りたくありませんね。この辺はVBのほうが扱いやすいでしょう。 シート上で行うようにすると、シートの切り替え、処理のキッカケの決め方など別の問題も発生します。使い手側の事を考慮すれば、どちらが簡単(有効)かは一概に言えないでしょう。 データ量がわかりませんが、検索が主目的ならAccessを使うべきでしょうか。Excelで全てを作ると柔軟性に欠けると思います。 業務では、VBで扱うデータはAccess、ExcelやWordのデータが何割か占めます。敬遠しないでチャレンジしてみてはどうでしょうか。 ご参考に。 Public oExcel As Object 'Excel Public fndRows As Long '探すセル範囲の最終行 Public fndArea As Object '探すセル範囲 Private Sub Command1_Click() Dim findText As String '探す文字列(Text1に入力) Dim rg As Object '探し出したセル findText = Text1.Text 'シートを検索する Set rg = fndArea.Find(What:=findText, LookAt:=xlWhole) If Not rg Is Nothing Then Text2.Text = rg.Offset(0, 1).Value Else Text2.Text = "ありません" End If End Sub '*** Form呼び出し時の処理 *** Private Sub Form_Load() Set oExcel = CreateObject("Excel.Application") 'Excelを定義 With oExcel .Visible = False .Workbooks.Open ("D:\・・・\VBopenExcel.xls") '指定するBookを開く fndRows = .Worksheets(1).Range("A65536").End(xlUp).Row '最終行 Set fndArea = .Worksheets(1).Range("A2:A" & fndRows) '検索する範囲を決める End With End Sub '*** 終了 *** Private Sub Command2_Click() oExcel.DisplayAlerts = False 'メッセージを出さない oExcel.Quit 'Excel の終了 Set oExcel = Nothing 'Objectの開放 End End Sub
その他の回答 (4)
- Kawa-G
- ベストアンサー率50% (10/20)
打ち込んだ言葉に対する行を表示させるだけなら VBを使わなくてもVBAだけで十分表示可能です。 たとえばseet1のA1のセルに入れた言葉を seet2のb列の中から選んで、その当てはまる行を seet1のA3からの行に表示させるだけなら if文を使った数行のプログラムでできるはずです。 オートフィルのように該当するものを順番に表示することも そんなに大変ではありません。 みなさんがいうとおり、VBからだと結構めんどくさいですよ。 もしどうしてもVBである必要が無ければVBAだけで すませた方が簡単です。
お礼
Kawa-Gさん、どうもありがとうございます。 御礼が遅くなり申し訳ありません。 御指摘のとおり、VBAですることにします。 仕事が突然忙しくなったので、取り組む時間が取れません。 1週間以内に補足させて頂きます。 ありがとうございました。
【方針】 ・Excelのシートをそのまま扱うのは大変です。そのような事はExcelに任せることを前提に簡単なサンプルをお知らせします。具体的には、 1)VBからExcelを起動する。 2)VBからExcelに対して仕事を依頼する。 3)終わればExcelを終了させる。 と言う手順を踏みます。 【例】 '===== '= '=【目的】 '= このプログラムは、VBからExcelを起動して '= Textbox1とTextbox2の値をExcelに渡して '= Textbox3にそれらの加算結果を表示させます。 '= '=【VB側の準備】 '= 参照設定で、Microsoft Excel 9.0 Object Libray '= を使えるようにしておく。VerはExcelのVerで決まる。 '= '===== ' Private Sub Command1_Click() Dim X As Object Set X = CreateObject("Excel.Sheet") ' Excelが起動されて表示される。 X.Application.Visible = True ' Textbox1 の内容をCell(1,1)へ入れる。 X.Worksheets(1).Cells(1, 1).Value = Text1.Text ' Textbox2 の内容をCell(2,1)へ入れる。 X.Worksheets(1).Cells(2, 1).Value = Text2.Text ' Textbox3 に計算式を入れる。 X.Worksheets(1).Cells(3, 1).Formula = "R1C1 + R2C1" ' 結果をTextbox3へ持ってくる。 Text3.Text = X.Worksheets(1).Cells(3, 1) ' Excel を終わらせる。 X.Application.Quit ' Object の開放 Set X = Nothing End Sub 【最後に】 例示したプログラムは、VB4のマニュアルにサンプルとして載っていたものです。私の環境で動作することは確認しました。(Windows98,VB6,Excel9.0) この手の参考資料はVBならびにVBAのHELPが有力は情報源になります。書物ではソフトバンクの新VisualBasic入門シニア編 林晴比古著 にOLEの使い方の例として記述されています。完全な回答が出来ませんでしたが、参考にしてください。
お礼
741さん、どうもありがとうございます。 御礼が遅くなり申し訳ありません。 参考プログラムまで載せて頂き、大変ありがたく思っております。 仕事が突然忙しくなったので、取り組む時間が取れません。 1週間以内に補足させて頂きます。 ありがとうございました。
- imogasi
- ベストアンサー率27% (4737/17069)
質問を読んで、ずばり解答する力のない小生の感想です。 (データとその構造) プログラムを考えるとき、データを読み書きする必要がありますが、既にあるファイルを利用する時は、そのデータのファイル構造を理解せねばなりません。ソフトを利用するだけの場合、ほとんどの場合不要に見えるのは、利用者には不必要と、アプリが隠しているからです。 (ディスク記録データ) コンピュター(ディスク)に、或るデータ(ファイル)が有るとします。 ディスク上に書かれたフォーマット(フィールドの表現やレコードの終わりなどの決め、プロパティ表現など)は、ソフトに依ってまちまちで、通常は自社発注し、仕様書文書を貰うケース以外は知り得ません。 エクセルの場合は相当複雑だと推定しますし、逆解析して発表した記述も見たことがありません。一般には判らないと言うことです(但しエクセルワークシートデータを直接読みこめるソフトも相当あり、マイクロソフト以外で知っている技術者もいることは確かです。) (内部記録形式) ディスクからデータを読んで、コンピュターメモリー上に展開する場合、ディスク記録データと同じとは限らず、これも公開されていません。(エクセルのウインドウが開かれた状態の内部記憶状態です。)ディスク記録形式よりさらに複雑でしょうし、他のプログラムから割り込んで利用することはできません。 (VBでプログラムを組みエクセルデータを検索する) すなわちファイルフォーマット+プログラムスキルが必要です。 従って一般者向け基低的な意味では、不可能と言わざるを得ません。 (VBよりエクセルの世界へWarp) 但し、VBのプログラムより、エクセルを呼び出し、その世界に移り、多分エクセルVBAになると思いますが、エクセルの機能で検索し(例えばFindメソッド)、VBに戻り、検索結果をVBより利用する方法が果たして出来るでしょうか。 エクセルを呼び出すだけなら、Shell関数が有りますが、呼び出したあと、エクセルVBAの世界に乗り移るのは難しそうで、SendKeysなどで逃げている説明が多い。 これだとVBAで初めから組むのとあまり変わらず、メリットが少ない。 (ボタンやテキストボックスなど「コントロール」類もVBAで使えます。UserFormはどうすれば良いかわかりませんが、データのないワークシートの罫線や列行記号を取り除けば、それらしくなり、「台紙」としての役割をはたすでしょう。) VBなら出来て、VBAでは出来ない機能をぜひ使う必要があると見極めた時以外はメリットがない。 (低レベル共通標準形式CSVの存在) ただしCSV形式のフォーマットだけは、最低レベルの文字情報だけを表現・記録してくれるので、これに落として、VBの世界で検索をやるのは可能でしょう。(しかし手操作を介在させないのであれば、)やはりVBAを使うことになるでしょう。ファイル保存とVBでの読みこみに数10秒かかり、レスポンス性の点で考えにくい。 (市販ソフトの存在) VBよりエクセルワークシートデータを直接検索出来るソフトがあれば、それを使う手がありますが、発売元を探したり、コストの点から論外でしょう。 結局VBAで組まれてはどうでしょう。それ以外は難しそうです。
お礼
imogasiさん、どうもありがとうございます。 御礼が遅くなり申し訳ありません。 詳細に書いてくださり恐縮です。 参考にさせて頂きます。 質問の件ですが、仕事が突然忙しくなったので、取り組む時間が取れません。 1週間以内に補足させて頂きます。 ありがとうございました。
- k-family
- ベストアンサー率34% (180/523)
えっと、まず確認です。 VBでエクセルのファイルを検索というのはかなり難しいです、事実上不可能です。そうではなく、エクセルに内蔵されているVBAを使うと言うことですよね。VBAを使えば問題なく可能です。 VBAはおわかりですか。 次に質問への回答ですが、質問自体が概念的なので回答が難しいです。 >HTML化して検索となるのでしょうか。 なんてことをしなくても、エクセルのVBAでご希望通りのことができます。 アルゴリズムはおわかりですよね。順番に比較するだけです。 VBがおわかりでVBAが初めてと言うことでしたら、こんなことをしてみてください。 まず、エクセルを立ち上げ、ツール-マクロ-新しいマクロの記録、でOKを押します。すると小さなウインドウが表示されますが、無視して何か操作します。たとえばセルに色を付けたりします。そして先ほどのウインドウの■ボタン(記録終了ボタン)を押します。 次に、ツール-マクロ-マクロ、で編集を押します。するとVBと似たような画面が現れます。中を見ると先ほどの操作をVB(VBA)で表現するとどうなるのかがわかります。これを改造して試してみると理解が早いです。 これで少し試してから、具体的に質問されれば回答がすぐ付くと思います。現状の質問ですと回答が難しいです。
お礼
k-familyさん、どうもありがとうございます。 御礼が遅くなり申し訳ありません。 アドバイスに感謝致します。 仕事が突然忙しくなったので、取り組む時間が取れません。 1週間以内に補足させて頂きます。 ありがとうございました。
お礼
nishi6さん、どうもありがとうございます。 コードまで載せて頂き、感謝しております。 前述の通り、仕事が忙しいため取り組む時間が取れません。 1週間以内に補足させて頂きます。 ありがとうございました。