• ベストアンサー

【ワード】 ドロップダウンリストと年齢表示VBAは同文書内に共存できるでしょうか?

ワード2002を使用しています。このサイトで年齢表示の方法を拝見しました。 フォームツールバーのテキストボックスとVBAを使用するものです。 http://okwave.jp/qa2612476.html これは良い方法だと思い、早速私も組み込みました。 そっくりコピーして使わせていただきました。 しかし、この文書には、ドロップダウンリストが、組み込んでありました。 フォームツールバーのドロップダウンフォームフィールドを使用しています。 http://okwave.jp/kotaeru_vote.php3?q=2614089 http://kokoro.kir.jp/word/form.html うまく年齢が表示されないので、VBA画面の【プロジェクトの実行アイコン】を押したところ、下記メッセージが出ました。 実行時エラー'4605' オブジェクトにより文書の保護されている箇所が参照されているためメソッドまたはプロパティが使用できません。 [OK]  [ヘルプ] ためしに、フォームツールバーの【フォームの保護】アイコンをクリックして保護を解除し、VBA画面に切り替えて【プロジェクトの実行アイコン】を押したところ、正常に機能し、年齢が表示されました。 しかし、そのままではドロップダウンリストが機能しないので、【フォームの保護】アイコンをクリックし、フォームの保護をかけました。 年齢表示は正常に表示されています。 上書き保存して、文書を閉じ、もう一度文書を開いても、ドロップダウンリストは機能しているし、年齢表示も閉じる前と同じ年齢が表示されています。 そこでお尋ねいたします。 1.このまま文書を保存し、誕生日が過ぎて2日たったときにこの文書を開いた場合、自動的に年齢は一歳繰り上がっているでしょうか? 2.もし、このままでは、ドロップダウンリストと年齢表示は両立しないとなった場合は、解決方法はあるでしょうか? どうかよろしくお願いいたします。

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

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

こんばんは。Wendy02です。 お待たせしました。今回、思わぬ時間がかかってしまいました。私は、Word2003で開発していたので、それで良いと思っていましたが、下位バージョンですと、うまくいかないようなのです。 そこで、今回、Word2000で、開発して、Word2003で動くかどうかを試してみました。一度は、あきらめかけたのでしたが、こちらでは、Word2000 でも、成功しています。私は、Word2002がないのですが、その間なら何とかなるのではないか、と思っています。 このサンプルコードは、どこにもないので、かなり参りました。ほとんど、自信がありません。ExcelからOLEリンクのほうが、ずっと簡単のようです。ただし、エラーは検出するように作られています。 Private Today As Date Private Sub Document_Open() Today = Date If ThisDocument.ProtectionType <> wdNoProtection Then  ThisDocument.Unprotect End If Call ThisDocument.MyBirthday End Sub Sub MyBirthday()  Dim Txt1 As String  Dim Txt2 As String  Dim i As Integer  Dim myDate As Variant  Dim tmpDate As Variant  Dim myFormat As String  If ThisDocument.ProtectionType <> wdNoProtection Then   ThisDocument.Unprotect  End If  On Error GoTo EndLine  If Today <> Date Then Today = Date   Txt1 = Me.FormFields("Text1").Result   Txt2 = Me.FormFields("Text2").Result  If Sgn(Val(Txt2)) < 1 Then    Txt2 = ""  End If    If IsDate(Txt1) Then   myDate = CDate(Txt1)   tmpDate = CStr(Year(Today)) & "/" & Format(myDate, "mm/dd")   tmpDate = CDate(tmpDate)   i = DateDiff("yyyy", myDate, Today)   If tmpDate > Date - 1 Then    i = i - 1   End If   myFormat = Me.FormFields("Text1").TextInput.Format   Me.FormFields("Text1").TextInput.Default = Format(CDate(myDate), myFormat)   Me.FormFields("Text2").Result = CStr(i)   Me.FormFields("Text2").TextInput.Default = CStr(i)  Else   Me.FormFields("Text2").Result = Txt2   Me.FormFields("Text2").TextInput.Default = Txt2  End If EndLine:  If Err.Number > 0 Then   MsgBox Err.Number & ": " & Err.Description  End If  If ThisDocument.ProtectionType = wdNoProtection Then  ThisDocument.Protect wdAllowOnlyFormFields  End If End Sub

