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

ExcelマクロVBAの問題点と解決策、VBAの技術的解説
最終更新日: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のイベントプロシージャーは、ワークシートまたはそのセルに対し特定の操作(これがイベント)が行われた時に実行されます。イベントは、手動でもVBAでも、どちらで操作が行われても発生します。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

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

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

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

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

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

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

VBAでファイルを既定のアプリで開く方法
Excelマクロで、エクセル以外のファイルを既定のアプリケーションで開く場合の方法について何通りか解説します、VBAでファイルを単純に開くだけの場合についてになります。ファイルを開いた後に、そのファイルに対して何らかの操作をしたい場合は、対応するアプリケーション毎に個別の対応が必要になりますが、Windowsで開けるファイルであり、

VBAでの動画再生の最後に

ワークシートやユーザーフォームで動画再生する場合は、
動画再生が始まるのはマクロが終了した後になります。
処理時間のかかるマクロの先頭で動画再生を開始しても、マクロが終わるまでは動画再生は始まりません。
つまり、以下で紹介した音楽のような使い方はできません。
簡易音楽プレーヤーの作成|ユーザーフォーム入門
VBAにも音楽を!ということでVBAで音楽再生するVBAクラスを作成しました。VBAで音楽再生するクラスを作成 そこで、このクラスを使い簡易的な音楽プレーヤーを作ってみました。あまり本格的なものは作れませんし、良いソフトが沢山ありますので自作しても仕方ありません。

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



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

Evaluateメソッド(文字列の数式を実行します)
Rangeオブジェクトの論理演算(差集合と排他的論理和)
VBAで写真の撮影日時や音楽動画の長さを取得する
VBAでWindowsMediaPlayerを使い動画再生する
VBAでWEBカメラ操作する
VBAで電光掲示板を作成
ユーザーに絶対に停止させたくない場合のVBA設定
列幅・行高をDPI取得しピクセルで指定する
VBAでWMIの使い方について
アクティブシート以外のWindowを設定できるWorksheetView
LSetとユーザー定義型のコピー(100桁の足し算)


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

VBA100本ノック 18本目:名前定義の削除|VBA練習問題100(11月6日)
VBA100本ノック 17本目:重複削除(ユニーク化)|VBA練習問題100(11月6日)
VBA100本ノック 16本目:無駄な改行を削除|VBA練習問題100(11月5日)
VBA100本ノック 15本目:シートの並べ替え|VBA練習問題100(11月4日)
VBA100本ノック 14本目:社外秘シート削除|VBA練習問題100(11月3日)
VBA100本ノック 13本目:文字列の部分フォント|VBA練習問題100(11月1日)
VBA100本ノック 12本目:セル結合を解除|VBA練習問題100(10月31日)
VBA100本ノック 11本目:セル結合の警告|VBA練習問題100(10月30日)
VBA100本ノック 10本目:行の削除|VBA練習問題100(10月29日)
VBA100本ノック 9本目:フィルターコピー|VBA練習問題100(10月28日)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
5.マクロって何?VBAって何?|VBA入門
6.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
7.繰り返し処理(For Next)|VBA入門
8.セルに文字を入れるとは(Range,Value)|VBA入門
9.とにかく書いてみよう(Sub,End Sub)|VBA入門
10.マクロはどこに書くの(VBEの起動)|VBA入門




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


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



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