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

解決済みの質問

Excelマクロ: 用紙の縦/横に連動してマクロボタンの凹凸も制御したい

以下は、Word2003で「用紙の向きを90度回転する」マクロです。
(Wordのメニューのファイル→ページ設定→余白タブ→印刷の向き「縦/横」)
一回実行すると90度回転、もう一回実行すると元に戻るようになってます、

これをツールバーボタンに割り付け、紙を横にしたらツールバーボタンが凹み、
紙を縦に戻したらツールバーボタンの凹みが元に戻るようにしてます。

一見これでよさそうですが、ボタンを押して紙を横にしてボタンを凹まし、
Wordを再起動すると、紙が横でないのにボタンを凹んだ状態で新規文書が
起動してしまいます。

改善はどう記述すれば良いでしょうか。
印刷の向きが「横」に設定されている間はボタンが凹んでいて欲しいのですが。


'用紙の向きを90度回転する
Sub Orientation()
  Dim myButton As Office.CommandBarButton
  Set myButton = Application.CommandBars.ActionControl
  With myButton
    If .State = msoButtonUp Then
      With ActiveDocument.PageSetup
        .Orientation = wdOrientLandscape
      End With
      .State = msoButtonDown
    Else
      With ActiveDocument.PageSetup
        .Orientation = wdOrientPortrait
      End With
      .State = msoButtonUp
    End If
  End With
  Set myButton = Nothing
End Sub

投稿日時 - 2010-02-14 21:22:54

QNo.5676911

暇なときに回答ください

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

>  マクロが見つからないか、またはマクロに対する
>  セキュリティ レベルが高く設定されているため
>  マクロが無効にされています。

この件に付きましては、#3で既に説明されていますが、
http://www.patent-boy.com/products/faq/faq.cgi?mode=view&no=3

「オプション」の設定が読まれるように設定されていないものだと思います。
ユーザーテンプレート:
>場所:C:\Documents and Settings\(ユーザー名)\Application Data\Microsoft\Templates

それと、
ツール--マクロ--セキュリティ--信頼できる発行元[タブ]
 レ 組み込み済みのアドインとテンプレートをすべて信頼する(A)
ここにチェック

マイクロソフト側の説明(上記と重複します)
起動または Word 2002 を終了すると「このプロジェクト内のマクロは無効」のエラー メッセージ
http://support.microsoft.com/kb/302632/ja

OSは、XPでも、Vista でも通りますし、これに関しては、管理者権限自体は関係なかったはずです。もしも、これでも出来ないような状態というのは、こちらでは分かりませんが、Office 2000などバージョンが低い場合を除いては考えられません。

投稿日時 - 2010-03-09 09:50:43

お礼

Wendy02さん、毎度御礼が遅くなって大変失礼しております。

ご教示の点は一から何度も点検しているのですが
どうしても不具合が取れません。。。。

既に材料は揃えていただきましたので
腰をすえてじっくり適用し、成功できるようにしたいと思います。

親身になって様々なご回答、本当にありがとうございました。

今後ともよろしくお願い致します。

投稿日時 - 2010-03-16 23:41:04

ANo.6

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

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

回答(6)

ANo.5

こんにちは。

>ところが、紙を横にしたままWordを閉じると、再度Wordを起動した際に
>紙は縦、ボタンは凹んだ状態になっています。
>紙は縦、ボタンは凹んでいない状態になって欲しいところなのですが・・・

Normal.dot のThisDocument に#4で書かれたコードが書かれていれば、そのような問題は発生しないはずです。おそらく、ThisDocument 側のすべてのマクロが生きていません。

'=======#4のThisDocument 用マクロ=========

'コメント部分は、特に残す必要はありません。
'-------------------------------------------
'ThisDocumentのみ (同名のものがあれば、上書き)
'-------------------------------------------
Private Sub Document_Close()
 ・
 ・
 ・

----------------------------------------

試しに、この中のひとつに、以下のように書き加えれば働いているか分かります。★

