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
No.3
- 回答日時:
No1です
>「snはシートオブジェクト」とはどういうことでしょうか。
Variantの型宣言は、各種の値を保持できる汎用的な型宣言です。
ですので、これでシートオブジェクトと決まっているわけではありません。
>For Each sn In ss
としているので、結果的に、そのループ内ではsnはシートオブジェクトを表すことになります。
(ssはシートオブジェクトのコレクション)
ありがとうございます。ssに特に意味があると言う訳ではなく、Set ss = ActiveWindow.SelectedSheetsと書いているのでシートオブジェクトということで間違いないでしょうか。色々難しいですね。
No.2ベストアンサー
- 回答日時:
[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
丁寧な返信ありがとうございます。
皆さんの回答を参考にしたところ、色々必要のないものが含まれているようですね。余計なところをそぎ落とすと下記のような感じになり、マクロ実行することができました。色々な方法があってややこしいですね。
'保護、保護解除をしたいシートをすべて選択してからマクロ実行
'保護されたシートは保護解除に、保護されていないシートは保護されることに注意
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
No.1
- 回答日時:
こんにちは
>特に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処理」のような意味合いでラベルを付けているのではないかと推測されます。
ありがとうございます。基本的なことなのだと思いますが、「snはシートオブジェクト」とはどういうことでしょうか。Dim sn As Variantとするだけでシートオブジェクトなのでしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(Microsoft Office) マクロVBAについて 1 2022/09/06 18:12
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Excel(エクセル) VBAで組み合わせ算出やCOUNTIFSの処理を高速化したいです。 4 2022/04/07 02:38
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Visual Basic(VBA) エクセルのマクロについて教えてください。 7 2023/07/04 09:18
- PowerPoint(パワーポイント) エクセルのマクロについて教えてください。 1 2022/03/25 17:03
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2022/10/13 08:41
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/06/09 12:17
- Visual Basic(VBA) 貼り付けた値が消えていく 以下はソースファイルの2番目のシートのB6から最終行を取得 ターゲットファ 2 2023/07/27 12:23
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
別のシートから値を取得するとき
-
Excelマクロのエラーを解決した...
-
【ExcelVBA】全シートのセルの...
-
ユーザーフォームに入力したデ...
-
ExcelのVBAのマクロで他のシー...
-
【Excel VBA】Worksheets().Act...
-
実行時エラー1004「Select メソ...
-
同じ作業を複数のシートに実行...
-
実行時エラー'1004': WorkSheet...
-
excelのマクロで該当処理できな...
-
特定の文字を含むシートだけマ...
-
シートが保護されている状態で...
-
エクセルのシート名変更で重複...
-
XL:BeforeDoubleClickが動かない
-
VBAでオブジェクト変数にsetし...
-
VBA 最終行まで数式をコピーする
-
エクセルVBA Ifでシート名が合...
-
VBA 検索して一致したセル...
-
ブック名、シート名を他のモジ...
-
Excel マクロについての相談
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
別のシートから値を取得するとき
-
ユーザーフォームに入力したデ...
-
【ExcelVBA】全シートのセルの...
-
同じ作業を複数のシートに実行...
-
Excelマクロのエラーを解決した...
-
excelのマクロで該当処理できな...
-
XL:BeforeDoubleClickが動かない
-
ExcelVBA シート名を複数セルか...
-
実行時エラー'1004': WorkSheet...
-
VBA 存在しないシートを選...
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
-
ブック名、シート名を他のモジ...
-
【Excel VBA】Worksheets().Act...
-
ExcelのVBAのマクロで他のシー...
-
エクセルのシート名変更で重複...
-
特定の文字を含むシートだけマ...
-
シートが保護されている状態で...
-
Excel マクロについての相談
-
VBA 検索して一致したセル...
おすすめ情報