VBA技術解説
VBAでWindowsMediaPlayerを使い動画再生する

ExcelマクロVBAの問題点と解決策、VBAの技術的解説
公開日:2020-03-03 最終更新日:2020-03-03

VBAでWindowsMediaPlayerを使い動画再生する


VBAで動画を再生する方法を何通りか試してみます。
VBAで直接動画を再生できるわけではないので、コントロールのWindowsMediaPlayerを使って再生します。


動画を再生するだけなら簡単そうなのですが、実際にはいろいろと問題がありました。
また、WindowsMediaPlayerコントロールにクセがあり、使いづらい部分もあります。
・ワークシートにWindowsMediaPlayerを事前に追加
・ワークシートにWindowsMediaPlayerを動的に追加
・ユーザーフォームにWindowsMediaPlayerを事前に追加
・ユーザーフォームにWindowsMediaPlayerを動的に追加
それぞれについて、具体的な使い方と問題点を見ていきます。

※動画ファイルとしてはmp4とaviで確認しましたが、WindowsMediaPlayerが対応していればどれでも構いません。


ワークシートにWindowsMediaPlayerを事前に追加

ワークシートにコントロールを追加する手順

タブ「開発」→「挿入」→「コントロールの選択」

VBA マクロ 動画再生 WindowsMediaPlayer

一番下までスクロールして、

VBA マクロ 動画再生 WindowsMediaPlayer

「Windows Media Player」を選択して「OK」
シート上でドラッグして配置してください。

VBA マクロ 動画再生 WindowsMediaPlayer

この操作により、VBAProjectに参照設定が追加されます。

VBA マクロ 動画再生 WindowsMediaPlayer

動画ファイルを設定する

コントロールを右クリックして、プロパティを選択

VBA マクロ 動画再生 WindowsMediaPlayer

VBA マクロ 動画再生 WindowsMediaPlayer

オブジェクト名は適宜変更してください。
これより下では、このままWindowsMediaPlayer1として例示しています。

URLに動画ファイルをフルパス+ファイル名で入力し、「×」で閉じてください。
この時点では「デザイン モード」になっていますので、このアイコンをクリックして「デザイン モード」を解除します。

VBA マクロ 動画再生 WindowsMediaPlayer

「デザイン モード」を解除すると、動画の再生が始まります。
もちろん、URLに指定したファイルが実際に存在することが前提になります。

「Windows Media Player」の操作について

Playerの上で右クリックするとメニューが表示されます。

VBA マクロ 動画再生 WindowsMediaPlayer

これはメニューを見た通りの内容になります。
いろいろ操作して見てください。

ブックを開いたときのメッセージ

マクロVBAを入れるまでは普通に開けますが、
これ以降のVBAを追加した後は、以下のメッセージが表示されます。

VBA マクロ 動画再生 WindowsMediaPlayer

このメッセージは書かれている通りですが、
「OK」でも「キャンセル」でも、その後のマクロで動画再生はできるようです。

ただし、開いた直後は動画が再生されずに音声だけ流れるといった現象になりました。
これについては、PC環境によるものかどうか、はっきりしませんが、
Office365、Office2019等の複数の環境でこの現象となりました。

VBAでWindowsMediaPlayerコントロールのURLを切り替える

ワークシートに動画ファイルのフルパス+ファイル名を一覧で入れておき、
セルのダブルクリッで再生する動画を切り替えてみましょう。

VBA マクロ 動画再生 WindowsMediaPlayer

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
  If Target.Item(1).Value = "" Then Exit Sub
  With Me.WindowsMediaPlayer1
    .Width = 800
    .Height = 600
    .URL = Target.Item(1).Value
  End With
  Cancel = True
End Sub

ダブルクリックのイベントプロシージャーでURLを切り替えています。
・Worksheetのイベント ・イベントプロシージャー追加のVBE操作 ・Activate:Worksheetのイベント ・BeforeDoubleClick:Worksheetのイベント ・BeforeRightClick:Worksheetのイベント ・Change:Worksheetのイベント ・SelectionChange:Worksheetのイベント ・全てのシートまたは複数のシートに対するイベント
サイズ変更については、適宜変更してお使いください。
動画再生の途中でも別の動画に切り替えられます。
動画再生の途中で停止する場合は、右クリックメニューから停止してください。

コントロールの名称について
上記では、「WindowsMediaPlayer1」としましたが、
プロパティで適宜変更し、VBAもそれに合わせて変更してください。
シートモジュールでは、
Me.から書き始めることで、インテリセンス(候補表示)されます。

