こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

EXCEL/VBAで、自分のPCだけエラーが出ます

下記は、wordの「@一覧表」文字の部分をExcelで作成した表(B3:E9)に置き換えるマクロですが、自分のPCだけ「Executeメソッドは失敗しました:Findオブジェクト」のエラーが出ます。
何が原因なのでしょうか、対処方法を教えて下さい。
ちなみに自分のPCは、EXCEL2003です。他のPCのEXCEL2003や自宅のEXCEL2007ではエラーは出ません。

Dim wordApp As Word.Application
Dim wordDoc As Word.Document
Dim wordRange As Word.Range

Set wordApp = New Word.Application
Set wordDoc = wordApp.Documents.Open(ThisWorkbook.Path & "\ひな型用ドキュメント.doc")
(途中略)
Set wordRange = wordDoc.Content
wordRange.Find.Execute "@一覧表", Forward:=True ←エラー
Range("B3:E9").Copy
wordRange.Paste

投稿日時 - 2009-10-28 18:01:38

QNo.5403905

困ってます

質問者が選んだベストアンサー

補足です。
#4のimogasiさんの分で起きたエラーですが、マクロの問題ではないようです。私は、下位バージョンに対する、参照ライブラリのエラーだと思いましたが、どうやら違っていました。一度、Office のメインテしたほうがよいのかもしれません。

http://support.microsoft.com/kb/292744/ja
[BUG] Word のオートメーション クライアントで Find オブジェクトを呼び出す際にエラーが表示されるかクラッシュする

# 非管理下のシステムでこのエラーの発生を防ぐには遅延バインディングが唯一の方法です。

と書かれています。これを読んで、遅延バインディングにしたわけではありませんが、結果的には良かったようです。

投稿日時 - 2009-10-30 21:35:28

お礼

まさしくこの現象ですね。
フリーのEXCELアドインソフトを4~5種類ライブラリーに入れて、アドイン登録してから変なエラーメッセージが出始めました。
どのアドインソフトが影響しているか調べてみます。
色々と丁寧に回答して頂き、本当に有難うございました。

投稿日時 - 2009-10-31 23:16:51

ANo.7

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(7)

ANo.6

こんばんは。

>'Set wdDoc = wdApp.Documents.Open(ThisWorkbook.Path & "\ひな型用ドキュメント.doc")
の先頭の「'」を削除すると正常に動作しました。

失礼しました。うっかり付けてしまいました。分かっていただいて何よりです。

それで、今回は、検索値の「@」というのが、問題だったようです。Find のオプションの Fuzzy や WildCard のTrue/False でエラーになるようです。

テキストもあまりありませんから、Webサイトしかありませんね。あったとしても、だいたい、元の仕入れ値段は二束三文なのに、どこかの人がプレミアを付けてしまい、とても購入する予算を超えてしまいます。

さて、Word VBA では、私は、以下のところを参照しています。

英語圏だけですが、
Word Tips Net
http://word.tips.net/W006_Macros.html
MVPはないようですが、私のお気に入りのひとつです。

The Word MVP Site
http://word.mvps.org/FAQs/index.htm
背景が暗いのと文章が多すぎて、読みにくいです。

日本語でややこしいのは、2バイト文字の扱いです。それが、英語圏のサンプルにはまったくないので、しばらく試行錯誤します。早い話、Unicode というものは何か、ということです。

他に、リンク先を直接書けないのですが、Word VBA の本を探してみてください。その本のサンプルは、まだ生きています。

マイクロソフトのサポートのサンプル集です。

http://www.kayodeok.btinternet.co.uk/favorites/kbofficeword.htm#kbinfo

ところで、どこかのフランス語のサイトで、Word のCommandListを一つずつフランス語に翻訳している人を見たけれども、日本ではないようです。私も途中までやったけれども、1000個以上あって、200個ぐらいでめげてしまいました。フランス語から英語なら、ある程度想像つくかもしれませんが、日本語はかけ離れているからです。

投稿日時 - 2009-10-30 21:18:03

お礼

Word VBAのWeb紹介有難うございました。
英語はちょっと苦手ですが、色々とWebやWord VBA の本を探してみます。
マイクロソフトのサポートのサンプル集も活用させて頂きます。

投稿日時 - 2009-10-31 23:12:51

ANo.5

こんばんは。

>WORDの記録マクロをEXCEL VBAに展開するのですか?
Wordで行う部分は、Wordの中で記録マクロを取って、それで、コードを取ります。

