2016-08-19 4 views
-1

Word文書を開き、名前でCommandButtonオブジェクトを探すExcelマクロを作成しています。オブジェクトが見つかると、そのオブジェクトに関連付けられているピクチャがあるかどうかを確認しようとします。オブジェクトの位置を特定しているようですが、画像のハンドルを参照しようとすると「壊滅的」な死があります。私はこれを前にやっていて、写真のハンドルがゼロであるかどうかを調べるのが私のために働いています。何がここにあるのかわからない、誰かが私が逃しているものを見ることができるかもしれない?Excel内のWord CommandButtonオブジェクトで動作しない

Set objWord = CreateObject("Word.Application") 
Set objDoc = objWord.Documents.Open(strFileName) 
objWord.Visible = True 

Set cmdSignatureButton = fncGetCommandButtonByName("NameOfCommandButtonImLookingFor", objDoc) 
MsgBox "h=" & cmdSignatureButton.Picture.Handle 
' It dies here, giving the error: 
' Runtime error -2147418113 (8000ffff) 
' Automation error 
' Catastrophic failure 



Private Function fncGetCommandButtonByName(strName As String, objDoc As Word.Document) 
    Dim obj As Object 
    Dim i As Integer 

    For i = objDoc.InlineShapes.Count To 1 Step -1 
     With objDoc.InlineShapes(i) 
      If .Type = 5 Then 
       If .OLEFormat.Object.Name = strName Then 
        Set fncGetCommandButtonByName = .OLEFormat.Object 
    MsgBox "Found the Command Button object"  ' Seems to find the CommandButton object here 
        Exit Function 
       End If 
      End If 
     End With 
    Next 
End Function 
+1

コードがアクセスするまでにオブジェクトを完全にロードできないのではないかと思います。これまでに作業して以来、イメージが大きくなったのか、それ以上のイメージがありますか?テストのために、 'objWord.Visible = True'の後にこの[一時停止機能](http://stackoverflow.com/questions/6960434/timing-delays-in-vba)を使用して3秒間の短い一時停止を追加するとどうなりますか? 'pause(3)' –

+0

この場合、コマンドボタンオブジェクトに画像はありません。それはハンドルのためにゼロを返すべきです。 –

+0

多分。ピクチャは何もありません。 – Slai

答えて

0

[OK]を、私は、少なくとも、アプローチを持っていると思います。私は次の問題に進みました。これは非常に似ています。この場合、Excelスプレッドシート内のコマンドボタン内の画像を探していますが、私はAccessからそうしています。フープを飛び越えてExcelファイルを調べるためにAccess VBAを取得する代わりに、Accessが呼び出すExcelファイルにPublic Functionを配置します。 Excelはイメージのボタンをチェックするのに何の問題もないので、私の答えを返します。

パブリック関数の実行方法を理解していなければならず、それは十分に簡単でした。フィードバックありがとう、Ryan。あなたの仕事がなぜうまくいかなかったのかまだ分かりませんが、少なくとも私はそれを取りました。

0

この機能は問題なく実行できました。コードをステップ実行して、ドキュメントが最初に完全に読み込まれているかどうかを確認することができます。

ここでは、元の質問のフォーマットと一致するように編集されたコードがあります。

Dim objWord As Object: Set objWord = CreateObject("Word.Application") 
    Dim objDoc As Object: Set objDoc = objWord.Documents.Open(strFileName) 

    objWord.Visible = True 
    Dim cmdSignatureButton As Object 

    Set cmdSignatureButton = fncGetCommandButtonByName("CommandButton1", objDoc) 

    If Not cmdSignatureButton Is Nothing Then 
     'Do something when it isn't nothing 
     MsgBox "h=" & cmdSignatureButton.Picture.Handle 
    Else 
     'Something here 
    End If 

Private Function fncGetCommandButtonByName(strName As String, objDoc As Word.Document) As Object 
    Dim i As Integer 

    For i = objDoc.InlineShapes.Count To 1 Step -1 
     With objDoc.InlineShapes(i) 
      If .Type = 5 Then 
       If .OLEFormat.Object.Name = strName Then 
        Set fncGetCommandButtonByName = .OLEFormat.Object 
        Exit Function 
       End If 
      End If 
     End With 
    Next 

    Set fncGetCommandButtonByName = Nothing 'set it equal to nothing when it fails 
End Function 

あなたはまだそのエラーを受信して​​いる場合、私はそれは絵が完全にロードされていないとは何かを持っていることを考えています。もしそうなら、私はそのエラーをキャッチするためにいくつかのエラー処理を追加し、ピクチャのハンドルが利用可能かどうかを確認するためにもう一度リトライを処理します。私はそのコードを実行するとき

は、ここで私が得るものです:

Badly stretched picture of my face on a button

+0

私はこれをやっていて、まだエラーが出ています。 5秒待つためにPauseコマンドを入力してもそれは役に立ちません。実際、私が見ているコマンドボタンには、それに関連付けられた画像がありません(それ以外の時にはそうかもしれません)。ここではもっと進んでいるようです。私はこれを修正するためにOfficeを再インストールする必要があるかどうか疑問に思っていますか? (私はこれが迷惑であると感じます) –

+0

私はOfficeを完全に再インストールしましたが、問題は解決しませんでした。うん! –

+0

私のシナリオでは、ボタンは "Sign by Employee"のようなラベルで始まり、従業員がボタンを押して文書に署名するとラベルが削除されます。署名が存在しない場合(つまり、ボタンに関連付けられた画像がない場合)、MsgBoxに問題のないラベルを付けることができます。ピクチャプロパティを参照すると、何かが壊れるときです。 –

関連する問題