VBAでWindowsMediaPlayerを使い動画再生する
VBAで動画を再生する方法を何通りか試してみます。
VBAで直接動画を再生できるわけではないので、コントロールのWindowsMediaPlayerを使って再生します。
また、WindowsMediaPlayerコントロールにクセがあり、使いづらい部分もあります。
・ワークシートにWindowsMediaPlayerを事前に追加
・ワークシートにWindowsMediaPlayerを動的に追加
・ユーザーフォームにWindowsMediaPlayerを事前に追加
・ユーザーフォームにWindowsMediaPlayerを動的に追加
それぞれについて、具体的な使い方と問題点を見ていきます。
ワークシートにWindowsMediaPlayerを事前に追加
ワークシートにコントロールを追加する手順
シート上でドラッグして配置してください。
動画ファイルを設定する
これより下では、このままWindowsMediaPlayer1として例示しています。
この時点では「デザイン モード」になっていますので、このアイコンをクリックして「デザイン モード」を解除します。
もちろん、URLに指定したファイルが実際に存在することが前提になります。
「Windows Media Player」の操作について
いろいろ操作して見てください。
ブックを開いたときのメッセージ
これ以降のVBAを追加した後は、以下のメッセージが表示されます。
「OK」でも「キャンセル」でも、その後のマクロで動画再生はできるようです。
これについては、PC環境によるものかどうか、はっきりしませんが、
Office365、Office2019等の複数の環境でこの現象となりました。
VBAでWindowsMediaPlayerコントロールのURLを切り替える
セルのダブルクリッで再生する動画を切り替えてみましょう。
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を切り替えています。
動画再生の途中でも別の動画に切り替えられます。
動画再生の途中で停止する場合は、右クリックメニューから停止してください。
プロパティで適宜変更し、VBAもそれに合わせて変更してください。
シートモジュールでは、
Me.から書き始めることで、インテリセンス(候補表示)されます。
サイズ変更が効かなくなった場合
Playerが動画の元のサイズになってしまう現象になる場合があります。
そのような場合は、一旦保存して閉じてから開き直すと再びVBAでサイズ変更が有効になります。
ワークシートにWindowsMediaPlayerを事前に追加した場合の問題点
・Windows10 + Office365(64bit)
・Windows10 + Office2019(64bit)
以上での動作確認が主になっています。
以下のエラーが出てしまい、まともに動作しませんでした。
「ESC」を押しっぱなしにすると、そのうち停止させることができます。
この状態では、参照設定が壊れているようです。
つまり、この方法では複数バージョンで使うとまともに動作しないと考えておいたほうが良いでしょう。
ワークシートに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
これですと、コントロールは追加されますが、その後にエラーになります。
この部分で、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をオブジェクト変数にいれてから処理するようにすると、
実行しようとしても、コンパイルでエラーが出てしまいます。
そんなものは無いと怒られてしまいます。
パターン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
オブジェクトのメンバー名が特定できないので呼び出し時の記述に困っている状態です。
そこで、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と同じ結果になっただけでした。
音だけ再生される現象の解決方法は見つけられませんでした。
上記のVBA実行後に、ワークシートで「デザインモード」に切り替えて再度戻すだけでちゃんと動画再生されます。
もう、バグじゃないのかとしか言いようがありません。
ユーザーフォームにWindowsMediaPlayerを事前に追加
そこで、動画再生専用のユーザーフォームを作ってみましょう。
ユーザーフォームの基本については、以下を参照してください。
WindowsMediaPlayerコントロールを追加
これ以降のVBAでは、「frmMediaPlayer」としてVBAを掲載しています。
ツールボックスが表示されていない場合は、メニューの表示から表示してください。
このアイコンをクリックして、フォームに配置してください。
後でプロパティで変更できます。
以下のVBAでは、このプロパティも設定する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を表示します。
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をいろいろと操作できます。
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を事前に追加の問題点
ここで記載したことと同じ問題があります。
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を動的に追加の問題点
動画の一部しか画面に表示されない現象が出てしまいます。
これに対応する方法として、時差でサイズ調整する事で解決できます。
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によって変わってくると思います。
参照設定が追加されないので問題が起きないようです。
ただし、かなり環境に依存する事だけは確かなので、どんな環境でも大丈夫だとは言い難いと思います。
簡単に動画再生するだけなら
最後に、こんなことをいうのも、とは思いますが、
とにかく動画を再生するだけで良いなら、もっと簡単に再生することができます。
Sub sample()
ThisWorkbook.FollowHyperlink "動画のフルパス+ファイル名"
End Sub
Windowsが拡張子で起動できるものなら、たったこれだけで起動できます。
詳しくは、以下でいろいろな方法を紹介しています。
VBAでの動画再生の最後に
動画再生が始まるのはマクロが終了した後になります。
処理時間のかかるマクロの先頭で動画再生を開始しても、マクロが終わるまでは動画再生は始まりません。
つまり、以下で紹介した音楽のような使い方はできません。
最後に紹介したFollowHyperlinkなら非同期で動くので、マクロ開始時に再生を開始することができますが、
その場合は、VBAから動画再生を停止させることは簡単にはできなくなります。
さすがに、マクロ実行中だけ自動で動画再生したいという要望があるとも思えませんけど・・・
同じテーマ「マクロVBA技術解説」の記事
Evaluateメソッド(文字列の数式を実行します)
Rangeオブジェクトの論理演算(差集合と排他的論理和)
VBAで写真の撮影日時や音楽動画の長さを取得する
VBAでWindowsMediaPlayerを使い動画再生する
VBAでWEBカメラ操作する
VBAで電光掲示板を作成
ユーザーに絶対に停止させたくない場合のVBA設定
列幅・行高をDPI取得しピクセルで指定する
VBAでWMIの使い方について
アクティブシート以外のWindowを設定できるWorksheetView
LSetとユーザー定義型のコピー(100桁の足し算)
新着記事NEW ・・・新着記事一覧を見る
TRIMRANGE関数(セル範囲をトリム:端の空白セルを除外)|エクセル入門(2024-08-30)
正規表現関数(REGEXTEST,REGEXREPLACE,REGEXEXTRACT)|エクセル入門(2024-07-02)
エクセルが起動しない、Excelが立ち上がらない|エクセル雑感(2024-04-11)
ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)
テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)
ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.繰り返し処理(For Next)|VBA入門
3.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
4.変数宣言のDimとデータ型|VBA入門
5.RangeとCellsの使い方|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.セルのクリア(Clear,ClearContents)|VBA入門
8.メッセージボックス(MsgBox関数)|VBA入門
9.条件分岐(Select Case)|VBA入門
10.ブック・シートの選択(Select,Activate)|VBA入門
- ホーム
- マクロVBA応用編
- マクロVBA技術解説
- VBAでWindowsMediaPlayerを使い動画再生する
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。