「EXCEL/VBAの講師がある文献」と書かれていますが、MS-WordはWord VBAという分野があります。たとえば、学校などで使うテキストのコードでも、実務上では使えないものも多くあります。

なぜエラーにムラが出るかというと、おそらく、検索オプションのワイルドカードを使う部分が、On になっているからだと思います。ClearFormatting をして、その後、主要なプロパティ設定を念を入れて設定してあげなくてはなりません。Find メソッドには、手動で使ったりした検索オプションが残っていることがあるのです。Word VBA のDefault は、必ずしも Default ではないということです。その点で、Excel VBAとは違うようです。

具体的というよりも、後から言われる前に、コード全部を出しておきます。これで、すべての環境で動くとは保障はしませんが……。

それと、「Libraryにアクセスできません」ということで、以下は、OLEオートメーションに切り替えました。
'-------------------------------------------

Sub Copy_PasteTest1()
  Dim wdApp As Object 'Word.Application
  Dim wdDoc As Object 'Word.Document
  Dim wdRange As Object 'Word.Range
  Dim ret As Variant
  Set wdApp = CreateObject("Word.Application") ' New Word.Application
  wdApp.Visible = True 'Wordを見せる
  On Error GoTo ErrorHandler
  'Set wdDoc = wdApp.Documents.Open(ThisWorkbook.Path & "\ひな型用ドキュメント.doc")
  Set wdRange = wdDoc.Content
  With wdRange.Find
    .ClearFormatting
    .Text = "@一覧表"
    .Forward = False
    .Wrap = wdFindStop
    .MatchByte = False
    .MatchCase = False
    .MatchWholeWord = True
    .MatchSoundsLike = False
    .MatchAllWordForms = False
    .MatchWildcards = False
    .MatchFuzzy = False 'ここはFalse にしないといけない
    .Execute
    If .Found Then
      ActiveSheet.Range("B3:E9").Copy
      wdRange.Paste
      Application.CutCopyMode = False
    Else
      MsgBox "検索の単語は発見できませんでした。", vbInformation
    End If
  End With
  If wdDoc.Saved = False Then
    wdDoc.Save
  End If
ErrorHandler:
  If Err.Number > 0 Then
    MsgBox Err.Description
  End If
  wdApp.Quit
  Set wdDoc = Nothing
  Set wdApp = Nothing
End Sub

投稿日時 - 2009-10-30 01:35:22

お礼

コードを全部書きだしていただき、有難うございました。
'Set wdDoc = wdApp.Documents.Open(ThisWorkbook.Path & "\ひな型用ドキュメント.doc")
の先頭の「'」を削除すると正常に動作しました。
Word VBAの正規の書き方にすれば正常に動作することは理解出来ましたが、コードの中身は理解できていないので、これから理解していきます。また、WORDの記録マクロを取ってみると確かに細かく記載されていました。
VBAは今年からやり出した初心者ですが、Word VBAを理解するのに良い方法があれば紹介お願いします。
ネットを検索すると色々ヒットしたので、取り敢えず色々リンク先をのぞいてみます。
丁寧にご回答頂き、有難うございました。
色々と勉強になりました。

投稿日時 - 2009-10-30 20:10:38

ANo.4

#2です、#2のお礼欄に関して。
私の書いた疑問(質問)点に、答えてくれていない(チェックしてくれてない)ようですが、私はデータの問題ではないかと思ったのですが。私は折角時間をかけて、動作確認をしたのですよ。チェックして置いてくださいね。
おかしい、おかしいというのは、結構、なーんだ、という原因の場合もありますよ。

投稿日時 - 2009-10-30 00:14:43

お礼

失礼しました。TESTプロを試しなさいとは読み取れませんでした。
また、問題のPCは会社のPCにつき、会社しか試せませんが
本日10/30にTEST07をエクセルの標準モジュールに入れて実行しました。
(ワードの文書には、「限度」という語句を入れました。
VBEの画面でツールー参照設定でワードを参照設定しました。)
【結果】
1.メッセージボックス表示
2.WORDオープン
3.Find.Executeでエラーが発生しました。
「実行時エラー'430'
クラスはオートメーションまたは予測したインターフェースをサポートしていません。」
のエラーメッセージが出ました。
なお、回答番号NO.5を試してみるとエラーメッセージが出ずにうまく動きました。

