• ベストアンサー

ワードのテンプレートでマクロを組みましたが、動作しません

ワードの文書テンプレートにマクロを組みました。 ところが、いざテンプレートから文書を起こしても、肝心のマクロが実行されません。 どうしてマクロが実行されないのか、アドバイスいただけないでしょうか。 ちなみに、ワードは2000、OSはXPと2000と両方試しました。 また、マクロの内容は、文書中に配置されたフォームフィールドのテキストを、ボタンを押すとクリップボードにコピーするという、素朴なものです。 よろしくお願いいたします。

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.6

wasabi8888さん、遅くなりました。 >Sub 氏名のコピー() >' >' 氏名のコピー Macro >' 記録日 2004/12/25 記録者 ××× というマクロを手直しすることを考えました。ご期待に沿えるものかは分かりませんが、コードを考えてみました。 リンクというのがふさわしいか分かりませんが、 「Selection.GoTo What:=wdGoToBookmark, Name:="氏名"」 飛ばなくなってしまったのですね。それは、最初に、挿入のブックマークを確認してみてください。ブックマーク名はなくなることがありますね。そのままで飛ぶはずですが、理由はわかりません。 本来は、そのSelection を、ドキュメント名に替えて、例: Documents("アンケート用紙.doc").Goto などとしていれば、問題はないのかとは思いますが。 >もともとの文書テンプレートのシート上に、マクロを実行するボタン >("氏名をコピーする"など)を配置し、ボタンを押すたびに、 >フォームフィールドに記載されたテキストを、ひとつづつコピーできるようにしています。 つまり、Copy をして、ジャンプして Ctr+V で貼り付けていたのではないかと、読めました。 >テンプレート文書は、 >前半がアンケート入力のための説明文およびフォームフィールドが並んでおり、後半がデータベース運営者のために、コピー機能を組み込んだ(はずの...)ボタンが並んでおります。 以下なら、ボタンひとつで、全部を集計します。フォーム・フィールドに何か入れていただくだけでよいです。もちろん、アンケートする側は、マクロを使う必要はまったくありませんね。マクロは、表には見せないようにするのもよいかもしれません。もっともっと発展性はあるけれども、今は、このぐらいにしておきます。 また、自分のOfficeの登録名をキーワードにして、マクロが実行できないようにすることも可能ですね。 プロシージャーの最初に、このようなコードを置いておきます。 Sub 氏名のコピー2() Dim .... Dim .... If Application.UserName <> "Wendy02" Then Exit Sub '登録名でなかったら、マクロは中止 '--------------------------------------------------------------- Sub 氏名のコピー2() Dim myField() As Variant Dim ff As Object, i As Long i = 1 'インデックスの初期値(Item と連動させるため) If ActiveDocument.Name <> ThisDocument.Name Then   MsgBox "アンケート用のファイルをアクティブにしてください", vbCritical   Exit Sub End If 'フィールドをひとつずつピックアップ For Each ff In ActiveDocument.FormFields   ReDim Preserve myField(i)   myField(i) = ActiveDocument.FormFields(i).Result   i = i + 1 Next ff With ActiveDocument.Bookmarks '↓アンケート用紙の並びが狂ったりしなければ、要らないはずです。 '.DefaultSorting = wdSortByName  .ShowHidden = False   On Error Resume Next   '↓ここにフィールド順に、ブックマーク名を書き足していきます。※ '-----------------------------------------------------------  .Item("氏名").Range = myField(1)  .Item("管理者用_氏名").Range = myField(2) '-----------------------------------------------------------   On Error Goto 0 End With MsgBox "終了" End Sub '--------------------------------------------------------------- ※もし、失敗するようだったら、 フィールド名を、Text1 とか、Check1 とか、実際にある名前を入れてください。  .Item("氏名").Range  = ActiveDocument.FormFields("Text1").Result

wasabi8888
質問者

お礼

Wendy02さん、度重なるご尽力、ありがとうございます。 頂いたソースで問題解決することが出来ました。 大変助かりました。 ありがとうございます。

その他の回答 (5)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.5

wasabi8888さん、一両日、考えさせてください。 なお、#2のMicrosoft Forms xx Object Library の参照設定は、そのコードでは必要ありません。それは、Office 自体とは独立したクリップボードです。Copy で入るのは、Application 側のクリップボードで、その使い方には、かなり違いがあります。

wasabi8888
質問者

お礼

Wendy02さん、ありがとうございます。 大変助かります。 お手数をおかけいたしますが、よろしくお願いいたします。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんにちは。 私は、このご質問には、特に強い関心を感じているのですが、このところ、Wordが最悪の状態で、テストできません。 半年前に動いていて、いつから動かなくなったか分かりませんが、Wordのマクロの特徴は、ドキュメント間で自動参照設定するということです。 原因は、もしかしたら、その時といくつかの条件が変わってしまったのではないかと思います。いずれにしても、もう一度、フォームフィールドの設定のドロップダウン・リストでマクロ名を設定をしてみてください。 後、もう一つ、チェックするのは、マクロ側のコードの適当な場所に、ブレークポイント(コードエディタの左フレームをクリックすると● がつく)で、マクロの動きをみてください。フォームフィールドをマウスで触れた時に、イベント(マクロの起動)がされるかどうか、チェックしてみてください。ブレークポイントの行の手前まで、マクロが実行されます。 場合によっては、Normal.dot テンプレートにマクロを登録したほうがよいかもしれませんね、配布用ではないのでしたら。 Officeで、クリップボードにコピーするコードが書けるレベルでしたら、もう、マクロはかなり慣れていらっしゃるものだと思いますから、間延びした説明は返って失礼かもしれませんが。 これでダメなら、後は、実際のコードを公開してもらって再現性のチェックをするしかないように思います。