VBA マクロ 動画再生 WindowsMediaPlayer

サイズ変更が効かなくなった場合

上記マクロをいろいろ変更したりしながら実行していると、サイズ変更が効かなくなり、
Playerが動画の元のサイズになってしまう現象になる場合があります。
そのような場合は、一旦保存して閉じてから開き直すと再びVBAでサイズ変更が有効になります。

ワークシートにWindowsMediaPlayerを事前に追加した場合の問題点

動作検証は、
Windows10 + Office365(64bit)
Windows10 + Office2019(64bit)
以上での動作確認が主になっています。

Office365で作成したExcelファイルをOffice2010で開くと、
以下のエラーが出てしまい、まともに動作しませんでした。

VBA マクロ 動画再生 WindowsMediaPlayer

「OK」を押しても、

VBA マクロ 動画再生 WindowsMediaPlayer

この二つのメッセージがループしてしまい、どうにもなりません。
「ESC」を押しっぱなしにすると、そのうち停止させることができます。
この状態では、参照設定が壊れているようです。

VBA マクロ 動画再生 WindowsMediaPlayer

ただし、最初から2010で作成し、新しいバージョンで開かなければ動作します。
つまり、この方法では複数バージョンで使うとまともに動作しないと考えておいたほうが良いでしょう。


ワークシートにWindowsMediaPlayerコントロールを動的に追加

結論から言うと、上手くいきません。
これで良いという方法が見当たりませんでした。
※以下のVBAを実行すると、VBAProjectに「Windows Media Player」り参照設定が自動追加されます。

パターン1

Sub sample1()
  Dim sFile As String
  sFile = "D:\Video\sample.mp4"
  Call ActiveSheet.OLEObjects.Add( _
          ClassType:="WMPlayer.OCX.7", _
          Left:=10, Top:=10, Width:=400, Height:=300)
  ActiveSheet.WindowsMediaPlayer1.Url = sFile
  ActiveSheet.WindowsMediaPlayer1.Controls.Play
End Sub

これですと、コントロールは追加されますが、その後にエラーになります。

VBA マクロ 動画再生 WindowsMediaPlayer

ActiveSheet.WindowsMediaPlayer1
この部分で、ActiveSheetにそんなメンバーは存在しないと怒られてしまいます。

パターン2

Sub sample2()
  Dim sFile As String
  sFile = "D:\Video\sample.mp4"
  Dim ws As Worksheet
  Set ws = ActiveSheet
  Call ws.OLEObjects.Add( _
          ClassType:="WMPlayer.OCX.7", _
          Left:=10, Top:=10, Width:=400, Height:=300)
  ws.WindowsMediaPlayer1.Url = sFile
  ws.WindowsMediaPlayer1.Controls.Play
End Sub

Activesheetをオブジェクト変数にいれてから処理するようにすると、
実行しようとしても、コンパイルでエラーが出てしまいます。

VBA マクロ 動画再生 WindowsMediaPlayer

ws.WindowsMediaPlayer1
そんなものは無いと怒られてしまいます。

パターン3

Sub sample3()
  Dim sFile As String
  sFile = "D:\Video\sample.mp4"
  Dim ws As Worksheet
  Set ws = ActiveSheet
  Call ws.OLEObjects.Add( _
          ClassType:="WMPlayer.OCX.7", _
          Left:=10, Top:=10, Width:=400, Height:=300)
  ActiveSheet.WindowsMediaPlayer1.Url = sFile
  ActiveSheet.WindowsMediaPlayer1.Controls.Play
End Sub

これなら、なぜかエラーにならずに実行できます。
やったーと思いきや、
音だけ出て動画が再生されません・・・
これはもう意味が分かりません、バグなのか何なのか・・・
どうしようもないですね。

パターン4

上記最初の2パターンのエラーは、オブジェクトにコントロールを動的に追加しているので、
オブジェクトのメンバー名が特定できないので呼び出し時の記述に困っている状態です。
そこで、CallByNameでこれを解決してみました。

Sub sample4()
  Dim sFile As String
  sFile = "D:\Video\sample.mp4"
  Dim ws As Worksheet
  Set ws = ActiveSheet
  Dim obj As Object
  Set obj = ws.OLEObjects.Add( _
          ClassType:="WMPlayer.OCX.7", _
          Left:=10, Top:=10, Width:=400, Height:=300)
  Dim mp As Object
  Set mp = CallByName(ws, obj.Name, VbGet)
  mp.Url = sFile
  mp.Controls.Play
