PowerPoint (全般)

PowerPoint 全般に関する話題を扱うフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(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)
 
と書かれてみてください。同じオブジェクトを示しますので,うごくんじゃないかなーと思います。

投稿日時: 17/03/04 21:37:07
投稿者: たのきち

レスポンス悪くてすみません。
 >Set Sld=ActivePresentation.Slides(1)
でその部分はクリアしたようです。
  
次に 直後の
  
’今の作業で貼り付けたばかりの画像を取得
  With Sld.Shapes
     Set Shp = .Item(.Count) ←★ここで泊まる。
  End With
   
の★で止まります。
  
これをスキップして動かしたところ全体は動きました。
ただし、結果しかわからないのですが
各ページに貼り付けられるはずのテキストが
 スライド1枚目に貼り付けられています。
 (スライドごとに画像とエクセルのテキストを所定の場所に貼っていくプログラムです)

回答
投稿日時: 17/03/04 21:47:18
投稿者: ChemiPhys
投稿者のウェブサイトに移動

こんにちは
 
Set Sld=ActivePresentation.Slides(1)
というのは,文字通り,そのプレゼンテーションのスライド1を指定しているものです。
 
>各ページに貼り付けられるはずのテキストが
と書かれていますので,そのマクロを実行するたびに目的となるスライドを指定していたはずです。
 
そのために,
 
actPre.Windows(1).Selection.SlideRange(1)
 
と書かれていて,表示されているスライドを毎回取得して,そこに貼るという挙動をしていたのだと思います。
 
前後のvbaのコードがわからないと,そこらへんを突き止めることができないわけなんですが,いくつかスライドの取得方法がありますので,書いてみます。試してみてください。
 
Set Sld=Activewindow.Selection.SlideRange(1)
Set Sld=Activewindow.View.Slide
 
とりあえず,このどちらかでいかがでしょう。
あと
With Sld.Shapes
     Set Shp = .Item(.Count) ←★ここで泊まる。
End With
 
この部分は
set Shp=Sld.Shapes(Sld.Shapes.Count)
に変えてみてはいかがでしょうか。

投稿日時: 17/03/04 22:13:58
投稿者: たのきち

ありがとうございます。
 
 
>set Shp=Sld.Shapes(Sld.Shapes.Count)
で回避できたのですが
どうやら、アクティブスライドにテキストを貼る作業の指定に影響しているようで
 
> Set Shp = .Item(.Count)
の Shpは
別のPrivate Sub

Set Shp = Sld.Shapes.PasteSpecial(ppPasteText)(1)
のような設定をしているのですが
その値を、このモジュール?で
取得できてないのかもしれません。
前述の
Set Sld = actPre.Windows(1).Selection.SlideRange(1)
も別モジュールで
 Set actPre = ActivePresentation
とセットしているようです。
(モジュールを別モジュールに引き継ぐ仕様にしていたので、できたはずなんですが…)
 
 
まだ、スライドがない場合とある場合
どうしているのでしょうか?
どちらかに統一しているのでしょうか?
 
スライドがない場合に設定したほうが良い気もしますが
今の仕様はA5で作っていますので
A4にしたいとか変化したときのことなど考えると同判断したら良いのかわかりません。
 

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

>set Shp=Sld.Shapes(Sld.Shapes.Count)
で回避できたのですが
どうやら、アクティブスライドにテキストを貼る作業の指定に影響しているようで
 
> Set Shp = .Item(.Count)
 
Set Shp = Sld.Shapes.PasteSpecial(ppPasteText)(1)
 
同じ変数Shpを用いられていますが,他のものを代入した時点でその代入したものに変わると思うので,これも影響は少ない気がします。
 
Set Sld = actPre.Windows(1).Selection.SlideRange(1)
 Set actPre = ActivePresentation
 
actPreはそのモジュールの一番上の宣言部分で宣言すると,モジュールレベルで共有の変数になるので,そこも書き方によってありうる話ですね。Publicで宣言するとさらに他のモジュールからも参照できます。順番は気を付けないといけませんけれど。
 
