- ベストアンサー
Excel VBAでワークシートがアクティブにならない問題
- VBAでGOM Playerを操作するマクロを作成中ですが、Excelのワークシートがアクティブにならない問題に遭遇しました。
- 現在再生中のシーンをExcel上で自動的に表示させるプログラムを作成中ですが、Excelシートがアクティブにならず、セルが選択されません。
- セル選択が表示されない以外は正常に動作しており、試したセルを手動で選択すると正常に動作することが確認されています。原因と対策をご教示いただけると助かります。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
GOMプレーヤーが起動された事により、EXCEL自身が非アクティブになってしまうのが原因でしょう。 Worksheets("aaa").Activate の直前に AppActivete Application.Caption により、EXCELをアクティブにすれば >Excelの最上部のタイトル部に表示されているファイル名がグレーになっている状態なので選択セルが表示されないようで って事も起きないでしょう。 てゆ~か、こういう「リアルタイム処理」は「Application.OnTimeメソッド」を使いましょう。 セルの表示をアップデートするルーチンを「MyDisplayUpdate」って名前で作って、MyDisplayUpdateの一番最後に Application.OnTime Now + TimeValue("00:00:01"), "MyDisplayUpdate" と書いて「1秒後に自分自身を呼ぶ」ってやれば、1秒間隔でMyDisplayUpdateが自動的に実行されます。 ***注意*** 1秒間隔でMyDisplayUpdateが自動的に実行された時「今アクティブなブック」や「今アクティブなブック内のシート」や「今アクティブなセル」が何処になっているか判りません。 もしかしたら、アクティブな物が無いかも知れません。 なので、タイマーで呼ばれる関数内は、必ず「ブックやシートやセルは明示的に指示」しないといけません。
その他の回答 (3)
- NotFound404
- ベストアンサー率70% (288/408)
評価版(試用版)でためしたところ・・・。 Win7 & Excel2013(評価版) Gomのバージョンが最新版でも、2.1.25でも×。 デザインモードを終了すると 文字化けのメッセージ、バッテンで閉じると その後で空白の空白のメッセージ。 まったく機能せず。 Accessで使用中の自作アプリでも同様。 Win8.1Update & Excel2013 (両者とも評価版) もっと悪化して デザインモードを終了したとたん Excel(Access)が動作停止→強制終了でした。 (ここであっさりと諦めました。) 余計なお手間をとらせたようですみません。 以下、蛇足の独り言。 Gomは各方面?と色々通信しているようで http://hide.maruo.co.jp/software/netmon.html のhmnetmon103_signed.exe で確認できます。 そろそろ、お別れかなと思っています。 再生するだけなら色々とフリーでもありますが http://www.gigafree.net/media/qonoha.html が良さそうな気がします。 けど、VBAから操作したりActiveX Controlで埋め込んだり 出来るちょうど良いのが、なかなか見つからない。。
お礼
やっぱりダメでしたか。 確認して頂きありがとうございました。 いろいろ通信しているのは怖いですね。 注意して使っていこうと思います。 ありがとうございました。
- NotFound404
- ベストアンサー率70% (288/408)
回答じゃありません。 (余計なお世話の気がしますけど。。) 開発タブから挿入、ActiveXコントロールの右下のアイコンから コントロールの選択で GomPlayerX Control を選択し シートに張り付け。 (デザインモードでは見えません(当方の環境では)) プロパティを見るとデフォルトでオブジェクト名がGomX1 とかになっています。 セルF1に動画のパス C:\Windows\winsxs\amd64_microsoft-windows-videosamples_31bf3856ad364e35_6.1.7600.16385_none_51a21f033003affd\Wildlife.wmv G4~G8まで経過秒数 標準モジュールに 'ミリセカンドで停止 Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Gomコントロールを貼り付けたシートのモジュールに Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Dim rNo As Variant Cancel = True If IsNumeric(Target.Value) Then GomX1.CurrentPosition = Target.Value Exit Sub End If GomX1.URL = Target.Value GomX1.Play 'GomX1.CurrentPosition = 5 Do Until GomX1.GetPlayState = 2 Sleep 1000 Range("f2") = GomX1.CurrentPositionString Range("G2") = GomX1.CurrentPosition Debug.Print GomX1.CurrentPosition, Application.Match(Int(GomX1.CurrentPosition), Range("G4:G8"), 1) rNo = Application.Match(Int(GomX1.CurrentPosition), Range("G4:G8"), 1) If IsError(rNo) Then rNo = 0 End If Range("G3").Offset(rNo, 0).Select DoEvents 'Debug.Print GomX1.GetPlayState, rNo Loop End Sub としてデザインモードを終了します。 Gomコントロールが見えるようになりますので セルF1をダブルクリックしたり 再生中にG4~G8のセルをダブルクリックしてみてください。 なお、当方の環境 Win7 64bit 、Excel2010 32bit、Gomバージョン2.1.25 5015(Unicode) では再生ボタン一回目は正常に表示されますが 停止して二回目の再生ボタンでは画像が乱れました。 セルF1のダブルクリックでは正常に再生されます。 暇がありましたら試してみても良いかも?
お礼
NotFound404様 コントロールの中に「GomPlayerX Control 」なんて言うのもあったのですね。 知りませんでした。 Excelの中で動かせればいいなと思っていましたので、早速使ってみようと思ったのですが、「GomPlayerX Control」を置くと、リソース不足でExcelが停止してしまいます。 ググっても何も出てきませんでした。 Windows8でメモリも8GB積んでいるので、なぜ?と言うところです。(Excel2013) 動くならチャレンジしてみたい内容だったので、残念です。 もし原因等ご存知でしたらお教えいただけますでしょうか。 よろしくお願いします。
- chie65536(@chie65535)
- ベストアンサー率44% (8752/19860)
>これは1秒以下のタイミングでコントロールできるのでしょうか。 OnTimeは「システム時計が、指定した時計シリアル値になったら呼ぶ」なので、時計シリアル値の精度と、システム時計の精度に依存します。 時計シリアル値は、1日未満(時、分、秒)は「小数点」で持っているので、そんなに精度は高くないでしょう。せいぜい「ミリ秒」までが実用範囲です。 また、システム時計は、ハードウェアやOSに依存する部分なので、1/100秒が最小だったり、1/000秒が最小だったり、1秒が最小だったりします。 シリアル値で1秒は「1 / 24 / 60 / 60」ですから Now + 1 / 24 / 60 / 60 / 10 とかって指定をすれば「0.1秒ごと」も不可能ではありません(が、余り精度が良くないし、「再入(関数から抜ける前に時間が来てしまって2重に関数に入ってしまうこと)」の問題も起きます。 まあ、再入が起きると「呼ばれるばかりで関数から抜けてこない」ので、あっと言う間に「スタックオーバーフロー」で例外停止しちゃいますが。
お礼
chie65535さん 早速の回答ありがとうございました。 1秒以下の入力もできるんですね。 「おっ、それならできそうかな」と思ったのですが 「再入」と呼ばれる問題も起きるんですね。 これがどこかのHPに書いてあった「連続呼び出しができない」と言うことの 理由なんですね。 納得できました。 いろいろと教えていただきありがとうございました。
お礼
chie65535さん 教えていただきありがとうございました。 うまく動きました。 以前使ったことが有ったような…程度の記憶しかないコマンドでした。 確かに言われるようにどの画面がアクティブになっているかわからないのでこのコマンドは結構必要性が高いですね。 勉強になりました。 Application.OnTimeの方も取り入れてプログラムを組んでみようかと思ったのですが、これは1秒以下のタイミングでコントロールできるのでしょうか。また連続呼び出しができない(精度が無い?)などの記述も見受けられましたので、とりあえず前のままのプログラムでやっています。 ありがとうございました。