End Sub

無事実行できましたが、結局は音だけの再生となってしまいました。
パターン3と同じ結果になっただけでした。

ワークシートにWindowsMediaPlayerコントロールを動的に追加
解決方法は不明のままに終わりました。
音だけ再生される現象の解決方法は見つけられませんでした。
上記のVBA実行後に、ワークシートで「デザインモード」に切り替えて再度戻すだけでちゃんと動画再生されます。
もう、バグじゃないのかとしか言いようがありません。


ユーザーフォームにWindowsMediaPlayerを事前に追加

シートでは何かと使いづらい場合も多いと思います。
そこで、動画再生専用のユーザーフォームを作ってみましょう。
ユーザーフォームの基本については、以下を参照してください。
ユーザーフォーム入門
エクセル(Excel)マクロ(VBA)をやっていればユーザーフォームの存在を知り、そしてユーザーフォームを使いたくなります。使いたくなるというより、使った方が良い場合が出てきます。しかし、ユーザーフォームは少々とっつきにくく、使い始めて使いこなすには、各種コントロールの特性を理解し、イベントについても深い知識が必要…

WindowsMediaPlayerコントロールを追加

まずはユーザーフォームを追加してください。

VBA マクロ 動画再生 WindowsMediaPlayer

ユーザーフォームのオブジェクト名は何でも構いませんが、
これ以降のVBAでは、「frmMediaPlayer」としてVBAを掲載しています。

「ツールボックス」を右クリックして「その他のコントロール」を選択してください。
ツールボックスが表示されていない場合は、メニューの表示から表示してください。

VBA マクロ 動画再生 WindowsMediaPlayer

VBA マクロ 動画再生 WindowsMediaPlayer

一番下までスクロールして、「Windows Media Player」をチェックして「OK」してください。

VBA マクロ 動画再生 WindowsMediaPlayer

右下に追加されたのが、「Windows Media Player」になります。
このアイコンをクリックして、フォームに配置してください。

VBA マクロ 動画再生 WindowsMediaPlayer

一旦は、適当な位置に適当な大きさで構いません。
後でプロパティで変更できます。
以下のVBAでは、このプロパティも設定するVBAを紹介していますので、適当な配置にしておいて構いません。

ワークシートのイベントプロシージャー

すでにワークシートのWindowsMediaPlayerコントロールで出てきたものと似たようなVBAになります。

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
  If Target.Item(1).Value = "" Then Exit Sub
  With frmMediaPlayer
    .WindowsMediaPlayer1.URL = Target.Item(1).Value
    .Show vbModeless
  End With
  Cancel = True
End Sub

ダブルクリックのイベントプロシージャーでユーザーフォームを表示しています。
URLを切り替えてから、モードレス表示しています。
モーダルにした場合は、フォームを閉じないとシート操作が出来ません。
モードレスにすることで、シート操作が可能になりますので、次々に切り替えることができるようになります。
URL設定以外は何もしていないので、フォームに追加したままの位置・大きさでPlayerが表示されます。
「閉じる」ボタンを作ってないので、「×」で閉じてください。

フォームモジュールにVBAを書いて使いやすくする

先に書いたように、Playerの位置や大きさを変更できるように、フォームモジュールにVBAを書いてみましょう。
フォームの大きさを指定できるようにして、そのフォームいっぱいにPlayerを表示します。

ユーザーフォームのモジュール
Option Explicit

Public Sub Play(ByVal URL As String, _
        Optional ByVal Width As Double = -1, _
        Optional ByVal Height As Double = -1)
  'サイズ設定
  Call SetFormSize(Width, Height)
  
  'モードレス表示
  Me.Show vbModeless
  
  '動画再生
  Me.WindowsMediaPlayer1.URL = URL
  '以下は特に必要ないが紹介かねて
  Me.WindowsMediaPlayer1.Controls.Play
End Sub

'フォームの外観を設定
Public Sub SetFormSize(Optional ByVal Width As Double = -1, _
            Optional ByVal Height As Double = -1)
  '指定サイズに設定
  If Width > 0 And Height > 0 Then
    Me.Width = Width
    Me.Height = Height
  End If
  
  'メディアプレイヤーをフォームいっぱいに
  With Me.WindowsMediaPlayer1
    .Top = 0
    .Left = 0
    .Width = Me.InsideWidth
    .Height = Me.InsideHeight
  End With