saitama090
質問者

お礼

ありがとうございました。 本当に、お世話になりっぱなしですみません。 いつか恩返しができる日があれば、嬉しいのですが。 仕事に使っていますので、月曜日に、動作確認します。 本当に、お世話になりました。 ありがとうございました。

saitama090
質問者

補足

補足欄でお礼を述べさせていただきます。 大変ありがとうございました。 完璧に動作します。 思っていたものが手に入って、すっごく嬉しいです。 >ExcelからOLEリンクのほうが、ずっと簡単のようです。 あ~、そういう方法があったのですね。 まったく、パソコンのイロハもわからないままに、難しいことから質問してしまいました。 ExcelからのOLEリンクについては、自分で調べて見ます。 本当にお世話になりました。 ありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (3)

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

ありがとうございました。 こんばんは。Wendy02です。 >自分で勉強すれば良いのですが、なかなか取っ掛かりがわからなく、困っています。教えていただいたことを、自分の頭に入るよう勉強しなおします。 私は、たまたま、覚えるための時間というものがあっただけです。実際に私は、覚えられるとは思ってはいませんでした。語学がなかなか覚えられなくて、その代わりにはじめたのがVBAでした。 >誕生日が過ぎたら自動で一日更新するVBAを教えていただきたく思います。 たぶん、「一歳」更新だと思います。原理を変えれば、毎日、その日の日付も出せますね。 マクロは、必ず、ThisDocument に登録してあることが条件です。 以下を前のコートすべて、上書きしてください。そのドキュメントを一旦保存すれば、後は、自動的に設定されます。 'Option Explicit '------------------------------------------ Private Today As Date Private Sub Document_Open() 'ドキュメントを開けると起動されるマクロ Today = Date Call ThisDocument.MyBirthday End Sub Sub MyBirthday()  Dim Txt1 As String  Dim i As Integer  Dim myDate As Variant  Dim tmpDate As Variant  Txt1 = Me.FormFields("Text1").Range.Text  On Error GoTo EndLine  If IsDate(Txt1) Then   myDate = CDate(Txt1)   tmpDate = CStr(Year(Today)) & "/" & Format(myDate, "mm/dd")   tmpDate = CDate(tmpDate)   i = DateDiff("yyyy", myDate, Today)   If tmpDate > Date - 1 Then     i = i - 1 '今日の日が、誕生日が過ぎるまで「-1」   End If   Me.FormFields("Text2").Result = CStr(i)    End If EndLine: End Sub '------------------------------------------

saitama090
質問者

お礼

なんとご親切に、コードまでご丁寧に作っていたたいて、泣けてくるほどうれしいです。 早速、貼り付けてみました。 ところが、年齢表示のテキスト2が、-88歳になってしまいました。 生年月日のテキスト1は 昭和62年12月22日 です。 コンピューターの日付は、18年12月22日です。 教えていただいたコードを貼り付ける前は、17歳か18歳になっていました。(誕生日をずらして試していたので、年齢がずれましたが、正常な年齢表示でした) 頼ってばかりで申し訳ないのですが、なぜ、年齢がマイナス表示になったのか、教えていただけるでしょうか。 VBAのThisDocumentには、以前のコードを削除し、下記のとおり貼り付けました。余分なものも貼り付けてしまったのでしょうか? すみません。よろしくお願いいたします。 'Option Explicit '------------------------------------------ Private Today As Date Private Sub Document_Open() 'ドキュメントを開けると起動されるマクロ Today = Date Call ThisDocument.MyBirthday End Sub Sub MyBirthday()  Dim Txt1 As String  Dim i As Integer  Dim myDate As Variant  Dim tmpDate As Variant  Txt1 = Me.FormFields("Text1").Range.Text  On Error GoTo EndLine  If IsDate(Txt1) Then   myDate = CDate(Txt1)   tmpDate = CStr(Year(Today)) & "/" & Format(myDate, "mm/dd")   tmpDate = CDate(tmpDate)   i = DateDiff("yyyy", myDate, Today)   If tmpDate > Date - 1 Then     i = i - 1 '今日の日が、誕生日が過ぎるまで「-1」   End If   Me.FormFields("Text2").Result = CStr(i)    End If EndLine: End Sub '------------------------------------------

