• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VBAのユーザーフォームについて)

VBAのユーザーフォームについての質問

このQ&Aのポイント
  • VBAのユーザーフォームに関する質問です。テキストボックスにファイル名を入力し、実行ボタンを押すことで、IEを立ち上げ、画像ファイルを開くマクロを作成しました。質問は以下の3点です。
  • 1. テキストボックスに入力した値を消すためのコードはどのように記述すればよいでしょうか?
  • 2. 「クリア」ボタンを押すことで立ち上がったIEを閉じることはできるのでしょうか?

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

  • ベストアンサー
  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.3

WMVプレイヤーにURLを付け加えて起動するのですね。 それでは、OpenURL()を以下のように変更してみてください。 (念のため今のOpenURLもOpenURL_OLDなどと名前を変えて残しておいた方がよいでしょう) Sub OpenURL()  Dim Param As String  Dim Shell As Object  Param = UserForm1.TextBox1.Text  Set Shell = CreateObject("Wscript.Shell")  Shell.CurrentDirectory = Environ("ProgramFiles") & "\Windows Media Player"  Call Shell.Run("wmplayer.exe " & WmvURL & Param & ".wmv " _  & JpgURL & Param & ".jpg", 1, True)  Set Shell = Nothing End Sub それから、ユーザフォームを右上に出す方法ですが、自分で試してみたところ、なぜかうまくいきません。 位置を指定する方法は、UserFormのTop、Leftというプロパティがそれぞれフォームの左上の座標となるので、フォームを表示するイベントの中でそれらの値を設定します。左上隅が(0,0)の座標です。 左上に位置するのであれば、Top=0,Left=0とすればいいのですが、右上の場合、 Left=画面の解像度の横方向のピクセル数-Width と、位置を指定するのに画面の大きさに左右されてしまうのです。(Widthはフォームの幅を表すプロパティです) たとえば画面が1280x1024だと、 Left=1280-Width で済むのですが、もし不特定多数の人が解像度の異なるPCからこのフォームを起動するのであれば、上記のように1280と固定でなく、VBAの中から画面の画素数を取得しなければなりません。これはけっこうややこしいですが、調べて一応わかりました。 それで、まだ問題があって、これは私も理由がわからないのですが、私のPCの場合、上に書いた式 Left=画素数-Width で試したら、画面に表示されませんでした。どうも画面からはみ出した右にいるみたいで、上の数字を調節したところ、 Left=画素数-Width-320 となぜか320引かないと右上に表示されませんでした。これは原因がわかりません。 一応サンプルソースをつけますが、このままでは右上にきちんと表示されるかどうかはわからないので、調整が必要になると思います。 まず、標準モジュール(Module1)に以下をコピーしてください。 Declare Function SystemParametersInfo Lib "user32" _  Alias "SystemParametersInfoA" ( _  ByVal uAction As Long, _  ByVal uParam As Long, _  ByRef lpvParam As Any, _  ByVal fuWinIni As Long) As Long 'RECT構造体 Public Type RECT  Left As Long  Top As Long  Right As Long  Bottom As Long End Type 'モニターの有効なスクリーンサイズを取得 Public Const SPI_GETWORKAREA = 48 次に、UserFormの画面でF7を押してコードの表示画面を出し、以下のように記述してください。 Private Sub UserForm_Activate()  Dim typRect As RECT  Call SystemParametersInfo(SPI_GETWORKAREA, 0, typRect, 0)  With UserForm1   .Top = 0   .Left = typRect.Right - 320 - .Width  End With End Sub 上の -320 の部分が私の環境で調節してぴったりになった数字です。もしこれで左に寄っている、あるいは画面からはみ出している、という場合は、試行錯誤してこの数値を調節してみてください。

15974
質問者

お礼

またもや丁寧なご回答ありがとうございます! しかし・・・ Call Shell.Run("wmplayer.exe " & JpgURL & Param & ".jpg" - & WmvURL & Param & ".wmv " , 1, True) この部分で、構文エラーが・・ ちなみにJPGを先にしたいのと、ファイルとファイルの間はハイフン(-)でつなぐみたなんですが・・・ また, 1, True)の部分はどういう意味なんでしょう? すみません、ご教示ください!! 表示位置については・・・もう少しやってみます!

その他の回答 (3)

  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.4

