[[20241121120546]] 『マクロの内容を追加したい』(たそち) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『マクロの内容を追加したい』(たそち)

マクロの内容を追加したいです。

今あるマクロは「Excelを閉じる時に指定のパスワードをかける」もので、
コードは以下です。

Private Sub Workbook_BeforeClose(Cancel As Boolean)
'Update by Extendoffice 2018/1/24
Dim xSheet As Worksheet
Dim xPsw As String
xPsw = "指定のパスワード"
For Each xSheet In Worksheets
xSheet.Protect xPsw
Next
End Sub

追加したい内容は「保護をかけた状態でもオートフィルターのみ使えるようにする」です。
やり方がわからず、すみませんがよろしくお願いいたします。

< 使用 Excel:Microsoft365、使用 OS:Windows11 >


マクロ記録!
(????) 2024/11/21(木) 12:21:32

シート保護状態でオートフィルタを使用できるようにする。>>

https://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_020_020.html

ここを参考にしてはいかがでしょうか?

(まっつわん) 2024/11/21(木) 12:45:11


お二方ともありがとうございます。
マクロ記録ではうまくいきませんでした。。。

まっつわん様が教えてくださったところも質問前に確認しており、試してみたのですが
こちらのマクロと、すでに設定しているマクロを繋げることができず、すでにあるマクロがエラーになってしまいます。

どうすればよいでしょうか。。。
(たそち) 2024/11/21(木) 13:04:13


マクロ記録を見せて下さい

(????) 2024/11/21(木) 13:16:40


ヘルプに使用例がありましたよ。
https://learn.microsoft.com/ja-jp/office/vba/api/excel.worksheet.enableautofilter

あとはさっきのサイトと見比べたら、やりたいことは、こんな感じじゃないですか?

Sub test()

    Dim ws As Worksheet
    Const xPsw As String = "****"                'シートの保護のパスワード

    For Each ws In Worksheets
        With ws
            If .ProtectContents = False Then  '保護がかかっているかチェック
                .EnableAutoFilter = True
                .Protect Password:=xPsw, _
                         UserInterfaceOnly:=True
            End If
        End With
    Next
End Sub

必ずシートの保護が解除されているわけでもないでしょうから、
シートの保護の状態で条件分岐も入れてみました。参考になれば。

(まっつわん) 2024/11/21(木) 13:50:25


すみません、マクロ記録はいまいち使い方が分からずうまくいかなかったです。。

まっつわん様にいただいた内容で試してみたところ、Excelを閉じたときに自動でパスワードをかけて保護、ができないようになりました。
マクロに明るくなく、調べたコードをそのまま入れているようなレベルの理解度ですので、もしお時間あれば以下条件でコードご教示いただけませんでしょうか。。。

・Excelを閉じるタイミングで必ずパスワード付きの保護をしたい
・保護はシート全体
・保護している状態でもフィルターは使える状態としたい
・フィルター以外は保護を解除しない限り一切編集不可としたい
・保護を解除した際にもフィルターは使用する

なにか不足ありましたらご教示ください。
(たそち) 2024/11/21(木) 18:04:28


 >Sub test()

Private Sub Workbook_BeforeClose(Cancel As Boolean)

あれー?ここ直しました?

こちらでテストしたコードをそのまま上げちゃいました。
混乱させたならすみません。

(まっつわん) 2024/11/21(木) 18:30:08


あ、マクロの記録では、

EnableAutoFilter

の部分は記録されなかったので、そこは別で探るしかなさそうです。
うまくいかなかったのはしょうがないので安心してください。

(まっつわん) 2024/11/21(木) 18:35:06


いま入れているのはこれなのですが、合ってますでしょうか?
こちらの内容で入れてもやはり、フィルターは使えませんでした。

Private Sub Workbook_BeforeClose(Cancel As Boolean)
'Update by Extendoffice 2018/1/24
Dim ws As Worksheet
Const xPsw As String = "指定のパスワード"
For Each ws In Worksheets
With ws
If .ProtectContents = False Then
.EnableAutoFilter = True
.Protect Password:=xPsw, _
UserInterfaceOnly:=True
End If
End With
Next
End Sub
(たそち) 2024/11/21(木) 19:03:25


ほんとですね。

閉じるときにやるのではなく、開いたときにマクロを実行した方が
良いかも知れません。

使う人にとっては同じことかと。
(まっつわん) 2024/11/21(木) 19:23:25


開いたときに鍵をかける、ということでしょうか?
すみません、マクロの言語が分からないので臨機応変に変更ができず、テンプレートを貼り付けるしかないので厳しそうです。。。
調べてみてコードがなければ諦めるしかなさそうです。
お手数おかけしました。
(たそち) 2024/11/22(金) 09:52:35

シート保護状態でオートフィルタを使用できるようにする。>>
https://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_020_020.html

こちらでは、Openの時に設定されていましたよ?

(まっつわん) 2024/11/22(金) 10:17:28


すみません。記事の内容があまり理解できていませんでした。
こちらのコードを参考に編集してみましたが、これだとパスワード無しでの保護になってしまいます。。。
パスワードをつける場合はどこに何を入れれば良いでしょうか?