End Sub

Controlsの下のメンバーで、Playerをいろいろと操作できます。

VBA マクロ 動画再生 WindowsMediaPlayer

お好みでVBAに機能を追加してみてください。

ワークシートのイベントプロシージャー
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
  If Target.Item(1).Value = "" Then Exit Sub
  Call frmMediaPlayer.Play(Target.Item(1).Value, 400, 300)
  Cancel = True
End Sub

SubプロシージャーPlayの引数は、
URL(動画ファイル),横サイズ,縦サイズ
横サイズ,縦サイズはOptionalなので、指定しない場合はサイズ変更はしません。

ユーザーフォームにWindowsMediaPlayerを事前に追加の問題点

「ワークシートにWindowsMediaPlayerを事前に追加した場合の問題点」
ここで記載したことと同じ問題があります。
Office365で作成したものをExcel2010で開くとエラーがでて、どうしようもなくなります。


ユーザーフォームにWindowsMediaPlayerを動的に追加

フォームモジュール

Option Explicit

Private WMP As Object

Private Sub UserForm_Initialize()
  Set WMP = Me.Controls.Add("WMPlayer.OCX.7")
  With WMP
    .Top = 0
    .Left = 0
    .Width = Me.Width
    .Height = Me.Height
  End With
End Sub

Public Sub Play(ByVal URL As String, _
        Optional ByVal Width As Double = -1, _
        Optional ByVal Height As Double = -1)
  'サイズ設定
  Call SetFormSize(Width, Height)
 
  'モードレス表示
  Me.Show vbModeless
 
  '動画再生
  WMP.URL = URL
End Sub

'フォームの外観を設定
Public Sub SetFormSize(Optional ByVal Width As Double = -1, _
            Optional ByVal Height As Double = -1)
  '指定サイズに設定
  If Width > 0 And Height > 0 Then
    Me.Width = Width
    Me.Height = Height
  End If
 
  'メディアプレイヤーをフォームいっぱいに
  With WMP
    .Top = 0
    .Left = 0
    .Width = Me.InsideWidth
    .Height = Me.InsideHeight
  End With
End Sub


特に参照設定も必要ありません。

シートモジュール

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
  If Target.Item(1).Value = "" Then Exit Sub
  Call frmMediaPlayer.Play(Target.Item(1).Value, 400, 300)
  Cancel = True
End Sub

先の事前にコントロールを配置する場合と同じVBAです。
フォームはfrmMediaPlayerとしています。

ユーザーフォームにWindowsMediaPlayerを動的に追加の問題点

動画の画面サイズが大きいとPlayerがフォームサイズを無視して大きくなってしまいます。
動画の一部しか画面に表示されない現象が出てしまいます。
これに対応する方法として、時差でサイズ調整する事で解決できます。

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
  If Target.Item(1).Value = "" Then Exit Sub
  Call frmMediaPlayer.Play(Target.Item(1).Value, 400, 300)
  Cancel = True
  
  Application.OnTime Now() + TimeSerial(0, 0, 2), "OnTimeProc"
End Sub

標準モジュール
Public Sub OnTimeProc()
  frmMediaPlayer.SetFormSize
End Sub

2秒後にサイズ設定することで、上手くサイズが設定されました。
1秒後でも大丈夫な場合もありますがだめな場合もありました。
2秒後では確実にサイズ変更できましたが、この時間はPCによって変わってくると思います。

この方法では、Office365で作成したものをExcel2010で開いても問題がありませんでした。
参照設定が追加されないので問題が起きないようです。
ただし、かなり環境に依存する事だけは確かなので、どんな環境でも大丈夫だとは言い難いと思います。


簡単に動画再生するだけなら

以上、ワークシートとユーザーフォームで動画再生する方法と問題点をいろいろと紹介しましたが、
最後に、こんなことをいうのも、とは思いますが、
とにかく動画を再生するだけで良いなら、もっと簡単に再生することができます。

Sub sample()
  ThisWorkbook.FollowHyperlink "動画のフルパス+ファイル名"
End Sub

Windowsが拡張子で起動できるものなら、たったこれだけで起動できます。
詳しくは、以下でいろいろな方法を紹介しています。

VBAでファイルを既定のアプリで開く方法
・実行テストメイン ・Shell関数 ・batファイル(コマンド プロンプト) ・WScript.Shell ・Shell.Application ・FollowHyperlink ・最後に


VBAでの動画再生の最後に