saitama090
質問者

補足

すいません!! 文書を保存して閉じて、再度開いたところ、きちんと18歳になっていました。 先ほどのお礼欄の年齢のマイナス表示はもう出ません。 解決しました。すみませんでした。 ただ、【フォームの保護】をかけていると、文書を開いたときに、年齢表示のVBAがうまく作動しないようです。 開いたときに下記のメッセージがでました。 実行時エラー'4605' オブジェクトにより文書の保護されている箇所が参照されているためメソッドまたはプロパティが使用できません。 [継続](灰色) [終了] [デバック] [ヘルプ] で、デバックを押すと、マクロの記述シートが開き、黄色いマーカーで、 Call ThisDocument.MyBirthday の所が示されています。 そして、自分で文書に戻り、【フォームの保護】を解除し、マクロの画面に戻り、ビデオの再生ボタンにあるような三角マークの【継続】を押したところ、きちんと年齢が表示されました。 [ツール]-[文書の保護]-[保護対象外をフォームフィールド]にして[OK]にして閉じていますが、変わりません。 やはり、ドロップダウンリスト【フォームの保護】と年齢表示VBAは両立できないのでしょうか? 両立できない場合は、ドロップダウンリストをあきらめます。 どうか、教えてください。よろしくお願いします。

すると、全ての回答が全文表示されます。
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんにちは。 >2.もし、このままでは、ドロップダウンリストと年齢表示は両立しないとなった場合は、解決方法はあるでしょうか? もう一度、 http://okwave.jp/qa2612476.html こちらをお読みくださればよいのですが、 # もしも、保護する必要があるなら、以下のようになりますが と書かれてあるとおりです。 9) ツール-文書の保護  編集の制限-ユーザーに許可する編集の種類を指定する-フォームへの入力  (または、Word 2000:文書の保護-保護対象外[フォームフィールド])-OK) が必要です。 >1.このまま文書を保存し、誕生日が過ぎて2日たったときにこの文書を開いた場合、自動的に年齢は一歳繰り上がっているでしょうか? そういう設定はなされていません。 あくまでも、 Me.FormFields("Text2").Result = CStr(i) '← は、取得した差の年齢をテキストボックスに入れているだけで、変更させる必要があるなら、まず、Doucument を開いた時に、書き換えをするプログラムを、標準モジュール等に入れなくてはなりません。

saitama090
質問者

お礼

ありがとうございます。 文書全体を保護する必要はないのです。 ですので、このままでよいと思います。 ご親切にありがとうございます。 別の質問として、誕生日が過ぎたら自動で一日更新するVBAを教えていただきたく思います。 自分で勉強すれば良いのですが、なかなか取っ掛かりがわからなく、困っています。教えていただいたことを、自分の頭に入るよう勉強しなおします。 ありがとうございました。

すると、全ての回答が全文表示されます。
回答No.1

Wendyさんが回答したものは、私も保存して勉強させてもらっています。 今回のエラーについてはこちら↓かしら? Word2003でのRangeオブジェクトでRange.CopyまたはRange.Pasteメソッド を使用するVBAマクロを実行すると、エラーメッセージをマクロは完了せず、 表示します。 http://support.microsoft.com/kb/896987/ja Office XPのサービスパックをsp3にしてみて下さい。 私はWord2002sp3ですが、保護した後でも問題なく動作しました。 Word2002sp3にしても動作がおかしいなら別の原因ですね。

saitama090
質問者

お礼

ありがとうございました。 Word2002sp3にしてもえらーメッセージはでますが、それが本当に間違った動作なのかは不明です。 様子を見て見ます。 ありがとうございます。

すると、全ての回答が全文表示されます。

関連するQ&A