プロが教えるわが家の防犯対策術!

VBA初心者です。下記マクロについて1行ずつ本文の意味を考えています。
Set ss = Workbooks(wn).Windows(1).SelectedSheetsの部分の意味、特にWindows(1)の意味が分かりません。
n = ss.Count - 1はssのシートの数を求めているのだと思いますが、求めたnがその後どのように使われているのか分かりません。
sn.Nameとed:も分かりません。
ご教示よろしくお願いいたします。





'保護、保護解除をしたいシートをすべて選択してからマクロ実行

Sub 複数シートの保護()
Dim wn As Variant, n As Integer
Dim P As Variant, sn As Variant, ss As Variant
Application.ScreenUpdating = False
'画面表示の更新を制御マクロVBAの実行中に画面表示の更新を止めて、マクロを高速に処理されるようにします。

Application.DisplayAlerts = False
'確認メッセージを省略



P = InputBox("選択シートを保護/解除します" & Chr(13) & "パスワードを入力してください", "複数シートの保護")
wn = ActiveWorkbook.Name

Set ss = Workbooks(wn).Windows(1).SelectedSheets
n = ss.Count - 1
For Each sn In ss
Sheets(sn.Name).Select
If ActiveSheet.ProtectContents Then
ActiveSheet.Unprotect Password:=P

Else
ActiveSheet.Protect Password:=P
End If
Next
ed:
ss.Select
Application.DisplayAlerts = False
Application.ScreenUpdating = True
End Sub

A 回答 (3件)

No1です



>「snはシートオブジェクト」とはどういうことでしょうか。
Variantの型宣言は、各種の値を保持できる汎用的な型宣言です。
ですので、これでシートオブジェクトと決まっているわけではありません。

>For Each sn In ss
としているので、結果的に、そのループ内ではsnはシートオブジェクトを表すことになります。
(ssはシートオブジェクトのコレクション)
    • good
    • 0
この回答へのお礼

ありがとうございます。ssに特に意味があると言う訳ではなく、Set ss = ActiveWindow.SelectedSheetsと書いているのでシートオブジェクトということで間違いないでしょうか。色々難しいですね。

お礼日時:2021/03/20 21:55

[1] wnはworkbookを複数開いている場合にactiveになってるworkbookの名前。

そのworkbookをWorkbooks(wn)で指定している。てことは、つまりActiveWorkbookのこと。だからwnなんか要らない。
さらに、Windows(1)はwindowを複数開いている場合に「一番手前になってるwindow」を指定しているんで、
Set ss = ActiveWindow.SelectedSheets
で済んじゃうでしょう。
[2] Sheets(sn.Name)はsheet snの名前を取り出して、その名前のsheetを指定しているわけで、それってsnのこと。だからsnだけで済む。
[3] nは使ってない。
[4] DisplayAlertsを止める必要があるんかしらん?
[5] ed: はこのプログラムでは意味がない。恐らくは「パスワードが違うためにunprotectが失敗した」という時にGotoで行く先のラベルだと思われるけれど、使ってない。そこでエラー処理(手抜きだけど)を付けてみると

Sub 複数シートの保護()
Dim wn As Variant
Dim P As Variant, sn As Variant, ss As Variant
P = InputBox("選択シートを保護/解除します" & Chr(13) & "パスワードを入力してください", "複数シートの保護")
Application.ScreenUpdating = False
Set ss = ActiveWindow.SelectedSheets
On Error GoTo ed
For Each sn In ss
sn.Select
If ActiveSheet.ProtectContents Then
ActiveSheet.Unprotect Password:=P
Else
ActiveSheet.Protect Password:=P
End If
more:
Next sn
Application.ScreenUpdating = True
Exit Sub
ed:
MsgBox sn.Name & "のパスワードが違うみたいっす"
Resume more
End Sub
    • good
    • 0
この回答へのお礼

丁寧な返信ありがとうございます。
皆さんの回答を参考にしたところ、色々必要のないものが含まれているようですね。余計なところをそぎ落とすと下記のような感じになり、マクロ実行することができました。色々な方法があってややこしいですね。


'保護、保護解除をしたいシートをすべて選択してからマクロ実行
'保護されたシートは保護解除に、保護されていないシートは保護されることに注意

Sub 複数シートの保護()

Dim P As Variant, sn As Variant, ss As Variant


Application.ScreenUpdating = False
'画面表示の更新を制御マクロVBAの実行中に画面表示の更新を止めて、マクロを高速に処理されるようにします。

Application.DisplayAlerts = False
'確認メッセージを省略



P = InputBox("選択シートを保護/解除します" & Chr(13) & "パスワードを入力してください", "複数シートの保護")

Set ss = ActiveWindow.SelectedSheets

For Each sn In ss
sn.Select
If ActiveSheet.ProtectContents Then
ActiveSheet.Unprotect Password:=P

Else
ActiveSheet.Protect Password:=P
End If
Next


Application.DisplayAlerts = False
Application.ScreenUpdating = True
End Sub

お礼日時:2021/03/20 19:15

こんにちは



>特にWindows(1)の意味が分かりません。
選択されたシートを取得するのに、SelectedSheetsプロパティを利用するのが簡単ですが、このプロパティはwindowオブジェクトのプロパティなので、まずwindowを取得しているという次第でしょう。
ActiveWorkbook.Nameから求めなくても、
 Application.Windows(1).SelectedSheets
で、直接同様の結果を得ることも可能です。
https://docs.microsoft.com/ja-jp/office/vba/api/ …

>求めたnがその後どのように使われているのか分かりません。
ご提示の範囲では使っていないようです。
ですので、その一行はコメントアウトしても機能的に変わりはないでしょう。

>sn.Nameとed:も分かりません。
snはシートオブジェクトなので、
>Sheets(sn.Name).Select

 sn.Select
と同じことですね。
一方で、ed: はプログラム上のラベルです。
GOTO文の ジャンプ先等、処理上の位置の明示に利用されます。
https://docs.microsoft.com/ja-jp/dotnet/visual-b …

ご提示のコードの場合は、特になくても機能しますが、「end処理」のような意味合いでラベルを付けているのではないかと推測されます。
    • good
    • 0
この回答へのお礼

ありがとうございます。基本的なことなのだと思いますが、「snはシートオブジェクト」とはどういうことでしょうか。Dim sn As Variantとするだけでシートオブジェクトなのでしょうか。

お礼日時:2021/03/20 18:59

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!