Excel (VBA)

Excel VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(指定なし : Excel 2010)
「コンテンツの有効化」を必ず行なう方法
投稿日時: 19/05/31 12:05:34
投稿者: m024240

よろしくお願いします。
 
職場でエクセルに慣れていない方がかなりいて、
「コンテンツの有効化」を忘れて、
「再度入力する」または「その後VBAで処理することができない」ということが
頻繁におこっています。
 
これを改善するのに、現在A,B,C,Dのシートがあるブックに、
Eのシートを付け加えて、起動時にEシートだけ表示し、「有効化」のことに注意を促し、
「有効化」がクリックされたら、Eシートを非表示にしてA,B,C,D、のシートを表示する
ということができればと考え以下のようなコードを考えました。
ここで、2つのことでうまくいかないので、助言をいただきたいのですが、よろしくおねがいします。
 
1)有効化クリックのあと、Eシートが非表示にならない
(非表示にならなくても、A,B,C,Dシートが表示され、Aシートにチェンジできれば良い)
 
2)いつも「コンテンツの有効化」が表示されるようにしたい
 信頼できるドキュメントのためか、「有効化」の表示が出ないことがある
 
以上よろしくお願いします。
-----------------------------------------------------------------
thisworkbook に書いています
 
Private Sub Workbook_Open()
'ワークブックを開くとき、マクロを有効にすると編集ファイルが表示される
ThisWorkbook.Unprotect Password:="password"
    On Error Resume Next
    If ThisWorkbook.Sheets("E").Visible <> False Then ThisWorkbook.Sheets("E").Visible = False
    If ThisWorkbook.Sheets("A").Visible <> True Then ThisWorkbook.Sheets("A").Visible = True
    If ThisWorkbook.Sheets("B").Visible <> True Then ThisWorkbook.Sheets("B").Visible = True
    If ThisWorkbook.Sheets("C").Visible <> True Then ThisWorkbook.Sheets("C").Visible = True
    If ThisWorkbook.Sheets("D").Visible <> True Then ThisWorkbook.Sheets("D").Visible = True
    ThisWorkbook.Protect Password:="password"
    ThisWorkbook.RunAutoMacros Which:=xlAutoOpen
    On Error GoTo 0
         ThisWorkbook.Sheets("E").Visible = True
     Exit Sub
 End Sub

回答
投稿日時: 19/05/31 15:51:15
投稿者: WinArrow
投稿者のウェブサイトに移動

ブックを開いた時点では、Eシートが表示されているんですよね・・・
全てのシートを非表示にはできません。
 
従って、順序を逆にして、
A〜Dのシートを表示させてから
Eシートを非表示にすればよいでしょう。
 
コメント
 
Thisworkbookモジュールでは
「Thisworkbook」部分を「Me」記述できます。
また、With句を使用すると、コードが見やすくあります。
 
ヒントコード

    With Me
        If .Sheets("E").Visible Then
            If Not .Sheets("A").Visible Then .Sheets("A").Visible = True
            If Not .Sheets("B").Visible Then .Sheets("B").Visible = True
            If Not .Sheets("C").Visible Then .Sheets("C").Visible = True
            If Not .Sheets("D").Visible Then .Sheets("D").Visible = True
            .Sheets("E").Visible = False
        End If
    End With

 
[/i]

回答
投稿日時: 19/05/31 18:30:07
投稿者: Suzu

有効化 をしたいが為に マクロを使用するとは、本末転倒では?
 

引用:
職場でエクセルに慣れていない方がかなりいて

 
マニュアルを作成し教育する が 本筋 と考えますがいかがでしょうか。

回答
投稿日時: 19/05/31 20:00:22
投稿者: simple

Suzuさんのご意見に賛成です。
 
有効化のボタンを押させるのは、
それなりのリスク回避が目的だと思われます。
例えば、
・疑わしいリンクに注意喚起する、
・疑わしいマクロをチェック無しに実行することを避ける
ということが目的でしょうから、仮にマクロ対応ができたとしても、
それを無批判に有効とみなしてしまうことは却ってリスクが高まるのではないでしょうか。
やはり、ユーザーにそのことを認識して頂くのが先決じゃないでしょうか。

回答
投稿日時: 19/06/01 00:11:55
投稿者: 半平太

>2)いつも「コンテンツの有効化」が表示されるようにしたい
> 信頼できるドキュメントのためか、「有効化」の表示が出ないことがある
 
その希望からすると、ブックが開いた途端にマクロが実行される必要はないですよね。
 
そうであれば、このプロシージャ名は無益なので、ちょっと変更する
        ↓
 Private Sub Workbook_Open()
        ↓
 Public Sub WbOpen() とかに変更。
 
