Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(指定なし : 指定なし)
Application.SendKeys "^f" に引数を渡したい
投稿日時: 22/09/01 18:06:05
投稿者: taichi

「すべて検索」を利用したいので、
Application.Dialogs(xlDialogFormulaFind).Show ではなく
Application.SendKeys "^f" 
( CommandBars.FindControl(ID:=1849).Execute )
を利用しています。
 
セルの内容が完全に同一であるものを検索する etc を
事前に設定したいのですが、マクロではセル選択のみしか記録されません。
 
宜しくお願いいたします。
 
参考になるサイトを教えて頂いても結構です。
 

回答
投稿日時: 22/09/01 20:04:11
投稿者: simple

どうしてもマクロということなら、
CommandBars.FindControl(ID:=1849).Execute を実行したあと、
SendKeysメソッドを使ってオプション指定するのでしょうか。
 
対象となる文字列はどうやって指定する予定なのでしょうか?
最初に INPUTBOXかなにかで変数に入れるのでしょうか?
そして、そのあとで検索ダイアログに渡すといったことですか?
 
ご自分でトライしてもらえればよいと思いますが、英数文字はOKですが、
日本語のような2バイト系文字は、うまくSendKeysに渡せないようですね。
 
# 個人的な感想ですが、仮にできたとしてもマクロにする効果は余りないように思います。
# 地道に手で指定するのが安定していて簡便だと思います。

回答
投稿日時: 22/09/01 20:32:33
投稿者: WinArrow
投稿者のウェブサイトに移動

Sendkeys には、引数はありません。
  
素直に
>Application.Dialogs(xlDialogFormulaFind).Show 
を使うことをお勧めします。
  
  
どうしても、Sendkeysを使わなくていけないのですか?
 
検索した後、何をするのかに依存しますが、
別な解決策を検討することもあり・・・・かと思います。

回答
投稿日時: 22/09/01 21:12:45
投稿者: simple

「すべて検索」を手軽に使いたい、ということなんでしょうけど、
あなたにとって、マクロにする必要性がどのあたりにあるのか、
後学のために教えてください。
 
どうしてもマクロでというなら、以下のような方向しかないと思いますが、
余りお薦めできるものではありません。
(というか、日本語文字列の場合は動作しないです。文字化けします)
 

Sub test()
    Dim searchStr$
    searchStr = InputBox("検索文字を入力")
    
    CommandBars.FindControl(ID:=1849).Execute
    Application.SendKeys "%N", True
    Application.SendKeys searchStr, True
    
    Application.SendKeys "%T%O", True
            '完全一致オプションの操作
            'ただしトグルなので、反対の状態になる恐れがある
    Application.SendKeys "%I"   'すべて検索の実行
End Sub

Application.SendKeysは動作が安定しないので、これに頼るのは極力避けるべきでしょう。
 
「すべて検索機能」は手作業を前提としたサービス機能でしょう。
これに相当するVBAのメソッド等は聞いたことがないです。
 
大量の文字列を繰り返し使って、
すべて検索する必要があるなら、
その道具にこだわらず、別途、ご自身でマクロを書くのがよいでしょう。
 
単に一回の検索であれば、(比較的気の利いたインターフェイスを持った)現行のものを、
ありがたく使うのが相場でしょうね。

回答
投稿日時: 22/09/02 08:39:30
投稿者: simple

回避的な対応策としてSendKeysを利用した方法を書きましたが、
いえいえそんなこと質問してないです、全く違います、ということなんでしょうか?
 
質問に直接、お答えしておきましょう。
 
●Application.Dialogs(xlDialogFormulaFind).Show というのは、
  一世代前のいわゆる組み込みダイアログです。
  これについては、たしかに既定の引数を指定する仕組みがありました。
 
