電子書籍の厳選無料作品が豊富!

Dim mm As Integer
Dim ws_4 As Worksheet
Dim ws_5 As Worksheet
Dim ws_6 As Worksheet
Set ws_4 = Worksheets("4 月")
Set ws_5 = Worksheets("5 月")
Set ws_6 = Worksheets("6 月")

for mm=4 to 6 step 1
Sheets("ws_" & mm).Activate ←
ActiveSheet.Unprotect
next mm

シート名 4 月,5 月,6 月を順次アクティブにするマクロにしたつもりですが
←行でインデックスが有効範囲外というエラーメッセージがでます。
なぜなんでしょうか。解決策はありませんか。
ご教授よろしくお願い致します。

A 回答 (3件)

No1です。



>今後の為ご教授いただければうれしいです。
4月~3月であれば、連番とほぼ同様なので、計算で指定することも可能ですが、連番等ではない場合にはシート名を配列に入れておいて順番に呼び出せば良いです。
以下は、そんな方法での例です。

Dim sName, i As Long
sName = Array(4, 5, 6, 7, 8, 9, 10, 11, 12, 1, 2, 3)

For i = 0 To 11
MsgBox sName(i) & " 月"

' シートを表示するなら以下で↓
'Worksheets(sName(i) & " 月").Activate
' その後の処理
Next i

※ " 月"部分が共通なので、サンプルでは数字部分だけにしてしまいましたが、
  sName = Array("4 月", "5 月", "6 月", ・・・
 のようにしておく方が、実際にはわかりやすいと思います。
※ ループの制御変数(=i)の初期値や範囲が変わることにご留意ください。
    • good
    • 1
この回答へのお礼

ご回答ありがとうございました。
配列に入れる方法をご教授いただきありがとうございました。

お礼日時:2022/06/24 20:23

横から失礼します


ご質問のコードを生かすと
配列を使えば、こんなことも出来ますが・・・

Dim mm As Integer
Dim ws_(4 To 6) As Worksheet
Set ws_(4) = Worksheets("4 月")
Set ws_(5) = Worksheets("5 月")
Set ws_(6) = Worksheets("6 月")
For mm = 4 To 6 Step 1
ws_(mm).Activate '←
ActiveSheet.Unprotect
Next mm
    • good
    • 1
この回答へのお礼

ご回答ありがとうございました。
参考になります。
今後共よろしくお願いします。

お礼日時:2022/06/24 20:20

こんにちは



変数mmの値は、最初のループでは4になっています。
>Sheets("ws_" & mm).Activate
では「ws_4」というシート名のシートをActivateしようとしますが、「ws_4」というシート名のシートは存在しないのではないでしょうか?
ですので、エラーになっているものと推測されます。

4 月、5 月、6 月というシートを順にアクティブになさりたければ、
 Worksheets( mm & " 月").Activate
とすることで、できるものと想像します。
    • good
    • 1
この回答へのお礼

ご回答ありがとうございました。
ご指摘の通り実行させると解決いたしました。

実を言うと本ファイルのシートは今年の4月から12月までと来年の1月から3月まで存在します。その為シート名を("ws_" & mm)におきかえ,来年の1月から3月を 「ws_13」「ws_14」「ws_15」にし,「ws_4」から「ws_15」を処理させようとしました。
シート名は実際のシート名で判別させるべきなのですか。
ご指摘の方法で For文を4月~12月と1月~3月を作れば問題は解決するのですが今後の為ご教授いただければうれしいです。

お手数おかけしますがよろしくお願いします。

お礼日時:2022/06/24 17:35

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