そして起動時に表示されるEシートの「有効化」の注意書きに
こんなのを追加する。
   ↓
 ★コンテンツの有効化後、次へボタンをクリックしてください
 ★コンテンツの有効化が表示されない場合は、単に次へのボタンをクリックしてください
 
その実行ボタンには、WbOpenを紐づけて置く。
 
話は変わりますが、
IF文でVisibleプロパティがFalseかどうか確認してから、
Trueに設定している箇所がありますが、確認する必要はないんじゃないですか?

投稿日時: 19/06/01 10:39:56
投稿者: m024240

WinArrow 様
コメントありがとうございます。
 
ブックにはA,B,C,D,Eのシートがあり、
起動時は、Eシートのみ表示させ、A,B,C,Dシートは表示させない。
「有効化」したら、Eを非表示にして、A,B,C,Dシートを表示する、です。
 
いただいたコードで試してみます。
  
ヒントコード
    With Me
        If .Sheets("E").Visible Then
            If Not .Sheets("A").Visible Then .Sheets("A").Visible = True
            If Not .Sheets("B").Visible Then .Sheets("B").Visible = True
            If Not .Sheets("C").Visible Then .Sheets("C").Visible = True
            If Not .Sheets("D").Visible Then .Sheets("D").Visible = True
            .Sheets("E").Visible = False
        End If
    End With
 
  

投稿日時: 19/06/01 10:55:57
投稿者: m024240

Suzu 様、simple 様
 
まとめてのコメントで失礼します。
 
職場全員にPC(Office付き)が配られ、業務を行っています。
(ネットワークにつながっています)
個々が作る報告書を最終的に一覧に移したくて、エクセルを用い始めました。
簡単に文字や数字を入れる業務は問題ないのですが、
文字、単文、数字を入れたものを一覧に移す(転記する)のに、
ボタンを設定してVBAを使って作業してもらおうと考えました。
 
これまで、社員研修や説明のシートなども作って取り組んでいましたが、
この運用自体が難しいのかと感じるところです。
そこで、必ず「有効化を押して作業させたい」と思った次第です。
 
本末転倒というご指摘をいただきましたが、
社内で効率化ができないかと考えて取り組んでいるところです。

回答
投稿日時: 19/06/01 11:09:21
投稿者: WinArrow
投稿者のウェブサイトに移動

m024240 さんの引用:

ブックにはA,B,C,D,Eのシートがあり、
起動時は、Eシートのみ表示させ、A,B,C,Dシートは表示させない。
「有効化」したら、Eを非表示にして、A,B,C,Dシートを表示する、です。

 
考え方ですが、
>Eを非表示にして、A,B,C,Dシートを表示する、
ではなく
A,B,C,Dシートを表示してから、Eを非表示にする
と考えます。
 
 
m024240 さんの引用:

  
ヒントコード
    With Me
        If .Sheets("E").Visible Then
            If Not .Sheets("A").Visible Then .Sheets("A").Visible = True
            If Not .Sheets("B").Visible Then .Sheets("B").Visible = True
            If Not .Sheets("C").Visible Then .Sheets("C").Visible = True
            If Not .Sheets("D").Visible Then .Sheets("D").Visible = True
            .Sheets("E").Visible = False
        End If
    End With

    With Me
        If .Sheets("E").Visible Then
            .Sheets("A").Visible = True
            .Sheets("B").Visible = True
            .Sheets("C").Visible = True
            .Sheets("D").Visible = True
            .Sheets("E").Visible = False
        End If
    End With
でもよいです。
 
ブックを閉じるときは、
この逆を実行します。
Eを表示してから、A、B、C、Dを非表示にします。

    With Me
        .Sheets("E").Visible = True
        .Sheets(Array("A", "B", "C", "D")).Visible = False
    End With
 
 

回答
投稿日時: 19/06/01 11:40:25
投稿者: mattuwan44

Eシートの役割は、マクロを起動するボタンを置いておくだけですか?
 
もしそうならば、その役割を、ユーザーフォームとか別のブックに任せてみてはいかがでしょうか?
別のブックからマクロ付ブックをマクロで開いたら、
必ずマクロが有効で開かれるようです。。。
(ネットで検索した情報なので、実際試してはいないのですが^^;)

回答
投稿日時: 19/06/01 15:04:34
投稿者: WinArrow
投稿者のウェブサイトに移動

「コンテンツの有効」をしなくても
「マクロ有効」でブックを開く方法は、他にもあります。
 
(1)当該ブックを「信頼できる場所」に配置する方法
(2)他ブックから、開く方法(mattuwan44 さんの紹介)
  但し、他ブックで「コンテンツの有効」をする必要があります。
(3)VBSで当該ブックを開く方法
  VBSを利用するとEシートで「コンテンツを有効」を促す必要もありません。
 

トピックに返信