Private Sub Document_Open() 'ファイルを開くと反応します。
  Set myApp = Application
  Call wdOrientationChecker
  MsgBox "起動しました。" '★←これを書き込んでみれば、起動しているか分かります。
End Sub

'-------------------------------------------
★不要になりましたら、削除してください。

大変申し訳ございませんが、この投稿に添付された画像や動画などは、「BIGLOBEなんでも相談室」ではご覧いただくことができません。 OKWAVEよりご覧ください。

マルチメディア機能とは?

投稿日時 - 2010-03-03 19:53:34

お礼

Wendy02さん、毎度丁寧なご回答大変ありがとうございます。

御礼と動作確認報告が遅れ勝ちで申し訳なく思っております。

VBEで、左ペインのプロジェクトツリーで、
Normal→Microsoft Word Objects→ThisDocument
に、#4のコードを貼り付けてみました。

実行した結果(ツールバーのOrientationボタン押下)は、相変わらず

  マクロが見つからないか、またはマクロに対する
  セキュリティ レベルが高く設定されているため
  マクロが無効にされています。

です、、、。

#5でお示しいただいた、

> Private Sub Document_Open() 'ファイルを開くと反応します。
(以下略)

…これを加えて保存しようとすると、

  コンパイル エラー:
  名前が適切ではありません: Document_Open

となります。・・・何かまたまた初歩的なミスをしておりますでしょうか??

投稿日時 - 2010-03-09 00:22:32

ANo.4

こんにちは。

今回のWord VBAは、一般的なマクロの基準からは、1ランクか2ランク上のものですから、インターネットで調べても、資料が出てこないと思います。SearchbuttonRev()の結果を見せていただいて、本来、ボタンのマクロを再登録していただく必要があったようです。早めに気がついていれば、それを直すマクロを提供していましたが、元のボタンの登録場所に、マクロを上書きしてしまうのが早いと思います。

これを参考に設定をしました。
'-------------------------------------------
References 
>Menu: MyToolbar
>ButtonName: Orientation
>登録マクロ: NewMacros.Orientation
>場所:C:\Documents and Settings\(ユーザー名)\Application Data\Microsoft\Templates\Normal.dot
'-------------------------------------------

VBE Normal.dot の中に、以下のものを貼付けし直してください。
なお、上記の情報から、Module1ではなく、NewMacrosになっているようですから、そちらを生かし、Module1の同様のものは削除してしまって構いません。

'コメント部分は、特に残す必要はありません。
'-------------------------------------------
'ThisDocumentのみ (同名のものがあれば、上書き)
'-------------------------------------------
Private WithEvents myApp As Application '←最上部
Private Sub Document_Close()
  Call wdOrientationChecker(False)
End Sub

Private Sub Document_New()
  Call wdOrientationChecker(False)
End Sub

Private Sub Document_Open()
  Set myApp = Application
  Call wdOrientationChecker
End Sub

Private Sub myApp_WindowActivate(ByVal Doc As Document, ByVal Wn As Window)
  Call wdOrientationChecker
End Sub

'-------------------------------------------
''NewMacrosのみ--上書き(Module1 にあった同名のマクロは残さず削除してください。)
'-------------------------------------------
Sub Orientation()
  Dim MyButton As Office.CommandBarButton
  Set MyButton = Application.CommandBars.ActionControl
  With MyButton
    If .State = msoButtonUp Then
      With ActiveDocument.PageSetup
        .Orientation = wdOrientLandscape
      End With
      .State = msoButtonDown
    Else
      With ActiveDocument.PageSetup
        .Orientation = wdOrientPortrait
      End With
      .State = msoButtonUp
    End If
  End With
  Set MyButton = Nothing
End Sub

Sub wdOrientationChecker(Optional flg As Boolean = True)
'文書の向きをチェックするマクロ
  Dim MyButton As CommandBarButton
  Set MyButton = Application.CommandBars("MyToolbar").Controls("Orientation")
  If flg Then
    If ActiveDocument.PageSetup.Orientation = wdOrientLandscape Then
      MyButton.State = msoButtonDown
    Else
      MyButton.State = msoButtonUp
    End If
  Else
    MyButton.State = msoButtonUp
  End If