ワークシートやユーザーフォームで動画再生する場合は、
動画再生が始まるのはマクロが終了した後になります。
処理時間のかかるマクロの先頭で動画再生を開始しても、マクロが終わるまでは動画再生は始まりません。
つまり、以下で紹介した音楽のような使い方はできません。
簡易音楽プレーヤーの作成|ユーザーフォーム入門
・ユーザーフォーム ・フォームモジュール ・標準モジュールでの使用例 ・簡易音楽プレーヤーの最後に

最後に紹介したFollowHyperlinkなら非同期で動くので、マクロ開始時に再生を開始することができますが、
その場合は、VBAから動画再生を停止させることは簡単にはできなくなります。
さすがに、マクロ実行中だけ自動で動画再生したいという要望があるとも思えませんけど・・・




同じテーマ「マクロVBA技術解説」の記事

Evaluateメソッド(文字列の数式を実行します)

・Evaluateメソッドの構文 ・Evaluateメソッドの解説と使用例 ・Evaluateメソッドの最後に
Rangeオブジェクトの論理演算(差集合と排他的論理和)
・集合について ・Rangeオブジェクトの論理演算のVBAについて ・和集合:Unionメソッド ・積集合:Intersectメソッド ・補集合 ・差集合 ・排他的論理和 ・Rangeオブジェクトの論理演算VBAの使い方とテスト
VBAで写真の撮影日時や音楽動画の長さを取得する
・VBAで写真の撮影日時を取得 ・全てのプロパティを取得するVBA ・全てのプロパティを取得するVBAの使用例 ・VBAで撮影日時や音楽動画の長さ取得の最後に
VBAでWindowsMediaPlayerを使い動画再生する
VBAでWEBカメラ操作する
・ActiveMovie Windowを起動する ・メインのユーザーフォーム ・WEBカメラを選択するユーザーフォーム ・上記ユーザーフォームの使い方 ・APIを使いキャプチャをとる ・VBAでWEBカメラ操作の最後に
VBAで電光掲示板を作成
・東雲フォントについて ・東雲フォントの追加説明 ・東雲フォントをシートに取得するVBA ・電光掲示板のシート構成 ・電光掲示板のVBA ・VBAで電光掲示板を作成の最後に
ユーザーに絶対に停止させたくない場合のVBA設定
ユーザー操作によりマクロVBAが実行中に停止させられてしまう場合があります。再実行可能であれば問題ありませんが、途中で強制停止された場合のデータ保証が出来ないと言った場合もあるでしよう。マクロ実行でも、以下のキーボード操作でVBAは停止できてしまいます。
列幅・行高をDPI取得しピクセルで指定する
・列幅・行高をピクセルで指定するVBA ・列幅・行高をピクセルで指定するVBAの使い方と解説
VBAでWMIの使い方について
・WMIを調べるときの推奨サイト ・VBAでのWMI使用方法 ・WMIにはどんなものがあるのか
アクティブシート以外のWindowを設定できるWorksheetView
・Windowオブジェクトのメソッドとプロパティ ・アクティブシート以外の表示(Window)に関する設定 ・アクティブシート以外の表示(Window)を設定するVBA ・全ウィンドウの全シートのWorksheetViewを設定するVBA
LSetとユーザー定義型のコピー(100桁の足し算)
・数値データ型の数値範囲 ・100桁数値の足し算VBA ・100桁数値の足し算VBAの使い方と結果 ・100桁数値の足し算VBAの解説


新着記事NEW ・・・新着記事一覧を見る

無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
累計を求める数式あれこれ|エクセル関数応用(2024-01-22)
複数の文字列を検索して置換するSUBSTITUTE|エクセル入門(2024-01-03)
いくつかの数式の計算中にリソース不足になりました。|エクセル雑感(2023-12-28)
VBAでクリップボードへ文字列を送信・取得する3つの方法|VBA技術解説(2023-12-07)
難しい数式とは何か?|エクセル雑感(2023-12-07)
スピらない スピル数式 スピらせる|エクセル雑感(2023-12-06)
イータ縮小ラムダ(eta reduced lambda)|エクセル入門(2023-11-20)
PIVOTBY関数(縦軸と横軸でグループ化して集計)|エクセル入門(2023-11-19)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.変数宣言のDimとデータ型|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.並べ替え(Sort)|VBA入門
8.条件分岐(IF)|VBA入門
9.マクロとは?VBAとは?VBAでできること|VBA入門
10.セルのクリア(Clear,ClearContents)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