[[20080910003136]] 『GIF画像をアニメーション再生するには?』(マイケル) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『GIF画像をアニメーション再生するには?』(マイケル)
また質問させて下さい。
エクセルのワークシート上でアニメを再生しようとしたところ、他のサイトで参考になるコード(下記)があったので実行してみましたが、「コンパイルエラー、SubまたはFunctionが定義されていません」とのエラーメッセージが出て実行できません。
どこが悪いのでしょうか?
ちなみに、エクセルファイルとGIF画像(10枚)の両方ともデスクトップ上にあります。
もし、上手く再生ができれば、これをファイルを開いた時に再生したいのですが。

Sub TEST1()
Dim WrkPicture(9) As Picture
Dim i As Long

    For i = 0 To 9
        Set WrkPicture(i) = ActiveSheet.Pictures.Insert(LCase(ThisWorkbook.Path _
        & "\img\" & i & ".gif"))
        If i <> 0 Then
            WrkPicture(i - 1).Delete
            Set WrkPicture(i - 1) = Nothing
        End If
        Call Sleep(100)
        DoEvents
    Next i
    WrkPicture(i - 1).Delete
    Set WrkPicture(i - 1) = Nothing
End Sub

Excel2002,WindowsXP


 SleepというSubを用意していますか?
 もしかすると下の一行が抜けているのかもしれません。
 Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

 このように先頭に入れてみてください。
 Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
 Sub TEST1()
  ・
  ・
  ・
 (やっちん)


やっちん様からコメントして頂いたコードと同じ内容のコード(下記)が、参考にしたサイトにもあったのを思い出しました。初めはコメントの一部かと思い、コードに記述していませんでした。

' モジュール宣言部に記述ここから −−−−−−−−−−−−−−−−−−−−−

 Public Declare Sub Sleep Lib "kernel32" (ByVal dwmilliseconds As Long)
' モジュール宣言部に記述ここまで −−−−−−−−−−−−−−−−−−−−−

そこで、やっちん様から提示して頂いたコードと上記コードの両方を先頭行に追加してそれぞれ試してみましたが、どちらも「コンパイルエラー:End Sub、End FunctionまたはEnd Property以降はコメントのみが記述できます」とのエラーメッセージが出て実行出来ませんでした。
何か他にエクセルファイルやGIFファイルの保存先等に問題があるのでしょうか?
(マイケル)


 こんな風にしていませんか?
 Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
 Sub TEST1()
 ' モジュール宣言部に記述ここから −−−−−−−−−−−−−−−−−−−−−
 Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
 ' モジュール宣言部に記述ここまで −−−−−−−−−−−−−−−−−−−−−
 Sub TEST1()
 Dim WrkPicture(9) As Picture
 Dim i As Long
    For i = 0 To 9
        Set WrkPicture(i) = ActiveSheet.Pictures.Insert(LCase(ThisWorkbook.Path _
        & "\img\" & i & ".gif"))
        If i <> 0 Then
            WrkPicture(i - 1).Delete
            Set WrkPicture(i - 1) = Nothing
        End If
        Call Sleep(100)
        DoEvents
    Next i
    WrkPicture(i - 1).Delete
    Set WrkPicture(i - 1) = Nothing
 End Sub

 下のようにしてください。
 ' モジュール宣言部に記述ここから −−−−−−−−−−−−−−−−−−−−−
 Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
 ' モジュール宣言部に記述ここまで −−−−−−−−−−−−−−−−−−−−−
 Sub TEST1()
 Dim WrkPicture(9) As Picture
 Dim i As Long
    For i = 0 To 9
        Set WrkPicture(i) = ActiveSheet.Pictures.Insert(LCase(ThisWorkbook.Path _
        & "\img\" & i & ".gif"))
        If i <> 0 Then
            WrkPicture(i - 1).Delete
            Set WrkPicture(i - 1) = Nothing
        End If
        Call Sleep(100)
        DoEvents
    Next i
    WrkPicture(i - 1).Delete
    Set WrkPicture(i - 1) = Nothing
 End Sub

 (やっちん)


やっちん様の「下のようにしてください。」から下の部分を全てコピーして実行してみたところ、今度は「実行時エラー'1004':PicturesクラスのInsertプロパティを取得できません」のエラーメッセージが表示されました。
(マイケル)

 試してはないのですが、デスクトップに全てあるのであれば
 >        Set WrkPicture(i) = ActiveSheet.Pictures.Insert(LCase(ThisWorkbook.Path _
 >        & "\img\" & i & ".gif"))
           ~~~~~~~

 こうしたらどうですか?
        Set WrkPicture(i) = ActiveSheet.Pictures.Insert(LCase(ThisWorkbook.Path _
        & "\" & i & ".gif"))
          ~~~

 もしくは、デスクトップに「img」という名前のフォルダを作成してその中に画像を入れてください。

 >ThisWorkbook.Path  & "\img\" & i & ".gif"
 元々のコードは「img」フォルダに画像ファイルが入っていることになっています。

 (やっちん)


う〜ん、何とも分かりません。
 質問させて頂いた当初からGIFファイルはimgフォルダの中に入っているし・・・、全てやっちん様の指示通りになっているのですが・・・。
(マイケル)

 私の方では動きましたよ。
 画像ファイルは、「0.gif」〜「9.gif」になっていますか?
 シートを表示した状態で実行していますか?
 (やっちん)


おかしいですねぇ。小生は標準モジュールにコードを記述して、ワークブックを開いた状態にしてマクロを実行しているのですが、どこがおかしいのでしょうか・・・。

このコードは10個のGIFファイルがひとつずつ連続して表示されるコードの様ですが、もし実行出来るのであれば、10個のGIFファイル全てがある時間(5〜10秒程度)一辺に表示されるコードでも構わないのですが。


 後はパスが正しいのかどうかくらいしか思いつきませんね。
 「For i = 0 To 9」 の前の行に 
 「msgbox ThisWorkbook.Path」を入れて実行してみてください。
 デスクトップまでのパスになっているでしょうか?

 もう一つの検証として
 >ThisWorkbook.Path _
 >       & "\img\" & i & ".gif"
 この部分を直接ファイル名までのパスを記述して動作するようであれば
 ファイル名までのパスを作成している部分が実際のファイルの格納先と
 合っていないということになります。
 もしかしてエクセルファイルもimgフォルダに入れていませんか?
 (やっちん)


 >「msgbox ThisWorkbook.Path」を入れて実行してみてください。
 「実行時エラー'1004':PicturesクラスのInsertプロパティを取得できません」のエラーとなりました。 

 >もう一つの検証として
 >ThisWorkbook.Path _
 >       & "\img\" & i & ".gif"
 >この部分を直接ファイル名までのパスを記述して動作するようであれば
 >ファイル名までのパスを作成している部分が実際のファイルの格納先と
 >合っていないということになります。
  これも同じ「実行時エラー'1004':PicturesクラスのInsertプロパティを取得できません」のエラーとなりました。

 >もしかしてエクセルファイルもimgフォルダに入れていませんか?
 imgフォルダの中はgifファイルのみです。

 やっちん様の方で問題なく実行できたとすれば、コード自体には問題ないという事ですよね。
 あとは、エクセルのバージョンとかが関係するのでしょうか?
 ちなみに、小生のはExcel2002です。


 こちらはExcel2003です。

 >「msgbox ThisWorkbook.Path」を入れて実行してみてください。
 >「実行時エラー'1004':PicturesクラスのInsertプロパティを取得できません」のエラーとなりました。
 パスが表示されませんでしたか?
 実行時エラーなのでエラー箇所より先に表示されるはずですが。
 エクセルファイルがデスクトップにないとうまく動きません。

 Imgフォルダの画像をデスクトップにあると表現されているのでエクセルファイルもどこかの
 フォルダに入れられているのでしょうか?

 それもなければ仰るようにバージョンの違いでしょうか。
 (やっちん)


 >パスが表示されませんでしたか?
 >実行時エラーなのでエラー箇所より先に表示されるはずですが。
 >エクセルファイルがデスクトップにないとうまく動きません。
 「実行時エラー'1004'・・・」のエラーメッセージしか表示されません。

 >Imgフォルダの画像をデスクトップにあると表現されているのでエクセルファイルもどこかの
 >フォルダに入れられているのでしょうか?
 エクセルファイルはデスクトップ上にあります。(フォルダには入れてません)

ひとつ気になるのは、やっちん様に指摘されて後で追加記述した先頭行のコードですが、下記の様にSubプロシージャの開始行との間に区切りの線が入ってしまいます。
これが影響しているのでしょうか?

Public Declare Sub Sleep Lib "kernel32" (ByVal dwmilliseconds As Long)


Sub TEST1()

(マイケル)


何時も勉強させて頂いております
 気になるものはためさせていただきスキルアップを図っているエクセル初心者です
自分は以下のようなコードで試しましたところ動作しました

 ' モジュール宣言部に記述ここから −−−−−−−−−−−−−−−−−−−−−
 Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
 ' モジュール宣言部に記述ここまで −−−−−−−−−−−−−−−−−−−−−
 Sub TEST1()
 Dim WrkPicture(15) As Picture
 Dim i As Long

 For i = 0 To 15
    Set WrkPicture(i) = ActiveSheet.Pictures.Insert(LCase(ThisWorkbook.Path _
        & "\" & i & ".gif"))

        If i <> 0 Then
            WrkPicture(i - 1).Delete
            Set WrkPicture(i - 1) = Nothing
        End If
        Call Sleep(100)
        DoEvents
    Next i
    WrkPicture(i - 1).Delete
    Set WrkPicture(i - 1) = Nothing
 End Sub

 フォルダ名を「動くエクセル」
「動くエクセル」のフォルダ内に
エクセルのシートとgif(0〜15)まで作成しました
全く参考にならないと思いますが
動作したので報告をしたくなってしまいました
申し訳ありません
今後とも勉強させてください宜しくお願いいたします
環境は、XPで2002です
失礼します         (アライ)


 区切り線は必ず出ます。全く影響はありません。
 アライさんの検証で2002でもコードの挙動は変わらないということでしょうね。

 やっぱり気になるのは、画像ファイルまでのパスです。
 存在しないパスを指定すると「PicturesクラスのInsertプロパティを取得できません」
 と出るのでそれが原因ではないかと思うのですが。

 以下のコードで表示されるパスがファイル名まで正しいのか確認してみてください。

 ' モジュール宣言部に記述ここから −−−−−−−−−−−−−−−−−−−−−
 Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
 ' モジュール宣言部に記述ここまで −−−−−−−−−−−−−−−−−−−−−
 Sub TEST1()
 Dim WrkPicture(9) As Picture
 Dim i As Long
    For i = 0 To 9
        MsgBox ThisWorkbook.Path & "\img\" & i & ".gif"
        Set WrkPicture(i) = ActiveSheet.Pictures.Insert(LCase(ThisWorkbook.Path _
        & "\img\" & i & ".gif"))
        If i <> 0 Then
            WrkPicture(i - 1).Delete
            Set WrkPicture(i - 1) = Nothing
        End If
        Call Sleep(100)
        DoEvents
    Next i
    WrkPicture(i - 1).Delete
    Set WrkPicture(i - 1) = Nothing
 End Sub

 (やっちん)


やっちん様、
 エクセルファイルとGIFファイルが格納されている場所は、MsgBoxに表示されるパス名通りです。
 そこで、コードのPath_ &以下を正しいパス名に変えてやってみましたが、やはり「PicturesクラスのInsertプロパティを取得できません」のエラーとなります。
 エクセルファイルとGIFファイルのフォルダ\imgの格納先をデスクトップからMy Documentに変えてやってみても結果は同じでした。
(マイケル)

 不思議ですね。パス自体に問題があるのでしょうか?
 パスを変えてみましょうか。
 >        Set WrkPicture(i) = ActiveSheet.Pictures.Insert(LCase(ThisWorkbook.Path _
 >        & "\img\" & i & ".gif"))
 これを
        Set WrkPicture(i) = ActiveSheet.Pictures.Insert("c:\0.gif")
 こうしてcドライブ直下に0.gifをコピーしても動きませんか?

 ここまでやって動かないとなると分かりませんね。
 (やっちん)


やっちん様、
 当サイトが休校中だったため、返事が遅れました。
 最後まで色々とアドバイスしてくれてありがとうございました。
 アライ様も問題なく実行出来ている事から、コード的にはなんら問題は無いという事は分かりました。
 自分なりにこの後も検証を続けていきたいと思います。

 アライ様もコメントを寄せて頂きありがとうございました。

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.