End Sub


'-------------------------------------------

投稿日時 - 2010-03-01 12:16:14

お礼

Wendy02さん、完全におんぶに抱っこになってしまいまして心苦しい限りです。
本当にありがとうございます。

おかげさまで、無事既存環境で回転はさせられるようにはなりました。

ところが、紙を横にしたままWordを閉じると、再度Wordを起動した際に
紙は縦、ボタンは凹んだ状態になっています。
紙は縦、ボタンは凹んでいない状態になって欲しいところなのですが・・・

元質問と同じ状態に陥っているようです。

せっかくここまで突き詰めていただいたので、念のためご報告させていただきます。

投稿日時 - 2010-03-03 17:05:05

ANo.3

こんにちは。

情報取得マクロを修正しました。今回は、特に修正する必要はありません。ただ、単に確認のためだけです。
私自身も、これで取ってみて、気がつかない部分がありました。私のNormal.Dot は、以下の「ユーザーテンプレート」にあります。一旦、設定すれば、変更なければ、いじる必要はありません。大変だと思いますが、全体のマクロがこういう面倒な設定になる可能性があると思ったほうがよさそうです。

'-------------------------------------------
Sub SearchbuttonRev()
'ボタンを探すプログラム(修正版)
Dim MyButton
Dim a, b, c, d, e, v
  Set MyButton = Application.CommandBars
  On Error Resume Next
  For Each c In MyButton
    For Each v In c.Controls
      If Err.Number = 0 Then
        '設定マクロ名:大文字・小文字の区別あり
        a = v.OnAction Like "*Orient*"
      Err.Clear
      If a = True Then
       b = v.Parent.Name
       c = v.Caption
       d = v.OnAction
       e = v.Parent.Context
       MsgBox "Menu: " & b & vbCrLf & "ButtonName: " & c & vbCrLf & _
       "登録マクロ: " & d & vbLf & "場所:" & e, , "情報メニュー"
       'Debug.Print "Menu: " & b; "ButtonName: " & c & "登録マクロ: " & d & vbLf & "場所:" & e
        Exit Sub
       End If
      End If
    Next
  Next
End Sub
'-------------------------------------------

>「マクロが見つからないか、またはマクロに対するセキュリティ レベルが高く設定されているためマクロが無効にされています。」

この件は、私は経験がありませんので、以下をみていだだけますか?
http://www.patent-boy.com/products/faq/faq.cgi?mode=view&no=3

この内容自体は、私の考えているスタイルと違いますので、オプションの内容を確認してください。
だいたいは以下のようになると思います。[:]の右が空白なのは、私は空にしています。
なお、修正したマクロで情報を確認してください。

'-------------------------------------------
Document and Setting... の部分が隠れていますが、

例えば、以下のような場所になります。
-------------------------------------------
文書: 任意
クリップアート:
ユーザーテンプレート:
C:\Documents and Settings\[User ID]\Application Data\Microsoft\Templates

ワークグループテンプレート:
自動バックアップ:任意

ツール:
C:\Program Files\Microsoft Office\OFFICE11

スタートアップ:
C:\Documents and Settings\[User ID]\Application Data\Microsoft\Word\STARTUP\

-------------------------------------------
=========================================
なお、これが通りましたら、今のスタイルには、Windows.Activate(ドキュメントを切り替えた時にチェックするモード)がありませんので、コードを加えなくてはなりません。

'ThisWorkbook モジュール
'-------------------------------------------
Private WithEvents myApp As Application '一行目


>Private Sub Document_Open()
>  Call wdOrientationChecker
>End Sub
     ↓
Private Sub Document_Open()
  Set myApp = Application '←書き加えます
  Call wdOrientationChecker
End Sub