●しかし、現在使われている Ctrl+Fで表示されるダイアログは、
  上記と異なる体系のものです。
  それを実行するには、
  CommandBars.FindControl(ID:=1849).Execute
  または、
  CommandBars.ExecuteMso "FindDialogExcel"
  といったコードを使います。
 
  これらのメソッドでは、引数の指定はできない仕組みだと思います。
  少なくとも、MS社の提供するヘルプにはそうした記載はありません。
  https://docs.microsoft.com/ja-jp/office/vba/api/office.commandbars.executemso
 
  もっとも、Office Fluent ユーザー インターフェイスをカスタマイズして
  機能を追加したりということができるのかもしれませんが、
  少なくとも私は余り見たことが無いですね。
  「すべて検索」の前提を固定するといった話題では、
  SendKeysの利用(それも余り安定してはいない)がもっぱらでした。
   
  この機能はインタラクティブ性を前提としたものです。
  ・入力に各種のパラメータ指定ができ、
  ・出力は独自のWindowです(ジャンプ機能もついた優れものですね)
  これをさらにVBAから操作するってどういうこと?というのがMS社の見解なんでしょう。
 
もし、お望みのようなことができるならTipsとして流通するはずですが、
少なくとも私は目にしたことがありません。

回答
投稿日時: 22/09/02 10:09:05
投稿者: Suzu

他の回答者の方々もおっしゃっていますが、他の方法を検討された方が良いと思います。
 
「全て検索を使いたい」と言うことは
・一覧として確認したい
・複数のシートが存在する
のだと思いますが
 
検索を使うのに、Ctr+F で良いですから、
検索したい文字を予めクリップボードにコピーしておき、Ctr+F で検索を表示し、張り付ければ 良いです
 
これをを VBA で実現させる には SendKey が主体とならざるを得ず 不安定になります。
それであれば、手動で良い様に思いますが、いかがでしょうか。
 
 
代案としては
・条件付き書式を使用し、セルを目立たせる
 
・新たなシートに、Filter関数や、LOOKUP系関数や、MATCH/INDEX関数 を使い 一覧を表示させる
 
・VBA の Find/FindNext メソッド を使い、
 新たなシートに ヒットしたセルの シート/アドレス を記入し、必要なら、そこに ハイパーリンクを設定
 
あたりでしょうか。

回答
投稿日時: 22/09/02 15:38:38
投稿者: gombohori

 こんな感じでしょうか

 Sub sample()
    Dim clip As New DataObject
    clip.SetText "検索文字列"
    clip.PutInClipboard
    SendKeys "^f^v"
 End Sub

回答
投稿日時: 22/09/02 15:42:32
投稿者: gombohori

オプションの表示がトグルなので、1回できても次ができないです。
うまくいきませんね
 

gombohori さんの引用:
こんな感じでしょうか
 Sub sample()
    Dim clip As New DataObject
    clip.SetText "検索文字列"
    clip.PutInClipboard
        SendKeys "^f%t%o^v"
 End Sub

回答
投稿日時: 22/09/02 18:57:15
投稿者: simple

うーん、確かに。
Sendkeysはキーを引数にとるのであって、私のコメントは、あるまじきコメントでした。
失礼しました。
 
検索文字列が固定ならマクロに埋め込めますが、
そうでなければその都度入力させることになり、
ますます現行の手作業と余り変わりないことになりそうに思います。
 
# 前の質問も、コンボボックスのドロップボックスを自動で操作するというものでしたが、
# 同様の傾向の質問でしたね。
# ものごとを複雑にするだけですから、デフォルトのまま使うのがよいと思いました。
# 今回の質問も同様の回答ということになります。

投稿日時: 22/09/03 14:50:05
投稿者: taichi

学校における生徒情報管理のファイルを扱っています。
同じ姓の検索などで該当のする生徒全員を調べたり、住所で「丁目まで」の検索をしたりします。
 
どうしても「一覧として確認」(シート内)する必要があるので
CommandBars.FindControl(ID:=1849).Execute で
検索すると、どの先生がしても簡単に検索(毎回手動で)出来きそうだったので、
Application.SendKeys "^f" 選択したのです。
しかし、オプションの選択によっては「見つかりません」となるで、
引数を与えることができればと思いました。
 
皆様方の大方の意見としては、SendKeys の使用は懐疑的なよういなので、
 Find/FindNext メソッド を使い、ListBoxにAddItemで登録して
クリックで該当行に飛ぶように変更していきたいと思います。
 
皆様方、色々参考になる回答をいただきありがとうございました。