wasabi8888
質問者

補足

Wendy02さん、再びのご回答、ありがとうございます。 >マクロはかなり慣れていらっしゃるものだと思いますから いえ、まったくそういうことはなく、前回もどうにかこうにか作成したような次第です。 ですので、Wendy02さんのような方からアドバイスいただけると大変助かります。 いくつかコメントさせていただきます。 >もう一度、フォームフィールドの設定のドロップダウン・リストでマクロ名を設定をしてみてください フォームフィールドにマクロを登録しているのではありません。 ご参考までに、問題の文書テンプレートについてご説明します(もっと早く説明しろ!、という話ですが...) 問題の文書テンプレートは、あるデータベースに蓄積するための情報を入力する、アンケートフォームのようなものです。 アンケート対象者に対して文書テンプレートを配布し、文書を起こしていただきます。回答者は、アンケートに答えつつ、情報(氏名やアンケートに対する回答など)を入力します。この入力のために、フォームフィールドを用いています。 データベースの運営者は、記入済みのアンケートを回収し、その内容をデータベースに入力するのですが、その入力の手間を省くために、クリップボードにコピーするマクロを組んでいます。 具体的には、もともとの文書テンプレートのシート上に、マクロを実行するボタン("氏名をコピーする"など)を配置し、ボタンを押すたびに、フォームフィールドに記載されたテキストを、ひとつづつコピーできるようにしています。 テンプレート文書は、前半がアンケート入力のための説明文およびフォームフィールドが並んでおり、後半がデータベース運営者のために、コピー機能を組み込んだ(はずの...)ボタンが並んでおります。 Wendy02さんのおかげで、文書テンプレートから起こした文書上でのマクロは実行できるようになったのですが、ボタンと元文書テンプレートのマクロがリンク?せず、ボタンが動作しなくなっております。 ちなみに、コードは以下の通りです。 ------------------------------------------- Sub 氏名のコピー() ' ' 氏名のコピー Macro ' 記録日 2004/12/25 記録者 ××× ' Selection.GoTo What:=wdGoToBookmark, Name:="氏名" With ActiveDocument.Bookmarks .DefaultSorting = wdSortByName .ShowHidden = False End With Selection.Copy Selection.GoTo What:=wdGoToBookmark, Name:="管理者用_氏名" End Sub ------------------------------------------- 最後の部分は、ボタンを配置した個所にもどすためにものです。 どうでしょうか....

回答No.3

もし、ワードを開いたときに何も表示されないのなら、セキュリティが「高」になっている可能性があります。「ツール」「マクロ」「セキュリティ」でレベルを「中」にして、ワードを再起動してください。ダイアログがでればOKです。

wasabi8888
質問者

お礼

ご回答ありがとうございます。 セキュリティレベルは、中にしております。

wasabi8888
質問者

補足

補足を入れさせていただきます。 No.2の方のアドバイスに従い、参照設定のチェックを入れたところ、マクロそのものは、開いた文書中でも動きました。 ただ、動いたと言っても、"ツール"→"マクロ"から指定して、直接マクロを指定した場合であり、文書中のボタンを押してもマクロが動きません。 文書テンプレートから、文書を作成する際、ボタンとマクロの参照がうまくいっていないようです。 この点についても、アドバイス頂戴できませんでしょうか。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんばんは。 思いつくのは二点です。 フォームフィールドのロックはしてありますか? クリップボードにコピーと書かれていますが、Visual Basic Editor の[ツール] のMicrosoft Forms xx Object Library には、参照設定のチェックは入っていますか?

wasabi8888
質問者

補足

ご回答ありがとうございます。 1. フォームの保護はかけていますが、かけていても、外しても、やはりマクロが動きません。 2. Microsoft Forms 2.0 Object Library に参照設定のチェックは入れておりませんでしたので、チェックしてみましたが、やはり動きません。 ちなみに、問題の文書テンプレートですが、半年前に自分で作成したときは問題なく動いておりました。 ちょっといじったら、動かなくなってしまったのですが、一通りプロパティ等を見ても、以前と変わったところはないように思えます。 他に、注視すべきポイント等ありましたら、教えていただけないでしょうか。

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.1

Wordのマクロは良く解りませんけど、セキュリティが高に設定されているとか、そういう問題でないならばコードを掲示しては如何でしょう?

wasabi8888
質問者

お礼

ご回答ありがとございます。 セキュリティ設定は、中にしています。 また、テンプレートを直接開いた状態だと、マクロは動きますので、マクロそのものは問題ないのかな、と思っております。 テンプレートから文書を起こすと動かないため、No.2のご回答を頂戴した方のおっしゃるとおり、参照設定がどこかおかしいのだと思うのですが....