スライドのあるなしに関してですが,以前私が書いた
ActivePresentation.Slides(スライド番号)という書き方は確かにそのスライド番号のスライドが無いと動かないので,あまり融通が利きません。ですが,
 
Set Sld=Activewindow.Selection.SlideRange(1)
Set Sld=Activewindow.View.Slide
 
こちらの書き方は,選んでいるスライドに対して実行するので,編集モードにさえ気を付ければ,動く可能性は高いと思います。
ただ,「選んでいるスライドに対して」行うという書き方になるため,目的のスライドに移動するという部分がしっかり動作しているかが気になります。
 
パワーポイントのマクロはExcelと違い問題点がよくわからない止まり方をすることがあるので,ブレークポイントを設定したりして,どこらへんまで自分の想定通りに動いているか確認しながら見直してみられると改善するかもしれません。

投稿日時: 17/03/04 22:56:01
投稿者: たのきち

ご返答ありがとうございます。
 
> Set Shp = .Item(.Count)
のエラーを書くのを忘れておりました。
 
 
指定したコレクションに対するインデックスが境界を超えています
 
とのことです。
 
貼り付けたい画像が大きすぎるということですか?

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

たのきち さんの引用:
ご返答ありがとうございます。
 
> Set Shp = .Item(.Count)
のエラーを書くのを忘れておりました。
 
指定したコレクションに対するインデックスが境界を超えています
 
とのことです。
 
貼り付けたい画像が大きすぎるということですか?

 
.でかかれているため,前後に依存するのでなんとも言えません。もっと前後または全体のコードを見たいところです。とりあえず,エラーが出ている状態でデバックにして,イミディエイトウィンドウで
?.item
?.Count
 
が適切に数字として返事がくるのか内容を確認したいですし,ローカルウィンドウを見ると,とても詳細なデータを返してくれるので,もし見られていなかったらローカルウィンドウを見てみると答えにつながっていくかもしれません。

投稿日時: 17/03/05 14:52:31
投稿者: たのきち

ご連絡、アドバイスありがとうございます。
 
このモジュールに来る前のモジュールで
       '画像ファイルかの確認(jpg もしくは png もしくは gif の場合)
       If (Dir(LCase(objFile)) Like "*.jpg" Or Dir(LCase(objFile)) Like "*.png" Or Dir(LCase(objFile)) Like "*.gif") Then
 Set actPre = ActivePresentation '現在のプレゼンテーション
 
となっていますが、 If の条件に当てはまってないようです。
指定したフォルダに画像ファイルが入っているのですが…(大文字小文字対策はしてるはずです)
ここで Set actPre = ActivePresentation がセットされてないことがわかりました。
(今更すみません)

回答
投稿日時: 17/03/05 17:46:50
投稿者: ChemiPhys
投稿者のウェブサイトに移動

たのきち さんの引用:
ご連絡、アドバイスありがとうございます。
 
このモジュールに来る前のモジュールで
       '画像ファイルかの確認(jpg もしくは png もしくは gif の場合)
       If (Dir(LCase(objFile)) Like "*.jpg" Or Dir(LCase(objFile)) Like "*.png" Or Dir(LCase(objFile)) Like "*.gif") Then
 Set actPre = ActivePresentation '現在のプレゼンテーション
 
となっていますが、 If の条件に当てはまってないようです。
指定したフォルダに画像ファイルが入っているのですが…(大文字小文字対策はしてるはずです)
ここで Set actPre = ActivePresentation がセットされてないことがわかりました。
(今更すみません)

 
私,Dir関数は苦手なんですが,同じようなものを書いてみてなんかうまく動きませんでした。Dir関数とファイル照合部分を分離するのはどうでしょう。下記のように書いてみました。
ActivePresentation.Path の部分を目的のパスに書き換えてください。
これでうまく動くなら,目的のフォルダのファイル名をイミディエイトウィンドウにどんどん吐き出していき,拡張子でヒットしたらStopで止まるはずです。
 
想定通りの動きをするかどうかはチェックできると思います。
 
Sub test()
 
