• 締切済み

Excel VBA組み込みダイアログボックス

Excel2002で、あるセルに入力した文字列をキーワードに、複数のワークシートを検索、検索結果表示を「編集」-「検索」-「すべて検索」をクリックしたように一覧表示したい。 組み込みダイアログボックスを使い、VBAを次のように記述しましたが、表示されるウィンドウに「すべて検索」の表示は無く、「次を検索」しかできません。 組み込みダイアログボックスの引数に何か指定すれば「すべて検索」が可能になるのでしょうか? それとも、組み込みダイアログボックスを使うことが間違っているのでしょうか? よろしくお願いします。 Public Sub Kensaku() '変数の宣言 Dim strKeywords As String Dim vntShar As Variant '検索したい文字列を変数Keywordsに取得 strKeywords = Range("B4").Value '左から2番目、3番目、4番目のワークシートを選択 vntShar = Array(2, 3, 4) Sheets(vntShar).Select '検索ウインドウを開いて検索を実行 Application.Dialogs(xlDialogFormulaFind).Show (strKeywords) End Sub

  • a88
  • お礼率33% (1/3)

みんなの回答

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんにちは。Wendy02です。 返事が遅くなりました。 >キーワードは、Sheet1のB4セルでは駄目なのでしょうか? うまく行きませんでしたか? ちょっと気になるのは、  strKeywords = Range("B4").Value ここは、シート名が入っていませんが、本当によいのでしょうか? 通常は、ボタンがあるところですが、コードがちょっと不安ですね。  strKeywords = Worksheets("Sheet1").Range("B4").Value と明示的に、指定して、もう一度#1のコードを試してください。 次に、それがダメでしたら、外部から送ることにします。 Sub TestSample2()   Dim strKeywords As String   Dim vntShar As Variant   vntShar = Array("Sheet2", "Sheet3","Sheet4")   Sheets(vntShar).Select   strKeywords = Sheet1.Range("B4").Value   SendKeys "^f"   CreateObject("Wscript.Shell").SendKeys strKeywords   CreateObject("Wscript.Shell").SendKeys "{Enter}" End Sub

  • matsu_jun
  • ベストアンサー率55% (146/265)
回答No.2

a88さん、こんにちわ。 a88さんのおっしゃっている検索ダイアログとは、Excel2002から追加になったものと存じます。 また、コード内に記述したダイアログ定数 xlDialogFormulaFind はそれ以前のものです。 従って、xlDialogFormulaFindに何かしらのオプションを加えることで「すべて検索」を 表示させることはできないと思います。 Excel2002から追加になった検索ダイアログは、ダイアログを表示させながらシート操作ができる 「モードレスダイアログ」というものですが、どうやらDialogsの引数には存在しないようですね。 Excel2000(モードレス検索ダイアログの無いバージョン)からExcel2002(あるバージョン)に 上がった際に、VBAのメインバージョンが上がっていない(共にVer.6.xx)ことから考えると VBAから件のダイアログを表示させるのは難しいと思うのですが。 (ちょっとWebで調べてみたところでは存在しませんでした。) モードレスのユーザーフォームを作成し、御自分で同様な機能を持つものを作成するしかないかも 知れません。

a88
質問者

お礼

matsu_jun さん 検索ダイアログボックスで「すべて検索」は無理だとわかりました。ありがとうございます。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

こんにちは。 最初に、基本的なことなのですが、 >'検索ウインドウを開いて検索を実行 >Application.Dialogs(xlDialogFormulaFind).Show (strKeywords) >End Sub これでは、VBAが終われないのではありませんか? 検索ができるようには思えません。この先をどうするか、ということだと思います。 >vntShar = Array(2, 3, 4) >Sheets(vntShar).Select それから、これは出来ますか?Sheets のIndex に配列は利かないように思いますが? 最後に、 Public Sub Kensaku() どうして、Public ステートメントが必要なのですか?標準モジュールに書けば、規定値としてPublicプロシージャなのですけれども。 サンプルを考えてみました。ボタンなどにマクロを取り付けてください。なお、検索で見つからなかったときは、メッセージをはきだして、検索ダイアログ自体の有効性を失います。 Sub TestSample()   Dim strKeywords As String   Dim vntShar As Variant   vntShar = Array("Sheet2", "Sheet3","Sheet4")   Sheets(vntShar).Select   strKeywords = Range("B4").Value   SendKeys "^f"   SendKeys strKeywords End Sub 通常は、このようなマクロは作りません。Findメソッドを使います。Findメソッドは、戻り値が、オブジェクトなので、オブジェクトのあるなしは、Nothing で分りますから、解除できます。

a88
質問者

補足

Wendy02さん 早速の回答ありがとうございます。 初心者の為、めちゃくちゃな質問をしていたようで、すみません。 サンプルのマクロで、SendKeysの存在を知りました。 このサンプルを使いたいのですが、どうもキーワードの選択がうまくいきません。 キーワードは、Sheet1のB4セルでは駄目なのでしょうか?

