Excel (VBA)

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

 
(指定なし : 指定なし)
Ctrl+F にActiveCell値をsetして「全て実行」ボタンを押す
投稿日時: 19/10/30 12:04:54
投稿者: taichi

Ctrl+F にActiveCell値をsetして「全て実行」ボタンをおすところまでまでVBAで
命令したいのですが、
CommandBars.FindControl(ID:=313).Execute を試して見たのですが、
置換タブが開いたときに優先されていますし値を引き渡す方法も分かりません。
またできれば検索タブのみの状態のほうがありがたいです。
 
Application.Dialogs(xl…).Show arg1:=ActiveCcell.Value のような書き方で
初期値を引き渡せたらいのですが、可能でしようか?
よろしくお願いいたします。

回答
投稿日時: 19/10/30 12:56:11
投稿者: simple

「すべて検索」ですかね。
こんな感じですか?

Sub test()
    Dim s As String
    s = ActiveCell.Value
    CommandBars.FindControl(ID:=1849).Execute
    Application.SendKeys s, True
    Application.SendKeys "%I", True
End Sub
補足:
(1)SendKeysを使うので、動作が安定しないリスクがあります。無保証。
(2)VBE画面上から実行すると、VBE画面に文字を打ち込んでしまう可能性があります。
   ワークシートをアクティブにした状態でマクロを実行してください。

投稿日時: 19/10/30 13:36:39
投稿者: taichi

シートのボタンにテストマクロを登録して
実行しましたが、セル値(文字)が字化けしました。
いざとなったら、ActiveCcell.Value をクリップボードに
貼り付けておきます。
ところで、ID:=1849 はどのように調べればよいのでしようか?
ID:=313 とでは開いたときの優先タブが変わっていますよね。
勿論」、私としては ID:=1849 のほうが良いです。
 
ひょっとして、検索タブのみの ID もあるのでしようか?
それがベストなのですが。

回答
投稿日時: 19/10/30 14:24:01
投稿者: simple

検索しました。
下記に一覧があります。
https://www.ka-net.org/office/of02.html
 
そうでした。SendKeysは漢字が送れないのでした。
"aaa" でテストしていたので、気づきませんでした。
これもネットで調べると(たいていのことはネットで調べればでてきますねww)、
いったんクリップボードに送ってから、
SendKyes "^v" でコピーペイストなんだそうです。
 
クリップボードに送る方法は、
ActiveXコントロールのテキストボックスにおいて
そのオブジェクトのCopyメソッドを実行するというTipsを想い出しました。
昔回答に使ったことがあります。
一応動作をするようにはなりましたが、いかにも大仰ですよね。
 
何かDataObjectオブジェクトを使うとできると思いますが、そちらでも検討してください。
一応、途中経過だけ書いておきます。

Sub test()
    Dim s As String
    s = ActiveCell.Value
    setCopy s
    Application.SendKeys "^v", True
    CommandBars.FindControl(ID:=1849).Execute
    Application.SendKeys "%I", True
End Sub
順序がおかしいように感じますが、これでOKです。動作しています。
setCopyプロシージャは、再考中です。

投稿日時: 19/10/30 14:45:52
投稿者: taichi

setCopy s で引っ掛かります

回答
投稿日時: 19/10/30 15:02:07
投稿者: simple

回答をよく読んでください。

回答
投稿日時: 19/10/30 17:38:50
投稿者: simple

コードだけに飛びつくんじゃなくて、
> 下記に一覧があります。
> https://www.ka-net.org/office/of02.html

などについてもコメントして欲しい。
 
さて、続きは、
アクティブセルのテキストをクリップボードにコピーする必要があるという話でした。
 
そこで、記憶を頼りに、"DataObject VBA"で検索すると、例えば、
「クリップボードを操作する(1)」
http://officetanaka.net/excel/vba/tips/tips20.htm
のような記事が見つかりました。
 
これをそのまま使って、以下のようにsetCopyプロシージャを再作成しました。

Function setCopy(s As String)
    'Microsoft Forms 2.0 Object Libraryを参照設定すること
    Dim CB As New DataObject
    With CB
        .SetText s          ''変数のデータをDataObjectに格納する
        .PutInClipboard     ''DataObjectのデータをクリップボードに格納する
    End With
End Function
これで、私の手元では動作することが確認できました。
 
----------------------
【追記】
これで終了、やれやれと思い、
参考記事では、clip.exeを使ってどうたらとあったので、
RangeオブジェクトをCopyするのでは当然ダメなんだろうと、決め込んでいましたが、
念のため試してみたら、なんと、単純なコピーでうまくいくじゃないですか。
 
Sub test()
    ActiveCell.Copy
    Application.SendKeys "^v", True
    CommandBars.FindControl(ID:=1849).Execute
    Application.SendKeys "%I", True
End Sub

これだけでOKのようです。
 
臭い芝居のような感じですが、回答にあたってどんな作業をしているかを
知ってもらいたいと思い、書いて見ました。
 
実際のところ、すべて手作業でやってもさほど負荷があるわけでもなく、
・アクティブセルをコピーして、
・それを「検索する文字列」ボックスに貼付け、
・「すべて検索」ボタンをクリックする
だけですから、軽減効果はどの程度あるんでしょうか。
頻度にも依存しますが。
 
そんな話もありますが、回答をきちんと読んで、試してみてください。
参考になれば幸いです。

投稿日時: 19/10/30 18:18:27
投稿者: taichi

simple さん ありがとうございました。
ほぼ希望がかなえられました。
 
参考文献のHP助かります。