Excel VBAでワークシートがアクティブにならない問題

このQ&Aのポイント
  • VBAでGOM Playerを操作するマクロを作成中ですが、Excelのワークシートがアクティブにならない問題に遭遇しました。
  • 現在再生中のシーンをExcel上で自動的に表示させるプログラムを作成中ですが、Excelシートがアクティブにならず、セルが選択されません。
  • セル選択が表示されない以外は正常に動作しており、試したセルを手動で選択すると正常に動作することが確認されています。原因と対策をご教示いただけると助かります。
回答を見る
  • ベストアンサー

VBAでワークシートがアクティブにならない

ExcelからGOM Playerを動かすマクロを作っています。 VBAでGOM Playerを起動して、任意の場所から動画を再生するところまではできました。 動画のシーンがExcel上に時系列で記載されてあり、現在再生されているのがどこのシーンなのかを時間を追うごとに自動で移動していくプログラムを書いているのですが、Excelシートがアクティブにならない(?フォーカスが移らない)ため、セルが選択されて表示されません。 Excelの最上部のタイトル部に表示されているファイル名がグレーになっている状態なので選択セルが表示されないようで、一度手動でExcelを選択してあげると、ファイル名の表示が黒になり、セルも選択され、順次移動していくのが見られます。 また、ファイル名がグレーの状態でも数式バーにはその選択されているセルの内容が順次表示はされています。 つまり、セル選択が表示されない以外は正常に動いています。 プログラムの概略は下記の通りです。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) Set 指定セル範囲1 = Range("H2:J132") Set 共有セル範囲1 = Intersect(ActiveCell, 指定セル範囲1) If Not 共有セル範囲1 Is Nothing Then     途中省略(GOM Playerの起動プログラム)   Worksheets("aaa").Activate ddd:   VideoSelect = ・・・(ここで現在動画が再生されているセルの行数の計算をしている) Cells(VideoSelect, 11).Select     (再帰処理をしているため無限Loopにならないためのプログラムを挿入)     DoEvents   Sleep 100   GoTo ddd End If End Sub ワークシートをアクティブ、セレクト状態にするため下記のようなコマンドも入れてみましたがどうもうまく動きません。  Worksheets("aaa").Select  Workbooks("bbb.xlsm").Worksheets("aaa").Select どなたか、原因をお教えいただけないでしょうか。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • chie65535
  • ベストアンサー率43% (8524/19375)
回答No.1

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が自動的に実行された時「今アクティブなブック」や「今アクティブなブック内のシート」や「今アクティブなセル」が何処になっているか判りません。 もしかしたら、アクティブな物が無いかも知れません。 なので、タイマーで呼ばれる関数内は、必ず「ブックやシートやセルは明示的に指示」しないといけません。

gosyo0
質問者

お礼

chie65535さん 教えていただきありがとうございました。 うまく動きました。 以前使ったことが有ったような…程度の記憶しかないコマンドでした。 確かに言われるようにどの画面がアクティブになっているかわからないのでこのコマンドは結構必要性が高いですね。 勉強になりました。 Application.OnTimeの方も取り入れてプログラムを組んでみようかと思ったのですが、これは1秒以下のタイミングでコントロールできるのでしょうか。また連続呼び出しができない(精度が無い?)などの記述も見受けられましたので、とりあえず前のままのプログラムでやっています。 ありがとうございました。

その他の回答 (3)

回答No.4

評価版(試用版)でためしたところ・・・。 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で埋め込んだり 出来るちょうど良いのが、なかなか見つからない。。

gosyo0
質問者

お礼

やっぱりダメでしたか。 確認して頂きありがとうございました。 いろいろ通信しているのは怖いですね。 注意して使っていこうと思います。 ありがとうございました。

回答No.3

回答じゃありません。 (余計なお世話の気がしますけど。。) 開発タブから挿入、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のダブルクリックでは正常に再生されます。 暇がありましたら試してみても良いかも?

gosyo0
質問者

お礼

NotFound404様 コントロールの中に「GomPlayerX Control 」なんて言うのもあったのですね。 知りませんでした。 Excelの中で動かせればいいなと思っていましたので、早速使ってみようと思ったのですが、「GomPlayerX Control」を置くと、リソース不足でExcelが停止してしまいます。 ググっても何も出てきませんでした。 Windows8でメモリも8GB積んでいるので、なぜ?と言うところです。(Excel2013) 動くならチャレンジしてみたい内容だったので、残念です。 もし原因等ご存知でしたらお教えいただけますでしょうか。 よろしくお願いします。

  • chie65535
  • ベストアンサー率43% (8524/19375)
回答No.2