投稿日時 - 2009-10-30 20:05:08

ANo.3

こんばんは。

私は、Word VBAは守備範囲ですが、現行では、こちらには基本的に書いていません。ただ、ちょっとだけアドバアイスをさせていただきます。

>Set wordRange = wordDoc.Content
>wordRange.Find.Execute "@一覧表", Forward:=True ←エラー
>Range("B3:E9").Copy

この三行が省略されていないとすれば、雑すぎて、まともに動くほうが驚きです。一体、どうして、このようなコードを思いついたのかなって思うぐらいです。Excel VBA中心の人には、多いようですね。

「EXCEL2007で動くマクロがEXCEL2000だとエラーが出ます。(qa4826906)」の質問と同質で、エラーが出るかでないかは結果論だとは思うのです。Find.Execute を省略しすぎて、VBAマクロとして成立していないように思うのです。少なくとも、私の知っているWord VBAの範疇のコードではありません。

面倒がらずに、正しく最初から、記録マクロでも取って、Find.Execute のコードを丸写しにして書いたらよいかと思います。一般的にバージョンに違いによる差よりも、正しく書かないコードが原因のことが多いです。

投稿日時 - 2009-10-29 03:12:01

お礼

ご指摘の部分は、EXCEL/VBAの講師がある文献に記載されていたコードですので正しい書き方だと思っていたのですが、雑と言われるならどう書けば丁寧なのでしょうか。
EXCEL記録のマクロでは、WORDでの作業の記録は出来ないはずですが、上記の場合どのようにしたら記録マクロが取れるのでしょうか。
WORDの記録マクロをEXCEL VBAに展開するのですか?
具体的に教えて頂ければ、嬉しいのですが。

投稿日時 - 2009-10-29 23:23:36

ANo.2

#1です。
原因が良くわからないが
Sub test07()
'wordのObjectLibraryに参照設定
Dim wordApp As Word.Application
Dim wordDoc As Word.Document
Dim wordRange As Word.Range

Set wordApp = New Word.Application
wordApp.Visible = True
'MsgBox ThisWorkbook.Path
MsgBox CurDir
Set wordDoc = wordApp.Documents.Open(CurDir & "\エクセルフィルタ説明.doc")
Set wordRange = wordDoc.Content
wordRange.Find.Execute "限度", Forward:=True
Range("B3:E9").Copy
wordRange.Paste
wordDoc.Close
Set wordApp = Nothing
Set wordDoc = Nothing
Set dRange = Nothing
End Sub
をエクセルの標準モジュールにおいて、参照設定し、実行すると
旨く行くようなんだが。
VBEの画面でツールー参照設定でワードを参照設定しているか。
開いているワードの文書には、私の場合の上記で言う「限度」という語句が、質問者の場合の、その文書内に存在するか。
ThisWorkbook.Path は、場合によっては(エクセルのブックを一旦名前をつけて保存して、その後開いた場合で無いような場合は)エラーになる。
など思ったが。

投稿日時 - 2009-10-28 20:46:53

お礼

回答有難うございました。
コードは間違っていないと思います。
(EXCEL2000/2007及び他のPCのEXCEL2003で動作しています。)
EXCEL起動時に、(1)「Libraryにアクセスできません。読み取り専用または暗号化されています」
(2)「Libraryにアクセスできません。」などのメッセージが毎回出て、
自分のPCのEXCEL自体に問題があるのではと思っています。
一度、EXCELをアンインスツールして、再度インストールしてみます。

投稿日時 - 2009-10-29 23:02:30

ANo.1

http://questionbox.jp.msn.com/qa4826906.html
の質問とそっくりだが、解決済みではないのですか。随分日日がたってますが、両質問はどういう関係になるのですか。
今回の質問は、エクセルの標準モジュールに入れて実行しているのですね。

投稿日時 - 2009-10-28 20:19:21

お礼

質問の内容を良く見てもらえれば分かりますが、同一マクロの質問ですが内容が全然違います。
前の質問で問題が解決してexcel2000で使用していましたが、自分のPCがexcel2003になって実行してみると違う個所でエラーが出たので再度質問しました。
構文は前の文書を使用していますが、内容は全然違う内容です。
これが経緯ですが、問題の質問の回答を宜しくお願いします。
今回の質問は、エクセルの標準モジュールに入れて実行しています。

投稿日時 - 2009-10-28 20:39:10

あなたにオススメの質問