PowerPoint (全般)

PowerPoint 全般に関する話題を扱うフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(Windows 7 Home Premium : PowerPoint 2003)
本当にかんたんなことで・・・
投稿日時: 17/02/07 23:26:31
投稿者: たのきち

 
「実行時エラー438 オブジェクトは、このプロパティ、またはメソッドをサポートしていません」
というエラーが出ます。
 
Set Sld = actPre.Windows(1).Selection.SlideRange(1)
という記述で止まります。
一体、「Windows(1).Selection.SlideRange(1)」ってなんでしょうか?
1枚目のスライド?
 
 
(以前、自分で作ったマクロなのですが、初期化したことで何か環境が変わったのだと思います。
 すっかり忘れてしまって何が問題なのか全くわからなくなってしまいました。)

回答
投稿日時: 17/02/08 10:38:15
投稿者: んなっと

「(前半省略)現在選択しているスライドのうちの1枚」なので、
 例えば編集画面の表示モードがスライドマスタ表示ならエラーになると思います。
ほかにもあります。
  
具体的なコードだと、下のtest1はエラーにならないが、
test2は実行時エラーになる。
  
Sub test1()
   Dim actPre As Presentation
   Dim Sld As Slide
   Set actPre = ActivePresentation
   actPre.Windows(1).ViewType = ppViewNormal
   Set Sld = actPre.Windows(1).Selection.SlideRange(1)
   MsgBox Sld.SlideID
 End Sub
   
 Sub test2()
   Dim actPre As Presentation
   Dim Sld As Slide
   Set actPre = ActivePresentation
   actPre.Windows(1).ViewType = ppViewSlideMaster
   Set Sld = actPre.Windows(1).Selection.SlideRange(1)
   MsgBox Sld.SlideID
 End Sub

投稿日時: 17/02/09 15:04:21
投稿者: たのきち

ご返答ありがとうございました。
 
過去の私が「現在のスライド」を書いているので
'現在のスライド
  Set Sld = actPre.Windows(1).Selection.SlideRange(1)
    
現在のスライドを取得して、Setするのだと思うのですが
それを行うためにはどうしたら良いものなのでしょうか?
 
初期画面でスライドを用意しても変化なしです。

回答
投稿日時: 17/02/09 15:52:37
投稿者: んなっと

コードに問題がなければ、次は
 
実行時エラー 438 Windows Update
 
でGoogle検索してみてください。当てはまっているかもしれません。

投稿日時: 17/02/09 20:11:01
投稿者: たのきち

ありがとうございます。
 
エラーが変化しました。
 
実行時エラー91 になり
オブジェクト変数またはWithブロック変数が設定されていません
 
となりました。
 
 
見たことはよくあるエラーなんですが、
過去に動いていたわけですが
設定の違いで
この手のエラーがでるんでしょうか…
 

回答
投稿日時: 17/02/09 20:22:11
投稿者: んなっと

ツール→参照設定 で "参照不可"になっている項目はないですよね?
 
どうもこれだけの情報ではわかりません。
エラーが出る必要最小限のコードを作成して、すべて貼り付けるのは面倒なのでしょうね。
以後、無視します。

回答
投稿日時: 17/02/17 23:04:17
投稿者: ChemiPhys
投稿者のウェブサイトに移動

こんにちは。actPreというオブジェクト変数を書かれているようですが,その中身にちゃんとオブジェクトは入っていますでしょうか。
 
Set Sld = actPre.Windows(1).Selection.SlideRange(1) の前の行に
 
Set actPre=ActivePresentation
 
という一文を入れてみてください。パワーポイントのプレゼンテーションオブジェクトが中に入っていないと,該当の文章はうまくいかないと思います。
 
これだけでわたしの環境ではうまく動きましたが,もし,モジュールの先頭に
 
Option Explicit と書かれていれば,変数の宣言をしないとVBAが怒るので
 
その場合は,
 
Dim actPre As Presentation
Dim Sld As Slide
 
Set actPre = ActivePresentation
Set Sld = actPre.Windows(1).Selection.SlideRange(1)
 
こんな感じでまず actPre と Sldという変数が何かを宣言した後,Setで中身を入れてあげてください。
 
変数の型がわからない場合は
 
Dim actPre,Sld
 
と型を決めないで宣言すると大丈夫ですが,型宣言はインテリセンスで助けてくれるので,きちんと型を宣言して上げた方がいいと思います。

投稿日時: 17/02/18 00:09:51
投稿者: たのきち

リアクションが遅くてすいません。
 
   
 Set actPre = ActivePresentation
 Set Sld = actPre.Windows(1).Selection.SlideRange(1)
を上記のように入れました。
 
宣言は(*はどの他色々書いてあるものを略しています)
Private Sub excel_data(actPre As Presentation, *****)
 
追記した際のデバックは
実行時エラー2147188160(800482240)
selection(不明なメンバー):無効な要求です。適切な項目が選択されていません。
 
初期化したことによる何かの設定変化なのですが
全く思い当たらないので・・・

回答
投稿日時: 17/02/18 00:23:39
投稿者: ChemiPhys
投稿者のウェブサイトに移動

こんにちは。なるほど,そこはとても大事な部分だと思います。
 
そのプロシージャの最初の引数でプレゼンテーションを渡すように書かれていたんですね。
 
さらなる背景がちょっとわかりにくいんですが,
 
そのプロシージャを実行する際に
 
call excel_data activepresentation, ・・・その他の引数
 
callは省略しても構いません
 
という風に引数としてactivepresentationを与えてみるのはいかがでしょうか。
 
このようになる場合,前回コメントした
 
Dim actPre as Presentation
Set actPre=ActivePresentation
 
は重複していると怒られますので,削除するかコメントアウトしてあげてください。
 
何度も書き直してしまいました(;´▽`A``

投稿日時: 17/02/18 00:45:59
投稿者: たのきち

さっそくのご返答
ありがとうございます。
 
プログラムの大きながれとしては
パワポ 起動
→マクロ→エクセルからデータ取得(※今ココ)→パワポに貼り付け
というマクロなんです。
PC初期化前は動いていたのですが
初期化後、動かなくなりました。
 
>call excel_data activepresentation, ・・・その他の引数
プロシージャ前とはどこになりますか?
 
 Set Sld = actPre.Windows(1).Selection.SlideRange(1)
の直前ではないですよね?

回答
投稿日時: 17/02/18 00:55:06
投稿者: ChemiPhys
投稿者のウェブサイトに移動

こんにちは。
 
Private Sub excel_data(actPre As Presentation, *****)
というように,書かれていましたが,このマクロは いろいろな引数を与えてあげないと動かないように作られていると思います。ですから,直接このマクロを実行できていないのではないかと思うのです。
 
このマクロを呼び出す記述がたぶんどこかにあって,( excel_dataという文字で検索すると見つかるとは思いますが)そこで一つ目の引数でActivePresentationを渡さないといけないように作られているんじゃないかと想像しています。ですので,その記述のところでActivePresentationという言葉を・・とおもったのです。
 
ただ,根本的な話にもどれば,とにかくそのプレゼンテーションのスライド1を Sldという変数に入れればよいわけですので,
 
先ほどのコメントで書かれていた
 
 Set Sld=actPre.Windows(1).Selection.SlideRange(1)
 
これをコメントアウトしていただいて,
 
Set Sld=ActivePresentation.Slides(1)
 
と書かれてみてください。同じオブジェクトを示しますので,うごくんじゃないかなーと思います。

トピックに返信