>これは1秒以下のタイミングでコントロールできるのでしょうか。 OnTimeは「システム時計が、指定した時計シリアル値になったら呼ぶ」なので、時計シリアル値の精度と、システム時計の精度に依存します。 時計シリアル値は、1日未満(時、分、秒)は「小数点」で持っているので、そんなに精度は高くないでしょう。せいぜい「ミリ秒」までが実用範囲です。 また、システム時計は、ハードウェアやOSに依存する部分なので、1/100秒が最小だったり、1/000秒が最小だったり、1秒が最小だったりします。 シリアル値で1秒は「1 / 24 / 60 / 60」ですから Now + 1 / 24 / 60 / 60 / 10 とかって指定をすれば「0.1秒ごと」も不可能ではありません(が、余り精度が良くないし、「再入(関数から抜ける前に時間が来てしまって2重に関数に入ってしまうこと)」の問題も起きます。 まあ、再入が起きると「呼ばれるばかりで関数から抜けてこない」ので、あっと言う間に「スタックオーバーフロー」で例外停止しちゃいますが。

gosyo0
質問者

お礼

chie65535さん 早速の回答ありがとうございました。 1秒以下の入力もできるんですね。 「おっ、それならできそうかな」と思ったのですが 「再入」と呼ばれる問題も起きるんですね。 これがどこかのHPに書いてあった「連続呼び出しができない」と言うことの 理由なんですね。 納得できました。 いろいろと教えていただきありがとうございました。

関連するQ&A

  • Excel VBAでエラーが出てしまう

    Excel VBAで今現在選択しているシートから"春"というワークシートに移動して"A1"セルを選択しようとするプログラムを作ろうとしています。 Worksheets("春").Select Range("A1").Select ならできるんですけど、 Worksheets("春").Range("A1").Select ならエラーになります。 なぜなのでしょうか?

  • エクセルVBA 1つのシートで出来ますか?

    説明が下手で申し訳ございませんが、宜しくお願い致します。 sheet(1)に20個のボタンがあります。 ボタンをクリックすると、別のシートが開きます。 開いたシートにも複数のボタンがあり、そのうちの任意のボタンをクリックすると、そのボタンの値がsheet(1)のそれぞれのボタンに対応したセルに入力される、という動作を実現したいと思っています。 現状、下記のようなコードで目的の動作は実現できてはいるのですが、各ボタンそれぞれにシートを作っているような状況です。(データ自体は全く同じ内容のものが、計20シート) たぶん、もの凄く頭の悪い事をやっているんだろうと思います。 sheet(1)を除いた各シートの入力データ自体は全く同じなので、シート一枚で出来るんじゃないのかなと思い、ネットや本で調べながら色々試してみたのですが、どうも上手く行きません。データが同じでも、sheet(1)のクリックしたボタンによって入力するセルを変えなければならないのが問題です。 sheet(1)のボタンとセルの関連付けや、sheet(1)のどのボタンを押したのかの判別ができればいいのかなと思って調べてみても、初心者にはよく理解できず、もう何週間もチャレンジしているのですがお手上げです。 上級者の方の知恵をお借りできれば幸いです。 Sub sheet2を開く() Worksheets(2).Select End Sub Sub 入力1() Worksheets(1).Range("F8") = "データ1" Worksheets(1).Select End Sub Sub 入力2() Worksheets(1).Range("F8") = "データ2" Worksheets(1).Select End Sub Sub 入力3() Worksheets(1).Range("F8") = "データ3" Worksheets(1).Select End Sub Sub sheet3を開く() Worksheets(3).Select End Sub Sub 入力1() Worksheets(1).Range("H8") = "データ1" Worksheets(1).Select End Sub Sub 入力2() Worksheets(1).Range("H8") = "データ2" Worksheets(1).Select End Sub Sub 入力3() Worksheets(1).Range("H8") = "データ3" Worksheets(1).Select End Sub Sub sheet4を開く() Worksheets(3).Select End Sub Sub 入力1() Worksheets(1).Range("M8") = "データ1" Worksheets(1).Select End Sub Sub 入力2() Worksheets(1).Range("M8") = "データ2" Worksheets(1).Select End Sub Sub 入力3() Worksheets(1).Range("M8") = "データ3" Worksheets(1).Select End Sub    ・    ・    ・    ・    ・

  • エクセルVBA シートの保護について

    エクセルの「シートの保護」について教えてください。 特定のシートのみ、保護したいと思っています。 そのシートの一定の範囲には、入力のみを許可したいです。 というのも、他の範囲(保護したい範囲)には、数式やvbaが設定されており、むやみやたらに「切り取り」や「行や列の削除」をされると困るからです。 そこで、 入力を許可する範囲を選択 →セルの書式設定 →保護のロックを外す →シートの保護 →「ロックされていないセル範囲を選択」を選択 しました。 この状態でマクロを実行すると、エラー1004(保護されたシートに対してこのコマンドは使用できません)とエラーが出ました。 エラー箇所は以下のとおりです。 Intersect(Worksheets("sheet1").Range("C5").CurrentRegion, Worksheets("sheet1").Rows("5:65536"), Worksheets("sheet1").Columns("C:T")).Select (質問1) ロックを外し、その後にシートの保護をする際、「全範囲を選択してから」シートの保護を行うものなのでしょうか。 それともシートの保護をすれば、自動的に、ロックを解除した範囲以外(全範囲)で保護したことになるのでしょうか。 「全範囲を選択してから」シートの保護をすると、ロックを外したセルを選択しても、アクティブセルが罫線で囲われずどこを選んでいるのか分からなくなってしまったので。 もし、あえて全範囲を選択する必要がないなら、それでいこうと思っています。 (質問2) 上記エラーを解消するには、どうしたら良いのでしょうか。 全範囲を選択できないように保護していることが原因かと思い、全範囲について「シートの保護→ロックされたセル範囲の選択」を選んでもエラー解除できませんでした。 また、Intersect.Selectの一行上に「ThisWorkbook.Unprotect」と追加しても解除できませんでした。 2つも質問して申し訳ありませんが、ご存知の方はご教授お願いします。 よろしくお願いします。

  • VBAのSendkeysでShift付の文字になる

    ExcelのVBAでGOM Playerを動かそうと思っています。 動画の途中から時間指定で再生しようと思っていますが、再生時間を指定するための画面を出す文字コード「G」をSendKeysで送るとなぜかShiftキー付の文字コードが送られてしまっているようです。 GOM Playerでは「G」を押すと「移動先の時間を指定」画面が出るのですが、VBAで「G」を送ると、「Shift+G」で表示される「オーディオキャプチャー設定」画面が出てきてしまいます。 VBAではなく手で「G」キーを押すと何の問題もなく表示されます。 具体的に書きますと H列のセルを選ぶとH列に書いてある時間(「0:04」など)のところから再生が始まるプログラムになります。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) Set 指定セル範囲1 = Range("H2:H132") Set 共有セル範囲1 = Intersect(ActiveCell, 指定セル範囲1) If Not 共有セル範囲1 Is Nothing Then Shell "C:\Program Files (x86)\GRETECH\GomPlayer\GOM.EXE", 1   SendKeys "G"   SendKeys "00:0" & Cells(Rows.Count, 8).Value End If End Sub 「Shell・・」の行はExcelがアクティブの状態からGOM Playerがアクティブの状態にするために入れてあります。 Wait時間を入れてみたり、CRを送ってからGを送ったり 下記のように別のコートで送ってもダメでした。 SendKeys ("G") SendKeys vbKeyG SendKeys 71 また「G」だけではなく「P」を送っても「Shift+P」が送られた動作になってしまいます。 すみませんが、お知恵を貸していただけませんでしょうか。 よろしくお願いします。

  • vba ワークシートを変数を用いて開くには

    初歩的な質問ですが、 ワークシートの書式が新しくなったことで、書き換えをすることになりました。 現在のエクセルファイルから、新しいエクセルファイルへ、セルの値を参照しながら VBAにて作業をしたいのですが、 Sub changesheet() Dim iname As String Dim wbname As String iname = InputBox("ブック名を入力", "対象ブックを入力") wbname = "シート2012(" & iname & ").xls" ActiveSheet.Range("P4").Value = Workbooks(wbname).Worksheets("Sheet1").Range("P4").Value End Sub この記載で実行すると、インデックスが有効範囲にありません とエラーになってしまいます。 変数(inputbox)を用いたセルの参照はどのように記述すればよろしいでしょうか? よろしくお願いします。

  • VBA定義について

    ExcelでVBAを使用してデータを曜日に寄って抽出する様定義されているのをみました。 ところで下記のDim TBL_E(2, 31) As Integer はどういう意味かまた [XXX = 1: OFF_CELL = 14: CNT1 = 1: CNT2 = 1]ってたとえですか。意味はちょっと分かりません。 初心者の者ですがよろしくお願いします。 Dim TBL_E(2, 31) As Integer YOUBI = Worksheets("AAA").Range("C11") XXX = 1: OFF_CELL = 14: CNT1 = 1: CNT2 = 1 Do Until CNT2 >= 8 If XXX <> Worksheets("AAA").Cells(OFF_CELL, 3) Then Select Case YOUBI Case 1: Worksheets("BBB").Range("E3") = "日" Worksheets("AAA").Range("AE5") = "SUN" Case 7: Worksheets("BBB").Range("E3") = "土" Worksheets("AAA").Range("AE5") = "SAT"          If CNT1 <= 8 Then TBL_E(1, CNT1) = XXX If CNT1 = 1 Then Worksheets("AAA").Range("D16") = YOUBI End If

  • VBAで全てのワークシートに処理するとき

    ブック内の全シートに、列を挿入しようとしたら、下の WS.Range("E1").Select の行で「Rangeクラスのselectメソッドが失敗しました」とエラーになります。 セルに入力する処理のときはこのパターンでできたのですが・・・いろいろ試してもわかりません T_T 何が必要でしょうか。 ----------------- Sub 列を挿入() Dim WS As Worksheet For Each WS In Worksheets WS.Range("E1").Select Selection.EntireColumn.Insert Next WS End Sub ----------------- よろしくお願い致します。

  • エクセルで色付けのVBAを作成してるのですが・・。

    エクセルでレンジ値の大きさにより色付けをする(下の条件)VBAを作りたいのですが うまく走りません。お手数とは思いますがご教授お願いします。 シート "aaa" のレンジ "A3<A2<A1" とだんだん大きくなれば、 シート "bbb" のレンジ "B1" の文字を黄色にして、シート "bbb" のレンジ "C1" の文字を赤色へ シート "aaa" のレンジ "A3<A2<A1" とだんだん大きくなれば、 シート "bbb" のレンジ "B1" の文字を緑色にして、シート "bbb" のレンジ "C1" の文字を赤色へ シート "aaa" のレンジ "A3,A1" が空白の場合、シート "bbb" のレンジ "C1" の文字を赤色へ シート "aaa" のレンジ "A3,A2,A1" が上の条件に合わなければ、 シート "bbb" のレンジ "B1" の文字を黒色にし、シート "bbb" のレンジ "C1" の文字を赤色にして終わる。 というようなプログラムで下記のように作りました。 ("A1,A2,A3"に入る値は50~100まで) ----------------------------------------------- Sub 注意() Dim v506Hi, v506Lo, v506a, v506b As Single v506a = Worksheets("aaa").Range("A3") v506b = Worksheets("aaa").Range("A1") If Worksheets("aaa").Range("A3") <> "" Then GoTo Sub1 ElseIf Worksheets("aaa").Range("A1") <> "" Then GoTo Sub1 Else Worksheets("bbb").Range("B1").Font.Color = RGB(0, 0, 0) GoTo sub2 Sub1: Select Case v506a Case Is < Worksheets("aaa").Range("A2") v506Hi = Worksheets("aaa").Range("A2") v506Lo = 0 Case Is > Worksheets("aaa").Range("A2") v506Lo = Worksheets("aaa").Range("A2") v506Hi = 500 Case Is = Worksheets("aaa").Range("A2") v506Hi = 500 v506Lo = 0 End Select Select Case v506b Case Is > v506Hi Worksheets("bbb").Range("b1").Font.Color = RGB(255, 255, 0)黄色 Case Is < v506Lo Worksheets("bbb").Range("b1").Font.Color = RGB(0, 255, 0)緑 Case Else Worksheets("bbb").Range("b1").Font.Color = RGB(0, 0, 0) End Select sub2: Worksheets("bbb").Range("c1").Font.Color = RGB(255, 0, 0)赤 End If End Sub ----------------------------------------------------------- プログラム初心者で間違いだらけとは思いますが、よろしくお願いいたします。

  • Excel VBA 空白セルをチェックする方法

    こんばんは ある選択範囲でどれか1つのセルに空白があった場合 メッセージを表示させたいのですが、 リスト中に入力された範囲のすべてのセルをチェックしたいのです。 どのようにしたら良いのでしょうか。 A1~A3の範囲のみでしたら下記でよいのかな?と考えてみました。 VBA勉強中なのですが、なかなかうまくいきません。お力をお願い致します。 If IsEmpty(Range("a2:d2").Value) Then MsgBox "開始時刻が入力されていません。" Worksheets("Sheet1").Range("a2").Select

  • シートの選択について

    エクセルのVBAにて、シートの選択について質問です。 直前まで【テスト1】と言うシートで作業をしていて、その後 Worksheets("テスト2").Activate Worksheets("テスト2").Select Range("A1").Value = 123 テスト2のA1に123と言う文字を表示させるとします。 プログラムを走らせてみたのですが、123と言う数字はテスト1のシートに記述されてしまいました。 ホントに初歩的な質問で申し訳ありませんが、テスト2に表示される方法を教えて頂けたらと思います。 それでは、よろしくお願い致します。