関連するQ&A

  • Excel VBAの組み込みダイアログについて

    ExcelのVBAの組み込みダイアログで、 Application.Dialogs(xlDialogInsertPicture).Show についてですが、ヘルプの組み込みダイアログボックス引数一覧をみると xlDialogInsertPicture file_name、filter_number とあります。 これは、ダイアログボックスの図の挿入で、ファイル名とファイルの種類の引数になると思いますが、 ダイアログボックスの右上に表示される、表示の縮小表示を選択することってできるのでしょうか?また、ファイルの場所の指定ってできるのでしょうか?どなたか、詳しい方いらっしゃいましたら教えてください。よろしくお願いいたします。

  • エクセルVBAの「組み込みダイアログボックス」の使用法?

    いつもありがとうございます。 組み込みダイアログボックスについて教えてください。 エクセルのシート内容をCSV形式で保存する場合、組み込みダイアログボックスを使い、下記のマクロでうまく行きました。 Sub CSV保存() '~略~ Application.Dialogs(xlDialogSaveAs).Show ARG2:=6 '~略~ End Sub 試した結果、上記の組み込みダイローグのファイルの種類のデフォルトは ARG2:=の次の値が6でcsv、1でエクセルになるようでした。 次に、エクセルを開いた状態でCSVファイルを開こうと思い、同様に組み込みダイアローグを使用するため下記のマクロを作りました。ところがうまくいきません。 Sub CSVdata取得() Application.Dialogs(xlDialogOpen).Show ARG2:=6 End Sub ・・・・と記述するとエラーになります。 この場合、どうも ARG2:=6の6の数字のところが4以上はエラーとなるようです。 ARG2:=の次の値を1~3にするとエラーにはなりませんが、デフォルトはいずれもエクセルでした。 最初からファイルの種類をCSV形式にするにはどう記述したらよいのでしょうか? どうかお助けください。

  • エクセルVBA・リストボックスに関する質問です。

    エクセルVBA初心者です。 作成したワークシート名をVBAにてリストボックス内に表示し、それを選択するとそのシートに飛ぶようにしています。 ------------------- Private Sub ListBox1_Change() With ListBox1 Worksheets(.ListIndex + 1).Activate End With End Sub ------------------- Private Sub UserForm_Initialize() Dim wsSheet As Worksheet For Each wsSheet In Worksheets ListBox1.AddItem wsSheet.Name Next wsSheet End Sub ------------------- これではすべてのシートがリストボックス内に反映される為、反映させたくないシート(3シートあるのですが)も一緒に表示されてしまいます。 この表示させたくないシートをリストボックス内に表示させない事は可能でしょうか? 又、できるとしたら、どんな言語を使用すれば良いのでしょうか? ご教授お願い致します。

  • VBAで特殊文字を出力したい

    VBAで「"」を出力したいと思っているのですが、 なかなかうまく表示させることができません。 ○サンプルコード Sub SpecialCode() Dim name As Variant name = "ABC"   Cells(1, 1) = name MsgBox name End Sub サンプルコードのname変数を name = ""& "ABC" ""& としても、ワークシートのA1やmsgboxのダイアログ上には ABC と表示されてしまいます。 "がエスケープ文字で、出力する特殊文字の前につければ 表示されることを調べたのですが、なかなかうまくできない状態です。 ワークシートのA1やmsgboxのダイアログ上には "ABC" と表示される手順を教えていただければと 思っております。 以上です。

  • エクセルVBA Dialogsheetについて

    何をいまさらダイアログシートなどとおっしゃらないで下さいませ。 今現在表示されているダイアログシートの名前を取得したいのです。 たとえばワークシート上にフォームのボタンを配置し、ボタンに以下のマクロを登録しておけば正しくシート名を返します。 Sub test01() MsgBox ActiveSheet.Name '1 MsgBox ActiveSheet.Shapes(Application.Caller).Parent.Name '2 End Sub ところが同じボタンをDialogsheetに配置し、そのダイアログを DialogSheets("Dialog1").Show  で、ワークシート上に表示した段階でボタンをクリックすると、1.ではワークシート名が帰り、2ではシート名が違うのでエラーになってしまいます。 (ワークシートをアクティブにしないで、ダイアログシート上で右クリックして「ダイアログの実行」でダイアログを表示させれば1,2ともにDialog1とDialogSheet名を返しますが) もちろん以下のようにDialogsheet名を明記すれば正しく返りますが、Application.Callerからダイアログシートの名前を取得したいのにDialogsheet名を明記するのでは無意味です。 Sub test02() MsgBox ActiveSheet.Name '1 MsgBox DialogSheets("Dialog1").Shapes(Application.Caller).Parent.Name '2 End Sub 何か良い方法はないでしょうか? 現在はやむをえずダイアログを表示させる際、以下のように変数に格納していますが、これもApplication.Callerからダイアログシートの名前を取得するにはあまり意味がないように思います。 Dim DS Sub D1_Start() DS = "Dialog1" DialogSheets("Dialog1").Show End Sub Sub test03() MsgBox ActiveSheet.Name '1 MsgBox DialogSheets(DS).Shapes(Application.Caller).Parent.Name '2 End Sub エクセル2000です。 宜しくお願いします。

  • VBAで困っています。

    VBAで比較ツールを作っています。2つのワークシートを比較し、同じセルの位置にある値を比較し、値が異なっていれば色を変えるというものです。行をキー(1行、2行、3行・・・)として2つのワークシートですべてのキー行のセルの値が一致する列同士を比較する方法があるのですが、キーを1個でも100個でも指定した場合のプログラム構造を知りたいのです。 お力をお貸しください。 Sub DF() Dim Before As Range Dim After As Range Before = Worksheets("Sheet1").UsedRange.Value After = Worksheets("Sheet2").UsedRange.Value キーとなる行数をカウント   カウントした行を最大値を変数に設定   ・・・・   ・・・・   ・・・・ End Sub

  • エクセルVBA 別シートからのコンボボックス連動

    エクセルVBA 別シートからのコンボボックス連動について Book1(多人数入力用ブック) ・入力シート ・データ用シート Book2(反映用ブック) ・シート1 Book1にコンボボックスが2列 テキストボックスが2列 * 6行のユーザーフォームを作成しました。 コンボボックス1 コンボボックス2 テキストボックス1 テキストボックス2 コンボボックス3 コンボボックス4 テキストボックス3 テキストボックス4 ・ ・ ・ 左のコンボボックスで「あ」が選ばれたときには、右のコンボボックスで「あ行の顧客」・・・というように連動させたいと考えております。 データ用シートのデータは、   A      B          C 1 あ あ行で始まる顧客 か行で始まる顧客 2 か 3 さ 4 た 5 な 6 Private Sub UserForm_Initialize() Dim c As Range ComboBox1.RowSource = "データ用シート!A1:A9" End Sub Private Sub ComboBox1_Change() 'Dim Rng As Range 'Dim i As Long i = ComboBox1.ListIndex If i > -1 Then Dim c As Range Set Sh = Worksheets("データ用シート") Set Rng = Worksheets("データ用シート").Range("B2:I30") ComboBox2.Value = "" ComboBox2.RowSource = Rng.Columns(i + 1).Address End If End Sub 上記コードですと、コンボボックス2が入力シートのデータを表示してしまいうまくいきません。 欲をいえば、 Book1(多人数入力用ブック)入力シートの特定セルに コンボボックス2・テキストボックス1 コンボボックス4・テキストボックス3というように続けて1セルに反映 Book2(反映用ブック)シート1に コンボボックス2・テキストボックス1・テキストボックス2 を各1セル 1行に反映させたいと考えております。 まったく知識がないのですが 仕事上どうしても必要となったので、各種サイトを見よう見真似でやっております。 ご助力いただければ幸いです。

  • エクセルVBA シート名の部分一致検索について エクセル2007

    VBAでエクセルの全シート名を部分一致で検索したいと考えています。 そこで以下のコードを書いたのですが、 インプットボックスにどんな文字列を入力しても全てのシート名を 取得してしまって途方にくれています。 どなたかお助けください。 Sub test01() Dim name As String Dim ws As Worksheet shn = InputBox("検索文字列を入力") For Each ws In ThisWorkbook.Worksheets If ws.Name Like " * " & name & " * " Then ws.Activate MsgBox ws.Name End If Next ws End Sub

  • エクセルVBAコンボボックスについて

    リスト欄のセルA3から下方向に大分類(A16まで14種類)があります。 コンボボックス1に大分類をリスト化して選べるようにしたいと思っています。 しかし、(1)のようにVBAを記入して、マクロを実行すると、コンボボックス1には、 大分類で14個あるリストの4つしか出てきません。 -(1)(抜粋)--------------------------------------------------------- Private Sub UserForm_Initialize() Dim MyVar1 As Variant MyVar1 = Sheets("リスト").Range("A3:A" & Range("A3").End(xlDown).Row) ------------------------------------------------------------------ (2)のように記述してマクロを実行すると、コンボボックス1には、14個全てが表示されます。 -(2)(抜粋)--------------------------------------------------------- Private Sub UserForm_Initialize() Dim MyVar1 As Variant MyVar1 = Sheets("リスト").Range("A3:A16") ------------------------------------------------------------------ 原因がわかる方、いらっしゃいませんか? 出来れば、リスト欄のA列は14個よりも増える可能性があるので、Range("A3:A" & Range("A3") .End(xlDown).Row)のような範囲の指定がしたいです。 なお、リストシートのA3を選択して、「Ctrl+↓」でA16が選択されました。

  • 【エクセルVBA】「ファイルを開く」のダイアログボックスの後に文字を追加したい

    【エクセルVBA】で、「ファイルを開く」の操作を複数回するので、 ダイアログボックスに例えば「ファイルを開く:ABC」というよう に、「ファイルを開く」の後に文字を追加したいのですが、 どうすれば良いでしょうか。 現在、下記のようなマクロですが、具体的にどうすれば良いか教えて下さい。 宜しく、お願いします。  Dim fname1 As String  fname1 = Application.GetOpenFilename( _    filefilter:="すべてのファイル,*.*")  If fname1 = "False" Then Exit Sub

専門家に質問してみよう