お世話になります。
VBは学校で半年かじっただけの初心者です。
よってちぐはぐな点があるかもしれませんが
お許し下さい。
エクセルで住所録を作ったとします。
別にVBのフォームで検索窓を作り、そこに単語を記入してボタンを押すと
下の表示窓にエクセルの中の該当する行が出てくる、という
ことは果たして可能でしょうか。
もし可能でしたら、そのプログラムを公開している
サイトを教えて頂きたく思います。
もしそれが無理でしたら、
住所録のデータをボタンを押せば検索できるシステムというのは
どのようにすればできるでしょうか。
HTML化して検索となるのでしょうか。
Excelでのフィルタなどではなく、ボタンを押して出てきて欲しいんです。
どんな些細なことでもいいので書きこみお願い致します。
ポイントはきちんと発行致します。
よろしくお願い致します。
No.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
nishi6さん、どうもありがとうございます。
コードまで載せて頂き、感謝しております。
前述の通り、仕事が忙しいため取り組む時間が取れません。
1週間以内に補足させて頂きます。
ありがとうございました。
No.4
- 回答日時:
打ち込んだ言葉に対する行を表示させるだけなら
VBを使わなくてもVBAだけで十分表示可能です。
たとえばseet1のA1のセルに入れた言葉を
seet2のb列の中から選んで、その当てはまる行を
seet1のA3からの行に表示させるだけなら
if文を使った数行のプログラムでできるはずです。
オートフィルのように該当するものを順番に表示することも
そんなに大変ではありません。
みなさんがいうとおり、VBからだと結構めんどくさいですよ。
もしどうしてもVBである必要が無ければVBAだけで
すませた方が簡単です。
Kawa-Gさん、どうもありがとうございます。
御礼が遅くなり申し訳ありません。
御指摘のとおり、VBAですることにします。
仕事が突然忙しくなったので、取り組む時間が取れません。
1週間以内に補足させて頂きます。
ありがとうございました。
No.3
- 回答日時:
【方針】
・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週間以内に補足させて頂きます。
ありがとうございました。
No.2
- 回答日時:
質問を読んで、ずばり解答する力のない小生の感想です。
(データとその構造)
プログラムを考えるとき、データを読み書きする必要がありますが、既にあるファイルを利用する時は、そのデータのファイル構造を理解せねばなりません。ソフトを利用するだけの場合、ほとんどの場合不要に見えるのは、利用者には不必要と、アプリが隠しているからです。
(ディスク記録データ)
コンピュター(ディスク)に、或るデータ(ファイル)が有るとします。
ディスク上に書かれたフォーマット(フィールドの表現やレコードの終わりなどの決め、プロパティ表現など)は、ソフトに依ってまちまちで、通常は自社発注し、仕様書文書を貰うケース以外は知り得ません。
エクセルの場合は相当複雑だと推定しますし、逆解析して発表した記述も見たことがありません。一般には判らないと言うことです(但しエクセルワークシートデータを直接読みこめるソフトも相当あり、マイクロソフト以外で知っている技術者もいることは確かです。)
(内部記録形式)
ディスクからデータを読んで、コンピュターメモリー上に展開する場合、ディスク記録データと同じとは限らず、これも公開されていません。(エクセルのウインドウが開かれた状態の内部記憶状態です。)ディスク記録形式よりさらに複雑でしょうし、他のプログラムから割り込んで利用することはできません。
(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週間以内に補足させて頂きます。
ありがとうございました。
No.1
- 回答日時:
えっと、まず確認です。
VBでエクセルのファイルを検索というのはかなり難しいです、事実上不可能です。そうではなく、エクセルに内蔵されているVBAを使うと言うことですよね。VBAを使えば問題なく可能です。
VBAはおわかりですか。
次に質問への回答ですが、質問自体が概念的なので回答が難しいです。
>HTML化して検索となるのでしょうか。
なんてことをしなくても、エクセルのVBAでご希望通りのことができます。
アルゴリズムはおわかりですよね。順番に比較するだけです。
VBがおわかりでVBAが初めてと言うことでしたら、こんなことをしてみてください。
まず、エクセルを立ち上げ、ツール-マクロ-新しいマクロの記録、でOKを押します。すると小さなウインドウが表示されますが、無視して何か操作します。たとえばセルに色を付けたりします。そして先ほどのウインドウの■ボタン(記録終了ボタン)を押します。
次に、ツール-マクロ-マクロ、で編集を押します。するとVBと似たような画面が現れます。中を見ると先ほどの操作をVB(VBA)で表現するとどうなるのかがわかります。これを改造して試してみると理解が早いです。
これで少し試してから、具体的に質問されれば回答がすぐ付くと思います。現状の質問ですと回答が難しいです。
k-familyさん、どうもありがとうございます。
御礼が遅くなり申し訳ありません。
アドバイスに感謝致します。
仕事が突然忙しくなったので、取り組む時間が取れません。
1週間以内に補足させて頂きます。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- Excel(エクセル) マクロVBAのフォルダ階層別で検索の方法 4 2022/04/03 23:23
- Excel(エクセル) 【Excel】指定のセル内容を基に別シートのセルを検索して選択する【VBA】 1 2022/06/16 16:16
- Access(アクセス) Accessで予定表を作成しようとしてます。 テーブル フィールド名 連番 オートナンバー型 年月日 2 2023/07/23 11:40
- Visual Basic(VBA) Excel VBAのリストボックスの値を他のフォームに反映させる方法を教えてください。 2 2023/07/14 14:06
- Visual Basic(VBA) 検索のユーザーフォームの表示について 1 2023/03/27 23:31
- JavaScript javaScriptで画面に値を入れるには 1 2022/08/14 12:27
- メルカリ <メルカリShops>消費者庁による販売許可の出ている機能性表示食品?の調べ方から 1 2022/11/24 17:46
- Excel(エクセル) 指定値をマクロで検索&シート移動 2 2022/04/27 23:29
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
VBからEXCELのセルの値を取得する方法
Visual Basic(VBA)
-
ExcelデータをVB.netで検索する方法
Visual Basic(VBA)
-
vb.netからエクセル関数書き込み
Visual Basic(VBA)
-
-
4
【VB.NET】Excelの最終行までの取得方法
Microsoft ASP
-
5
VB.NETでマウスクリックイベントを発生させたい。
Visual Basic(VBA)
-
6
VB.netでのExcelデータの読み込み
Visual Basic(VBA)
-
7
vb.netによるEXCEL値取得
Microsoft ASP
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「Nullの使い方が不正です」の...
-
VBAでアクセスDBからデータの取...
-
Excel VBAでグループ毎に集計す...
-
エクセルデータをVBで検索でき...
-
batでレジストリキーから読み取...
-
エクセルのCSV読み込みについて
-
【C#】textBoxの指定行のデータ...
-
VB6のMsFlexGridコントロールに...
-
COBOL数値転記の仕様
-
VBAの問題がわからないのでどな...
-
【VB.NET】Excelの最終行までの...
-
access vba 『○○件づつ表示』を...
-
VB2005 で NetworkStream で取...
-
java / jsp selectedについて
-
【ExcelVBA】値を変更しながら...
-
Excel VBAでフォルダ内の全テキ...
-
MSFlexGrid 行選択状態
-
エクセルのセル最終行取得
-
Excel VBAでXML形式のデータを...
-
VBAコンボボックスの内容が反映...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【C#】textBoxの指定行のデータ...
-
VBAでアクセスDBからデータの取...
-
「Nullの使い方が不正です」の...
-
XMLでデータとして画像を指定す...
-
VBAコンボボックスの内容が反映...
-
C# DataTableに最後に追加した...
-
【ExcelVBA】値を変更しながら...
-
【VB.NET】Excelの最終行までの...
-
COBOL数値転記の仕様
-
Excel VBAでフォルダ内の全テキ...
-
富士通(汎用機)のAIMについて
-
MSFlexGrid 行選択状態
-
Excel VBAで1週間毎にカテゴリ...
-
access vba 『○○件づつ表示』を...
-
Excel VBA で日付を4ケタの数値...
-
Excel VBAでグループ毎に集計す...
-
java / jsp selectedについて
-
ExcelVBAで戻り値を返すには
-
batでレジストリキーから読み取...
-
エクセルVBA WEBからデータ取...
おすすめ情報