[[20200116073745]] 『イミディエイトウィンドウのクリア(VBA)につきまax(すす) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『イミディエイトウィンドウのクリア(VBA)につきまして』(すす)

お世話になります

件名:
イミディエイトウィンドウのクリア(VBA)につきまして

クリア方法の2種類を質問1、2にしました。
1の案は一行で短いので解決できればと思います。
もし、解決ができれば2の案としました。

1の案:
Application.SendKeys "^g ^a {DEL}" の所を一度、中断(ブレーク)します。
中断しましたらF8キーで継続(ステップ)しますとイミディエイトウィンドウはクリアされます。
※中断をF5キーで継続しますとイミディエイトウィンドウはクリアされませんでした。

質問1
Application.SendKeys "^g ^a {DEL}"  
一行で短いのF8キーで中断(ブレーク)しないでイミディエイトウィンドウがクリアできればと思います。
※Excel2019 64bitを使用しています。OS Windows10

参考サイト
excel - Use VBA to Clear Immediate Window? - Stack Overflow
https://stackoverflow.com/questions/10203349/use-vba-to-clear-immediate-window

動作確認環境
Excel2016 16.0.7571.7063 64bit

2の案:
http://hasikure.blogspot.com/2016/12/excel2016.html

Set wd = Application.VBE.Windows("イミディエイト")の所で以下のエラーになります。
         ↓
実行時エラー '1004':アプリケーション定義またはオブジェクト定義のエラーです。

質問2
定義のエラーになるのか分かりません。
※「Microsoft Visual basic for Application Extensibility 5.3」にチェックを付けました。
※Excel2019 64bitを使用しています。OS Windows10

以上につきまして、宜しくお願い致します。

< 使用 Excel:Excel2019、使用 OS:Windows10 >


 直接の回答ではありませんので、スキップいただいて結構です。

  不安定なSendkeysを使用しない案を参考までに。

  Sub test()
      With Excel.Application.VBE
          .MainWindow.Visible = True
          With .Windows.Item("イミディエイト")
              .Visible = True
              .SetFocus
          End With
          .CommandBars.FindControl(msoControlButton, 756).Execute
          .CommandBars.FindControl(msoControlButton, 478).accDoDefaultAction
      End With
  End Sub

  実行に際しては、
  Excelのオプション − トラストセンター
   − トラストセンターの設定
    VBAプロジェクト オブジェクトモデルへのアクセスを信頼する にチェックを入れる
  必要があります。

  なお、
  (1)この設定はマクロウイルスに対して脆弱なので実行後元に戻すべきという意見と、
  (2)そういうコードでCtrl+A Deleteを代替するのは開発者だけだろうから、
     さほど心配することもないという意見
  があるようです。

  私はそもそも、コードの実行の前に、手でCtrl+A Deleteすることで十分というアナログ派です。 

(γ) 2020/01/16(木) 09:39


γさん

ご返答して頂きまして、ありがとうございました。

1の案:
Application.SendKeys "^g ^a {DEL}"  
一行で短いのF8キーで中断(ブレーク)しないでイミディエイトウィンドウがクリアできればと思います。

自分なりにイミディエイトウィンドウがクリアされない理由が分かりました。

理由:
推測になりますが、F8キーではイミディエイトウィンドウ 選択状態ですがF5キーではイミディエイトウィンドウが選択できなくなったと思われます。
そこでApplication.SendKeys "^g ^a {DEL}" の前に[ イミディエイトウィンドウ ] を選択する [ Ctrl ] + [ G ] ボタンApplication.SendKeys "^c ^g"を追加しましたらイミディエイトウィンドウがクリアできました。
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
(1)この設定はマクロウイルスに対して脆弱なので実行後元に戻すべきという意見と、
(2)そういうコードでCtrl+A Deleteを代替するのは開発者だけだろうから、
さほど心配することもないという意見があるようです。
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
イミディエイトウィンドウの使用は作成者ですので、それほど心配の必要は無いと思われました。
情報提供は参考にさせてもらいます。感謝申し上げます。

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
私はそもそも、コードの実行の前に、手でCtrl+A Deleteすることで十分というアナログ派です。
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
そうですか、はい分かりました。

自分なりにクリアされない理由が分かりましたので解決と致します。

ありがとうございました。

(すす) 2020/01/16(木) 11:04


解決されたようですが、確認のため。

| そこでApplication.SendKeys "^g ^a {DEL}" の前に[ イミディエイトウィンドウ ] を選択する [ Ctrl ] + [ G ]
| ボタンApplication.SendKeys "^c ^g"を追加しましたらイミディエイトウィンドウがクリアできました。

今のコードでも、Ctrl+g は命令を送っているわけですが、
その前に重ねてやらないとダメということなんですか?

SendKeysはタイミングに依存するのでハンドリングが難しい側面があります。
私の提示したものは、SendKeysを使わずに実現できるはずです。

(γ) 2020/01/16(木) 13:29


γさん

度重ね、ご返答して頂きまして、ありがとうございました。

| そこでApplication.SendKeys "^g ^a {DEL}" の前に[ イミディエイトウィンドウ ] を選択する [ Ctrl ] + [ G ]
| ボタンApplication.SendKeys "^c ^g"を追加しましたらイミディエイトウィンドウがクリアできました。

| 解決されたようですが、確認のため。
はい、済みません。解決出来ていませんでした。