wmplayer.exe の引数の仕様は知らなかったのですが、ハイフンを入れなくても動作したので抜きました。ハイフンを入れても入れなくても動作はするのですが…。 ご希望の書式にするのであれば、 Call Shell.Run("wmplayer.exe " & JpgURL & Param & ".jpg - " _ & WmvURL & Param & ".wmv", 1, True) と書けばよいでしょう。 > また, 1, True)の部分はどういう意味なんでしょう? これは WScript.Shell オブジェクトでEXEファイルを起動するRunメソッドの第2引数と第3引数です。 第1引数が"wmplayer.exe ~" 第2引数が1の場合はウィンドウをノーマルの大きさで、2の場合は最小化の状態で、3の場合は最大化で起動します。 第3引数のTrueは、アプリケーションの実行が終了するまで待つ指定です。Falseにするとアプリケーションの実行を待たずに次の処理を行います。 今回の場合、Trueにしていると「終了」ボタンを押してもメディアプレーヤーが終了しないと、ユーザフォームが閉じない(Excelが終了しない)ので、Falseにした方がいいかもしれません。

15974
質問者

お礼

またもや丁寧にありがとうございます。 メディアプレーヤーの終了については・・・もう少し探ってみたいと思います。 右上表示については・・・とりあえず使う端末のモニタは同じ解像度なのでなんとか簡易的にできると思います。 またお聞きする事があるかもしれませんがよろしくお願いします。

  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.2

> ちなみに終了釦にてメディアプレーヤーも終了する事はできますか? すみません、いろいろやってみたのですが、私もそのやり方はわかりませんでした。JPGの表示ならそのままIEを閉じればいいのですが、WMVを再生すると、自動的にIEは閉じてメディアプレーヤーが起動されます。 JPGの表示と同じようにIEを閉じようとしても、すでにWMVの方のIEは閉じられておりているので何も起こりません。そうするとメディアプレーヤーを直接終了するしかないのですが、ネットで検索してみたところ、標準の機能ではできず、「WMPのオートメーション」というのをインストールしないといけないようです。 そういうわけで、申し訳ないですが終了ボタンでメディアプレーヤーを閉じる方法はちょっとわかりかねます。力及ばずすみません。

15974
質問者

お礼

とんでもありません。 本当にありがとうございました! また質問する事があったらよろしくお願いします。 ありがとうございました!

15974
質問者

補足

また追加で質問になってしまい恐縮ですが。。。 この画像ファイルと、映像ファイルをメディアプレーヤーで連続再生する形を考えたいのですが、可能でしょうか? wmplayer.exe (WMVファイル) - (JPGファイル) で連続再生が可能という所までは確認したのですが、これをマクロに組み込みたいと思います。 「実行」釦でこれを実行し、今回はメディアプレーヤーなので「クリア」は考えず、パラメータを変えてこれが連続で行えれば良いです。 また、このVBAで作った画面自体を立ち上げる際、立ち上がる位置を画面の右上に指定する事もできるでしょうか? 度々すみませんが、ご教示ください。 よろしくお願いします。

  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.1

こんにちは、さきほどの質問に回答したものです。この質問は http://oshiete1.goo.ne.jp/kotaeru.php3?qid=2807325 の続きですね。 ユーザーフォーム名:UserForm1 テキストボックス名:TextBox1 実行ボタン名:CommandButton1 クリアボタン名:CommandButton2 終了ボタン名:CommandButton3 と仮定して書きます。名前を自分で変更している場合は、以下の解説中の名前は、自分で設定した名前に置きかえてください。 (1)ユーザーフォームからボタンを押してクリアさせるには、 TextBox1.Text = "" と書けばよいです。 (2)IEを閉じるには、先の質問で回答したマクロの CloseIE を実行すればいいです。(標準モジュールに作ってあるので、どこからでも実行できます) したがって、クリアボタンがクリックされたときのマクロは、 Private Sub CommandButton2_Click()  TextBox1.Text = ""  CloseIE End Sub と記述すればいいです。 (3)Excelファイルの起動時にマクロを実行するには、VBAの画面の左のThisWorkbookをダブルクリックし、 Private Sub Workbook_Open()  UserForm1.Show End Sub と記述します。ちなみに、Excelの画面自体は表示したくなく、ユーザーフォームだけを表示したい場合は、 Private Sub Workbook_Open()  Application.WindowState = xlMinimized  AppActivate "Microsoft Excel"  UserForm1.Show End Sub のようにします。ちょっとアプリケーションっぽくなります。 終了ボタンでExcelごと終了させるには、 Private Sub CommandButton3_Click()  Application.Quit End Sub と書けばいいです。 なお、先の回答ではセルからファイル名を取得していましたが、実行ボタンでテキストボックスのファイル名のJPGとWMVを開くのであれば、先の回答のマクロの、 Param = Worksheets("Sheet1").Range("A1").Value は Param = UserForm1.TextBox1.Text のようにするとよいでしょう。

15974
質問者

お礼

ありがとうございます!! 希望通りの動きになってきました。 ちなみに終了釦にてメディアプレーヤーも終了する事はできますか?