やりたいことは、PowerPointのスライドショーでリアルタイムで変る時計を表示したいのですが。
PowerPointのVBでは、タイマーコントロールがないし、実行開始イベントが何を使えばいいのかわかりません。
どなたか、回答宜しくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

下記の方法ではダメですか?



最悪の場合はフリーの時計ソフトか、オリジナルで作成した時計などをEXEで用意しておいて、アプリ起動時に起動するようにしてみては?

SetWindowPosで時計を最前面固定にしておいて、下記の処理と同様にアプリ終了時に強制終了させるようにしたら、一応回避できます。
(最終手段)
    • good
    • 1
この回答へのお礼

いろいろ、考えていただき有難うございます。
参考にさせていただきます。

でも、先ほど上司に「そんなに実現が難しいならなしで。」っと言われました(T_T)

お礼日時:2001/12/14 16:17

サンプルです。



先ほどの発言に間違いがあります。テキストボックスを透過させようとしましたが、WIN2000限定仕様のようです。

処理はMain関数で実行するだけです。
カッコ悪いですが、現在時間を表示します。



Option Explicit
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function IsWindow Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function CreateWindowEx Lib "user32" Alias "CreateWindowExA" (ByVal dwExStyle As Long, ByVal lpClassName As String, ByVal lpWindowName As String, ByVal dwStyle As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hWndParent As Long, ByVal hMenu As Long, ByVal hInstance As Long, lpParam As Any) As Long
Private Declare Function DestroyWindow Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function GetDesktopWindow Lib "user32" () As Long
Private Declare Function SetWindowPos Lib "user32" (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Private Declare Function SetWindowText Lib "user32" Alias "SetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String) As Long

Private Const WM_SETTEXT = &HC

Private Const WS_VISIBLE = &H10000000
Private Const WS_CHILD = &H40000000
Private Const WS_BORDER = &H800000

Private Const HWND_TOPMOST = (-1)
Private Const SWP_NOSIZE = &H1&
Private Const SWP_NOMOVE = &H2&
Private Const SWP_SHOWWINDOW = &H40&

Sub Main()
  'とりあえず実行
  ActivePresentation.SlideShowSettings.Run
  
  '時計開始
  Call DESP_CLOCK
End Sub

Sub DESP_CLOCK()
  Dim OwnerWnd  As Long
  Dim lngWinStyle As Long
  Dim labelWnd  As Long
  Dim strWork   As String
  Dim strMem   As String
  
  'プレゼンウィンドウのハンドルを得る
  OwnerWnd = FindWindow("screenClass", vbNullString)
  
  'ハンドルを得ることができないとき終了
  If OwnerWnd = 0 Then
    MsgBox "プレゼンウインドウが見つからない"
    Exit Sub
  End If
  
  'ウィンドウスタイルを指定して、STATICオブジェクトを作成
  lngWinStyle = WS_CHILD Or WS_VISIBLE
  labelWnd = CreateWindowEx(0, "edit", Now, lngWinStyle, _
           20, 20, 150, 20, _
           GetDesktopWindow, 0, 0, ByVal CLng(0))
  
  '作成したオブジェクトを最前面固定
  Call SetWindowPos(labelWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE Or SWP_SHOWWINDOW)
  
  'スライドが閉じるまでループ
  Do Until IsWindow(OwnerWnd) = 0
    '時刻の更新
    strWork = Now & vbNullChar
    If strMem <> strWork Then
      Call SetWindowText(labelWnd, strWork)
      strMem = strWork
    End If
    DoEvents
  Loop
  
  ' ウィンドウを破棄
  Call DestroyWindow(labelWnd)
  
End Sub
    • good
    • 0

うーむ、うーむ、うーむ、


そうですかー、、、

そこまでのカスタマイズを求めるのであれば、パワポを使用しないで、HTMLに出力してしまってはいかがですか?
JAVASやVBSを使用することで回避できそうな気がします。


どうしてもパワポにこだわりますか?

もしそうなら、一応反則技は存在しそうです。処理としては・・・
テキストボックスをAPIで作成し、透過形式にスタイルを変更して、テキストボックスの親ハンドルををパワポに設定します。
スライドのページが変わっても親ハンドルとなるパワポは、存在しつづけるので、テキストボックスは常に最前面に居続けます。
欠点としては環境に左右します。もし二つ以上のプレゼンが実行されているとき、どのプレゼンを親とするかがわかりません。

プレゼン中はハンドルが変わらないことは確認しましたが、実際に実現して検証を行わないと、正確なことは言えないので、自信は50%です。

この回答への補足

どうしても、パワポなんですよ。
普通のVBとかなら、時計なんて簡単にできるんですけどね~。パワポのVBがこんなに使いづらいとは・・・。

補足日時:2001/12/08 10:47
    • good
    • 0

パワポのVBAって初経験です。



プレゼン自体にイベント通知が発生しないようですね。
ですので、開始/終了時にフラグを立てて、コードから実行する必要があるようです。

詳細としては、
各スライドに時計表示用のラベルを用意する必要があります。
Mainモジュールから実行して起動してください。

注意事項としては、ESCキーなどで終了するのではなく、各スライドに終了ボタンを用意するか、あるいは各スライドの時計表示されるラベルのクリックイベントなどで、終了フラグを立てる必要があります。参考コードではCloseCommand関数を呼ぶと、コードが抜ける仕組みになってます。

これ以外の方法は、調べたところわかりませんでした。
うーむ、パワポのVBA・・・扱いづらい・・・

Private flgEnd As Byte

Sub Main()
  '各ラベルを透化
  Slide1.Label1.BackStyle = 0
  Slide2.Label1.BackStyle = 0
  
  'とりあえず実行
  ActivePresentation.SlideShowSettings.Run
  
  '時計開始
  Call DESP_CLOCK
End Sub

Sub DESP_CLOCK()
  flgEnd = 0
  Do While flgEnd = 0
    Slide1.Label1.Caption = Now
    Slide2.Label1.Caption = Now
    DoEvents
  Loop
End Sub

Public Sub CloseCommand()
  flgEnd = 1
End Sub

この回答への補足

回答有難うございます。
たしかに、回答の方法で実現できますが、スライドの枚数が100枚ともなると・・・。
普通に動いてくれるんでしょうか・・・?

スライドがForm_LoadやForm_Unloadみたいなイベントがあがれば楽なんですけどね~。

補足日時:2001/12/07 13:04
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QVB:「実行時エラー53 実行ファイルが見つかりません」

お世話になっています。
VBよりOracle8.1.6に接続し、指定エクセルのデータを
OracleDBにアップロードするというアプリケーションを
社内で配布しています。

一部のPCから、
「実行時エラー53 実行ファイルが見つかりません」
エラーが発生するのです。私のPCからは正常に動作しますし
先週まで成功してたのに今週いきなりこのような現象がおこりまして
悩んでおります。

ちなみに同アプリケーションの別フォームは全PCで正常に
動いていまして、違いといえば、上記エラーが出る場面のみ唯一
Working.aviファイルを実行中呼び出してるところだと思うんですが。

あと先週まで動いてたのに今週から動かないのも気になります。
今週前半にOSのアップデートを行ったのですがそれが原因
だったりすることはあるでしょうか、、
よろしくおねがいします

Aベストアンサー

フルパスで指定しているWorking.aviが、そのパスに存在しなくなったことが原因であると考えられます。
例えば、OSのアップデートにより、ドライブの構成が変わったとか、ありませんか?
あるいは、Working.aviがネットワーク上に存在するとしたら、Working.aviが存在するファイルサーバーの権限等がリセットされ、Working.aviを開けなくなっているとかはありませんか?

エラーが発生しているPCで、エクスプローラー等で、そのファイル自体を探してみて下さい。
そうすることにより、原因が明らかになると思います。

QVBのタイマーイベントについて

VBでタイマーイベントを利用してある処理を定期的に行なっている状態で
その他のイベント(スクロールバーはクリックされている時間が長いのでイベントが重なる可能性が高い)が発生すれば、どちらかが優先されるのでしょうか?
タイマーは、その他のイベントが発生しても時刻は刻まれているのでしょうか?
よろしくお願いします

Aベストアンサー

イベントが重なるといっても、
完全同時ということはありません。
少しでもはやい方にイベントが優先され、イベントは
キュー方式(ところてんみたいな感じ)でたまっていくので
順次実行されていきます。

タイマーの時刻はイベントに関係なく刻まれていきます。

Qマルチメディアタイマーコントロールの入手方法

マルチメディアタイマーコントロール
(MMTimer.ocs)の入手方法を教えて下さい。

又、マルチメディアタイマーはXPでも動作可能でしょうか?

Aベストアンサー

ってこれのことですか?
http://www1.harenet.ne.jp/cgi-bin/cgiwrap/unaap/chtml/chtml.cgi?key=mmtimer

動作環境はWindows95とかいてありますね。
XPで動くかは作者の方に確認してみてはいかがでしょうか。

というか、マルチメディアAPI使って自分で作ればいいと思いますけど。

QVB タイマーコントロールをインデックスを使用し130個作成しました。

VB タイマーコントロールをインデックスを使用し130個作成しました。
タイマーイベントの表記はどのようにするのでしょうか。
Private Sub Timer(0)_Timer()  ~ End Sub とするとエラーになります。タイマーコントロールのインデックスの使い方が分かりません。よろしくお願いします。

Aベストアンサー

配列にしたから正しく動作しないのでしょうか?
それとも元々動作していないのでしょうか?

質問本文では「エラーになります。」とのことで
先の回答への補足では「処理がなされません」

微妙に表現が異なるのは、状況が進展したけど完成形に至っていないと言うことでしょうか?

先程の回答で配列に関する問題はクリアになったのでしょうか?

「処理がなされません」とは具体的にどの様な状況でしょうか?
イベントが発生しない?
イベントは発生するが、思うように結果が得られない?

タイマーコントロールを130個も使う事の是非は別問題として
現在の状況など詳しく正確に記載してもらえないと何が起きて、何が問題なのかわかりません。

単純にEnabled属性が・・・ってな事では無いのですよね?

Qラインコントロールにクリックイベント

ラインコントロールにイベントが発生しないことは分かっています。

なので、自作しないといけないのかなと思っていますが、良い方法が見つかりません。クリックイベントが発生するようなラインのユーザーコントロールの作り方を教えていただけませんか?

あるいは、フォームのクリックイベントで、そこがラインコントロール上か否かという判断をさせる方法でもいいです。

よろしくお願いします。

Aベストアンサー

縦線や横線のラインなら簡単ですが、斜めのラインは判定が難しいですね。
最も簡単な手法はラインに特別な色をつけて、フォームクリック時にその色を
取得すればどうでしょうか。
以下のコーディングでラインコントロールをクリックした時に、
その、色をゲットできるので、後はその色番号でクリックされたとみなせばよいでしょう。
色を変えたくないなら、タンジェント等の三角関数がいるような気がします。

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Debug.Print Point(X, Y)
End Sub


このカテゴリの人気Q&Aランキング

おすすめ情報