| そこでApplication.SendKeys "^g ^a {DEL}" の前に[ イミディエイトウィンドウ ] を選択する [ Ctrl ] + [ G ]
| ボタンApplication.SendKeys "^c ^g"を追加しましたらイミディエイトウィンドウがクリアできました。
イミディエイトウィンドウがクリアされた後にイミディエイトウィンドウに指定セルデーターが一瞬表示されますが、即イミディエイトウィンドウがクリアされます。
Application.SendKeysをkeybd_eventに変更して試しても同じく一瞬表示されますが、即イミディエイトウィンドウがクリアされます。
調べていますが分かりません。

| SendKeysはタイミングに依存するのでハンドリングが難しい側面があります。
はい、keybd_eventも同じくタイミングに依存するのでハンドリングが難しいものと考えました。

| 私の提示したものは、SendKeysを使わずに実現できるはずです。
はい、以下で試しました。トラストセンター (セキュリティセンター)初めて知りました。
使い方、説明、誤りがありましたら申し訳ありません。

手順1:

Excel2019 Excelのオプション − トラストセンター − トラストセンターの設定 − マクロの設定 − [開発者向けのマクロ設定] VBAプロジェクトオブジェクトモデルへのアクセスを信頼するにチェックを入れました。

Sub test()

      With Excel.Application.VBE
          .MainWindow.Visible = True
          With .Windows.Item("イミディエイト")
              .Visible = True
              .SetFocus
          End With
          .CommandBars.FindControl(msoControlButton, 756).Execute        '※1             
          .CommandBars.FindControl(msoControlButton, 478).accDoDefaultAction
     End With
  End Sub

Private Sub CommandButton8_Click()

  test

手順2:

CommandButton8_Clickを実行しますと以下の様になりました

 ※1 .CommandBars.FindControl(msoControlButton, 756).Executeの実行後   
イミディエイトウィンドウの上のウィンドウがCommandButton2に変わりウィンドウ全部が範囲選択されました。

済みません。お手数をお掛けしております。
(すす) 2020/01/16(木) 16:28


すまない、私の手元ではそうしたことが再現できないので、わかりません。
なぜコマンドボタン2が出てくるのか意味がわかりませんし、
力不足です。
どなたかコメントがあれば進むかもしれませんが、私ができるのはここまでです。
(γ) 2020/01/16(木) 16:52

γさん

ご返答をして頂きまして、ありがとうがざいました。

| すまない、私の手元ではそうしたことが再現できないので、わかりません。
いいえ、こちらこそ申し訳ありませんでした。

| 私はそもそも、コードの実行の前に、手でCtrl+A Deleteすることで十分というアナログ派です。
私も、コードの実行の前に、手でCtrl+A Deleteすることにします。

知らないことを、ご指導してもらい色々お世話になりました。深く感謝申し上げます。

すす
(すす) 2020/01/16(木) 17:03


Yさん

訂正、お詫び申し上げます。

訂正:
各ボタン毎に設定しますと※1は発生しませんでした。
| ※1 .CommandBars.FindControl(msoControlButton, 756).Executeの実行後 イミディエイトウィンドウの上のウィンドウがCommandButton2に変わりウィンドウ全部が範囲選択されました。
イミディエイトウィンドウのクリアとデータ表示を同時に考えていましたのでCommandButton1にしました。
仕様なのかよく分かりませんがCommandButton1にしますとVBEのイミディエイトウィンドウがクリアされデータ表示しますが即、表示が消えます。

以下の様にイミディエイトウィンドウのクリア及びデータ表示を各ボタン毎に設定しますと問題なくイミディエイトウィンドウがクリアされました。

    With Excel.Application.VBE

          .MainWindow.Visible = True
          With .Windows.Item("イミディエイト")
              .Visible = True
              .SetFocus
          End With
          .CommandBars.FindControl(msoControlButton, 756).Execute 
          .CommandBars.FindControl(msoControlButton, 478).accDoDefaultAction
     End With

Private Sub CommandButton1_Click()
CommandButton2_Click()'イミディエイトウィンドウのクリア
CommandButton3_Click()'イミディエイトウィンドウに指定セルデータ表示
End Sub

Private Sub CommandButton2_Click()
'イミディエイトウィンドウのクリア

          With Excel.Application.VBE
          .MainWindow.Visible = True
          With .Windows.Item("イミディエイト")
              .Visible = True
              .SetFocus
          End With
          .CommandBars.FindControl(msoControlButton, 756).Execute 
          .CommandBars.FindControl(msoControlButton, 478).accDoDefaultAction
     End With

 End Sub

Private Sub CommandButton3_Click()
'イミディエイトウィンドウに指定セルデータ表示

                Dim SS(10) As String
                Dim S As String
                Dim II As Long
                Dim III As Long

                    S = Range("C984").Value

                Debug.Print " ";

                Debug.Print S
                Debug.Print " "; "HEX →"; " ";

             For II = 1 To Len(S)

                     SS(II) = Mid$(S, II, 1)
                     Debug.Print Hex(Asc(SS(II))); " ";

             Next II

                Debug.Print vbLf; " DEC →";

                          For III = 1 To Len(S)

                     SS(III) = Mid$(S, III, 1)
                     'Debug.Print vbLf;

                      Debug.Print Asc(SS(III));

             Next III

             Debug.Print vbLf
End Sub

(すす) 2020/01/17(金) 08:06


追加分です。

テストで試しました。
Private Sub CommandButton1_Click()
CommandButton2_Click()'イミディエイトウィンドウのクリア
CommandButton3_Click()'イミディエイトウィンドウに指定セルデータ表示
End Sub

実際は以下の様に使用していました。
     ↓
Private Sub CommandButton8_Click()
イミディエイトウィンドウのクリア

     ・
     ・
     ・
イミディエイトウィンドウに指定セルデータ表示
     ・
     ・
End Sub

(すす) 2020/01/17(金) 09:00


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.