マクロ2つを同時に実行すればいいのかと思い、このようにしてみましたが、パスワードはかけられませんでした。

Private Sub Workbook_Open()

      Dim objSh As Worksheet
      For Each objSh In ThisWorkbook.Worksheets
            If objSh.AutoFilterMode = Then
                 objSh.Protect AllowFiltering:=True
            End If
     Next objSh
     End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
'Update by Extendoffice 2018/1/24

       Dim xSheet As Worksheet
       Dim xPsw As String
       xPsw = "指定のパスワード"
       For Each xSheet In Worksheets
              xSheet.Protect xPsw
       Next
End Sub
(たそち) 2024/11/22(金) 10:56:23

                .EnableAutoFilter = True     ’←オートフィルターにチェック
                .Protect Password:=xPsw, _    '←パスワード 
                         UserInterfaceOnly:=True '←必要かどうかわからないけど、サンプル見ると書いてある

合わせ技で出来ませんか?
(まっつわん) 2024/11/22(金) 11:04:53


xPsw, _ を入れると「名前付き引数」というエラーが出てしまいました。
試しに以下にしてみましたが、エラーは出ないもののパスワードはかかりませんでした。

Option Explicit

Private Sub Workbook_Open()

    Dim objSh As Worksheet
    For Each objSh In ThisWorkbook.Worksheets
        With objSh
            .EnableOutlining = True
            .EnableAutoFilter = True
            .Protect Password:=xPsw
            xPsw="指定のパスワード "
            .Protect UserInterfaceOnly:=True
        End With
    Next objSh
    ThisWorkbook.Saved = True
End Sub
(たそち) 2024/11/22(金) 11:39:13

もしかして、呪文だけならったら、出来るって思ってる?
なんとなーく読んで1行1行の意味を読み解かないと、
構成しなおすのは難しいのではないかなぁ。。。

'ファイルを開いたときに実行
Private Sub Workbook_Open()

    Dim ws As Worksheet
    Const xPsw As String = "****"                'シートの保護のパスワード

    For Each ws In Worksheets
        ws.EnableAutoFilter = True              'オートフィルター操作可
        ws.Protect Password:=xPsw, _
                   UserInterfaceOnly:=True      'パスワードとマクロの操作可を設定して保護
    Next
End Sub

これだけでいいと思います。
一応大丈夫そうでしたが、ほんとにいいのかは不明。
エラーにはならないけど、すでに保護してあったら、
どうなるんだろう。。。。
オートフィルターが解除されていたら、エラーになるし。。。

Private Sub Workbook_BeforeClose(Cancel As Boolean) ← ファイルを閉じる前に実行
こっち以下は削除してください。
(まっつわん) 2024/11/22(金) 11:47:44


 こうなのでは?
 Worksheet.Protect の AllowFiltering引数にTrue を指定

 Private Sub Workbook_BeforeClose(Cancel As Boolean)
   Const passwd As String = "12345"
   Dim ws As Worksheet
   For Each ws In ThisWorkbook.Worksheets
      ws.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, AllowFiltering:=True, Password:=passwd
   Next                                 '^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 End Sub
(´・ω・`) 2024/11/22(金) 11:52:09

ご教示いただきありがとうございます。
そのようには思っておらず、意味は理解しようとしているのですが、そもそもプログラム言語?等の分野とは無縁の文系で、1つ1つのエラーや文字を理解することができないため、ある程度分かりやすく記載されているものを少し編集して使おうとしていました。

不勉強で申し訳ありませんでした。お手数おかけいたしました。
記載いただいたもので試してみます。
(たそち) 2024/11/22(金) 11:58:15


 シートの保護の設定のなかに、ユーザーに許容する動作の選択肢があり、
 そのなかに「オートフィルターの使用」というのがあります。
 これを選択して保護する動作をマクロ記録すれば、「オートフィルターの使用」設定に対応する
 マクロコードが判明します。
   (なお、注意点は、これは「オートフィルタの設定が許可されるわけではない」ことです。
     保護される前に設定されたオートフィルタの選択肢の変更ができる、と言う意味です。
     オートフィルタの設定は保護されていたらできません。)

 既に指摘がありますように、AllowFiltering:=Trueと言う指定をして保護すればよいだけです。

 ちなみに、以下、閲覧者へのご参考です。
 ActiveSheet.EnableAutoFilter = True 
 ActiveSheet.Protect contents:=True, userInterfaceOnly:=True
 をBeforeCloseイベントプロシージャで実行し、保存を促すダイアログが出て保存したとしても
 次回に開いたときにオートフィルタは使えません。つまり、それは永続的な設定にはならないのです。

 これは userInterfaceOnly:=Trueを使った保護は、ブックに永続的に残るわけではないことに由来します。
 つまり、userInterfaceOnly:=Trueを使った操作は、ブックを閉じたら無効になる仕様なので、
 userInterfaceOnly:=Trueはブックを開いたときに、その都度実行する必要があり、それが推奨されるわけです。
 このあたりは Protectメソッドのヘルプにも書かれています。

 一方で userInterfaceOnly:=Trueを使わずに普通に AllowFiltering:=True をセットして保護した場合は、
 保存後再度開いても設定は有効に残っています。

(xyz) 2024/11/22(金) 14:31:33


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.