'-------------------------------------------
'新たなイベント・ドリブン型マクロ(ThisDocument の最後尾に加える)
Private Sub myApp_WindowActivate(ByVal Doc As Document, ByVal Wn As Window)
  Call wdOrientationChecker
End Sub

投稿日時 - 2010-02-18 16:22:45

補足

Wendy02さん、たびたびのご教示感謝にたえません。

また、とっくに試してはいたのですが、下記に示すトラブルで解決策がないか
いろいろ試しておりました、結果的に報告や御礼が遅くなりましたことをお許しください。

No3でご教示いただいたマクロなど、整理すると文末のようになるかと思います。
これを、Normal.dotのNewMacrosに貼り付けると、

>Private WithEvents myApp As Application '一行目

ここが赤字になります。
Project(文書1)のThisDocumentに貼り付ければ赤字になりませんが・・・。

Normal.dotでも、ThisDocumentでも、いずれにせよツールバーボタン
(=「Orientation」をキャプションとするボタン)を押下すると
相変わらず「マクロが見つからないか、またはマクロに対するセキュリティ レベルが高く設定されているためマクロが無効にされています。」となります。。。。

Wendy02さんが#3でご教示くださったサイトもみてみたのですが・・・

そうそう、#3のスクリプト実行結果は以下の通りです。
Menu: MyToolbar
ButtonName: Orientation
登録マクロ: NewMacros.Orientation
場所:C:\Documents and Settings\(ユーザー名)\Application Data\Microsoft\Templates\Normal.dot


'-------------------------------------------
'Normal.dotの標準モジュールか、ThisDocument どちらでも良い
Private WithEvents myApp As Application '一行目
Sub wdOrientationChecker(Optional flg As Boolean = True)
'文書の向きをチェックするマクロ
  Dim MyButton As CommandBarButton
  Set MyButton = Application.CommandBars("MyToolbar").Controls("Orientation")' 'ここはキャプションにあわせて変更済みです。
  If flg Then
    If ActiveDocument.PageSetup.Orientation = wdOrientLandscape Then
      MyButton.State = msoButtonDown
    Else
      MyButton.State = msoButtonUp
    End If
  Else
    MyButton.State = msoButtonUp
  End If
End Sub

'Normal.doct のThisDocument
Private Sub Document_Close()
  Call wdOrientationChecker(False)
End Sub

Private Sub Document_New()
  Call wdOrientationChecker(False)
End Sub

Private Sub Document_Open()
  Set myApp = Application '←書き加えます
  Call wdOrientationChecker
End Sub

投稿日時 - 2010-03-01 00:47:51

ANo.2

こんばんは。

>Word2003のツール→ユーザー設定→コマンドタブ→「分類」の「マクロ」に
>wdOrientationCheckerが出てきません、、、
ドキュメント側から呼び出して使うものではありませんから、出てきません。

>早速当方のVBEで、Normal.dotの標準モジュールのNewMacros(ここに他の細かいマクロも入れてあります)に加える形で組み込んでみたんですが、

Normal.doct のNewMacros でも構いませんが、ともかく、ボタンがどう張付ているか分かればよいのですが。

大事なことは、ここだけです。
>「表示のCaption に名称を合わせる」ということの意味がわからないのですが、
>そちらを設定していないのが原因でしょうか。

図をみてください。私のところでは、Orientation と出ています。これが、キャプション(Caption)です。
以下のプログラムで、検索してみてください。

Menu ---> Menu Bar
ButtonName(Caption)--> Orientation

メッセージボックスに出てきたものは、イミディエイトウィンドウにも出ていますので、それを、#1のマクロの以下の行を書き換えてください。

Set MyButton = Application.CommandBars("Menu Bar").Controls("Orientation") '要変更