Dim objFile As String
objFile = Dir(ActivePresentation.Path & "\", vbNormal)
Do While objFile <> ""
    If LCase(objFile) Like "*.jpg" Or LCase(objFile) Like "*.png" Or LCase(objFile) Like "*.gif" Then
        Stop
    End If
    Debug.Print objFile
    objFile = Dir()
Loop
End Sub

投稿日時: 17/03/07 18:16:58
投稿者: たのきち

前進しました。
 
 
 If (Dir(LCase(objFile)) Like "*.jpg" Or Dir(LCase(objFile)) Like "*.png" Or Dir(LCase(objFile)) Like "*.gif") Then
 
もしかしてと思って、取得する拡張子「.JPG」を 大文字→小文字にしたら、動きました(ただし、この記述で大文字小文字の区別はしないはずなのですが、間違っていますか?)。
 
 
次に止まった場所が
 
Set actSld = ActiveWindow.Selection.SlideRange(1) '現在表示しているスライド(選択しているスライドの1番目という意味)
 
  ' 画像の挿入 SaveWithDocument:=msoTrueは画像の縦横比固定
actSld.Shapes.AddPicture( _
            FileName:=objFile.Path, _
            LinkToFile:=msoFalse, _
            SaveWithDocument:=msoTrue, _
            Left:=0, _
            Top:=0).Select ←ココで止まりました。
 
Shapeは不明なメンバー):無効な要求です。図形を選択するには、表示がアクティブでなければなりません
 
というエラーメッセージです。
どうやら、この前の作業で添付した画像をアクティブにしていないようです。
(アクティブに手動で行えば、動きました)
 
その次は、
 
   'ユーザーフォームから変数取得
With UserForm1 ←ココで止まります
 TextBox1 = .TextBox1.Value
 TextBox2 = .TextBox2.Value
 
エラーメッセージは、「Listcountメソッドは失敗しました。CommandBarComboBoxオブジェクト」
という状態です。
フォーム名は「 UserForm1」で間違いないです。
 
 
 

回答
投稿日時: 17/03/07 21:30:37
投稿者: ChemiPhys
投稿者のウェブサイトに移動

Option Explicit
 
actSld.Shapes.AddPicture(FileName:=objFile.Path, inkToFile:=msoFalse, _
    SaveWithDocument:=msoTrue, Left:=0, Top:=0).Select
 
 
こちらについては , Selectしてその後に何かをするのでしょうか。
もししないのであれば,
 
actSld.Shapes.AddPicture FileName:=objFile.Path, _
    LinkToFile:=msoFalse, SaveWithDocument:=msoTrue, _
    Left:=0, Top:=0
 
としてしまい,括弧()を外してしまえば返り値を必要とせず動く気がします。
Selectして,ActiveWindow.Selection.ShapeRange(1)など引き続き何かをするならほかの方法を考えないとですね。
 
もう一つのほうは , 状況を計り知るための情報が私の知識内では足りませんので, 後者に関してはコメントできないですね。。
 

投稿日時: 17/03/07 22:27:01
投稿者: たのきち

原因が不明なのですが動いて完成しました…。
 
行ったのはVBAではなく
エクセルの並びを変えたことと
画像のファイル名を変更したくらいです。
 
 
そんなことってあるのでしょうか

回答
投稿日時: 17/03/08 18:58:09
投稿者: ChemiPhys
投稿者のウェブサイトに移動

たのきち さんの引用:
原因が不明なのですが動いて完成しました…。
 
行ったのはVBAではなく
エクセルの並びを変えたことと
画像のファイル名を変更したくらいです。
 
 
そんなことってあるのでしょうか

 
完成したのは何よりですね。
 
エクセルの並び等を前提としてもし組まれたりしていたら,十分ありうるのではないでしょうか。
 
ファイル名についても。。
 
まず動くところからスタートして,状況が変わってもエラーが出ないように改善していくと,さらに使い勝手はよくなるでしょうね。おめでとうございます。

投稿日時: 17/03/08 22:52:53
投稿者: たのきち

長々とありがとうございました。