'-------------------------------------------
'どこでもよいので、試してみてください。
Sub Searchbutton()
'ボタンを探すプログラム
Dim MyButton
Dim a, b, c, v
  Set MyButton = Application.CommandBars
  On Error Resume Next
  For Each c In MyButton
    For Each v In c.Controls
      If Err.Number = 0 Then
        '設定マクロ名:大文字・小文字の区別あり
        a = v.OnAction Like "*Orient*"
      Err.Clear
      If a = True Then
       b = v.Parent.Name
       c = v.Caption       
       MsgBox "Menu: " & b & vbCrLf & "ButtonName: " & c
       Debug.Print "Menu: " & b ; "ButtonName: " & c
        Exit Sub
       End If
      End If
    Next
  Next
End Sub
'-------------------------------------------
不要になったら削除して良いです。

大変申し訳ございませんが、この投稿に添付された画像や動画などは、「BIGLOBEなんでも相談室」ではご覧いただくことができません。 OKWAVEよりご覧ください。

マルチメディア機能とは?

投稿日時 - 2010-02-15 01:28:00

お礼

Wendy02さん、たびたびのご教示大変ありがとうございます。
初歩的な質問に丁寧にご教示いただき感謝に耐えません。

Searchbutton()を実行してみましたら、
  Menu ---> My Toolbar
  ButtonName(Caption)--> 用紙を90度回転
と出てきましたので、以下のように設定しました。
Set MyButton = Application.CommandBars("My Toolbar").Controls("用紙を90度回転") '要変更

既存のボタンを押下してみましたら、

「マクロが見つからないか、またはマクロに対するセキュリティ レベルが高く設定されているためマクロが無効にされています。」

というメッセージが出て、用紙が90度回転されません。

些細な設定ミスかもしれませんが・・・

投稿日時 - 2010-02-18 09:31:26

ANo.1

こんばんは。

ここでは、ボタン名を、Orientation にしていますが、
Set MyButton = Application.CommandBars("Menu Bar").Controls("Orientation") '要変更

表示のCaption に名称を合わせてください。また、Menu Bar ではなく、別の場所に入れている場合は、正しい場所に設定してください。ただ、正しい場所が見つからない場合は、検索用のマクロを別途作らなくてはなりません。

'-------------------------------------------
'Normal.dotの標準モジュールか、ThisDocument どちらでも良い
Sub wdOrientationChecker(Optional flg As Boolean = True)
'文書の向きをチェックするマクロ
  Dim MyButton As CommandBarButton
  Set MyButton = Application.CommandBars("Menu Bar").Controls("Orientation") '要変更
  If flg Then
    If ActiveDocument.PageSetup.Orientation = wdOrientLandscape Then
      MyButton.State = msoButtonDown
    Else
      MyButton.State = msoButtonUp
    End If
  Else
    MyButton.State = msoButtonUp
  End If
End Sub

'-------------------------------------------
'Normal.doct のThisDocument
Private Sub Document_Close()
  Call wdOrientationChecker(False)
End Sub

Private Sub Document_New()
  Call wdOrientationChecker(False)
End Sub

Private Sub Document_Open()
  Call wdOrientationChecker
End Sub

投稿日時 - 2010-02-14 23:52:03

お礼

Wendy02さん、早速のご回答ありがとうございます、

早速当方のVBEで、Normal.dotの標準モジュールのNewMacros(ここに他の細かいマクロも
入れてあります)に加える形で組み込んでみたんですが、
Word2003のツール→ユーザー設定→コマンドタブ→「分類」の「マクロ」に
wdOrientationCheckerが出てきません、、、

うう、初歩的な質問ですみませんが、なぜでしょう?
ツールバーにボタンがのっけられません。。。


それと、

> ここでは、ボタン名を、Orientation にしていますが、
> Set MyButton = Application.CommandBars("Menu Bar").Controls("Orientation") '要変更
> 表示のCaption に名称を合わせてください。

「表示のCaption に名称を合わせる」ということの意味がわからないのですが、
そちらを設定していないのが原因でしょうか。

#すみません、元質問のマクロも詳しい人に聞いたり
ネットの記事を参考にしたりで何とか作ったもので
マクロの考え方があまりよくわかっていなくてすみません。

投稿日時 - 2010-02-15 00:38:57

あなたにオススメの質問