- ベストアンサー
エクセルVBAで名前の決まっているシートの倍率変更
- エクセルVBAを使用して、名前の決まっているシートの倍率を変更する方法について質問があります。
- シートはA,B,C,Dの7月とEの6月の数字が入っており、それぞれのシートがある場合にのみ処理を実行するようにエラー処理を行っています。
- しかし、何らかの理由で処理が正常に動作せず、特にe2:のラインで停止してしまう状況です。質問者は実際に必要なマクロとして利用したいため、解決策を知りたいとのことです。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
on error gotoを安直に間違って使用しています。 on error gotoでジャンプした場合,ジャンプ先は「エラー処理ルーチン」という特別な処理に入っています。 その中では「resumeするまでは」,たとえば重ねてon errorを使うことはできません(機能しません)。 敢えて今のプログラムの方針のまま通すとすれば Sub bairitu() on error goto e0 Worksheets("sheet" & Month(now())).Select '7 ActiveWindow.Zoom = 60 r0: On Error GoTo e1 Worksheets("sheet" & Month(now()) - 1).Select '6 ActiveWindow.Zoom = 70 r1: On Error GoTo e2 Worksheets("sheet" & Month(now()) - 2).Select '5 ActiveWindow.Zoom = 80 r2: On Error GoTo e3 Worksheets("sheet" & Month(now()) - 3).Select '4 ActiveWindow.Zoom = 50 r3: on error goto e4 Worksheets("sheet" & Month(now())).Select r4: exit sub e0: resume r0 e1: resume r1 e2: resume r2 e3: resume r3 e4: resume r4 End Sub といった段取りになります。
その他の回答 (3)
- jcctaira
- ベストアンサー率58% (119/204)
vitaminQQさん こんにちは。 「On Error GoTo」を多用するとプログラムが見難くなるし「Resume」が絡むのですっきりしなくなると思います。 なるべく関数やサブルーチンにして、メインを単純にするとわかりやすいプログラムになると思います。 以下、一例です。 Sub bairitu() Call シート倍率設定("sheet" & Month(Now()) - 1, 70) Call シート倍率設定("sheet" & Month(Now()) - 2, 80) Call シート倍率設定("sheet" & Month(Now()) - 3, 50) Call シート倍率設定("sheet" & Month(Now()), 60) End Sub Sub シート倍率設定(シート名 As String, 倍率 As Double) On Error Resume Next Err.Clear Sheets(シート名).Select If Err.Number <> 0 Then Exit Sub ActiveWindow.Zoom = 倍率 End Sub
お礼
シート名がsheet+n以外にも予測表のように文字だけの物もありましたので、コレを参考に作れるなと思いました。 また自分のレベルでも出来そうなので、挑戦してみます。ありがとうございました!!
- keithin
- ベストアンサー率66% (5278/7941)
ではon errorのちょっと違う使い方で。 Sub macro1() Dim a(3, 1) Dim i Dim w As Worksheet For i = 0 To 3 a(i, 0) = "Sheet" & (Month(Date) - i) a(i, 1) = Array(60, 70, 80, 50)(i) Next i Application.ScreenUpdating = False On Error Resume Next For Each w In Worksheets w.Select ActiveWindow.Zoom = Application.VLookup(w.Name, a, 2, False) Next Worksheets(a(0, 0)).Select Application.ScreenUpdating = True End Sub #余談 安直な思いつき追加質問をする方って,往々にして元のご質問は綺麗に忘れて「追加質問の解決で万歳」になるヒトがとっても多いです。マジメに回答するのがバカみたいですね。
お礼
感謝してます♪ マクロって知っている人が自分が並べたコードを見た時に、整理整頓できるのかとか、基礎があるのかとか分かると思います。センスも有る無しありますし、自分以外の人なら同じ仕事をするのにどういう構文を何行書くのかなとか色々あると思い、質問させて頂きました。 勉強しているから、たくさんの人の意見を聞けた事に感謝です。早速実行したいのですが、なぜか私のMACPC漢字がVBA上でかけなくなったので全てwinPCのエクセル上で再生してみるつもりです!! ありがとうございました!!
- nayuta_lot
- ベストアンサー率64% (133/205)
こんにちは プログラムをループさせる、やり方をひとつ載せておきます。 一応、理解してからご使用ください。 ループさせなくてもよいとは思いますが、覚えておくと応用できると思います。 Sub bairitu2() Dim i As Integer On Error GoTo Err_Rtn For i = 0 To 3 Worksheets("Sheet" & Month(Now()) - i).Select If i = 0 Then '当月 ActiveWindow.Zoom = 60 ElseIf i = 1 Then '前月 ActiveWindow.Zoom = 70 ElseIf i = 2 Then '前々月 ActiveWindow.Zoom = 80 ElseIf i = 3 Then '前々々月 ActiveWindow.Zoom = 50 End If re: Next i Worksheets("sheet" & Month(Now())).Select Exit Sub Err_Rtn: Resume re End Sub 【解 説】 まず、選択するシートについては、当月、前月、前々月、前々々月と1カ月づつさかのぼって いますので、 Month(Now()) - i (i は 0から3)で表すことができます。 Now()は7月でいえば、7なので、Month(Now()) - i は、7から4になりますね。 そこでFor nextを使用してループさせ、 For i = 0 To 3 Worksheets("Sheet" & Month(Now()) - i).Select Next i とします。 しかし、ループするには以下の問題があります。 1.毎月、処理が異なること。 2.毎月、シートがあるとは限らないこと。 そこで、1の問題に対応するためにIF文を使用して変数の値によって、処理を変えます。 If i = 0 Then '当月 ActiveWindow.Zoom = 60 ElseIf i = 1 Then '前月 ActiveWindow.Zoom = 70 ElseIf i = 2 Then '前々月 ActiveWindow.Zoom = 80 ElseIf i = 3 Then '前々々月 ActiveWindow.Zoom = 50 End If のように書き、変数の値によって、Zoomの倍率を変更する処理をします。 こうすると、ループの中に入れられるので、さらに前の月の処理が必要になれば、 For i = 0 To 3を、For i = 0 To 4に変えて IF文の一番したに ElseIf i = 4 Then ActiveWindow.Zoom = 65 のように追加してやればよいのです。 さて、問題の2番目エラー処理ですが、プログラムの先頭にOn Error GoTo Err_Rtn を一回入れておきます。 シートがなく、エラーが発生した場合には、まず、Err_Rtnへとびます。 エラーが起きたら無視して、次の月を処理したいわけです。 では、どこへ戻ればよいのでしょうか? For i = 0 To 3 Worksheets・・・ IF ・・・ End IF Next i : 次に月を処理したいのですから、i の変数をひとつ増やす必要があります。 従って、Next iの上に戻りたいわけです。 For i = 0 To 3 Worksheets・・・ IF ・・・ End IF re: Next i そこで、next iの上にre:という戻り場所を設置して、Err_Rtnではそこに戻るように Resume re としておきます。 こうすると、エラー処理は一回で済みます。 For文を抜けたら、最後にWorksheets("sheet" & Month(Now())).Selectでシートを 戻して、終了したいのですが、このままいくとそのままErr_Rtnに突入してしまいますので Exit Sub を入れて終了します。 以上、長くなりましたが、今後のマクロ作成の参考にしてください。 それでは
お礼
自分の並べた構文を減らすアイディアを頂きました!!なんかパズルみたいですね。以前ちょっとだけVBA.NETを習っただけなので中々私には難かしくて困っておりました。ループもこんな使い方があるんですね、、。自分のマクロノートにしっかり書き留めます。ありがとうございました。
お礼
なるほど。resumeを入れなかったから、 On Error が働かなかったり、またシート名も多分機能しなくなってしまうのでしょうかね!?助かりました。どうでも良いこのシート倍率合わせを簡単にできるのでとっても助かります。 retryでエラー処理をしてもダメだったので困っていました。早速やってみます。 安易な質問になってしまいますが、もっとこんな風に作れば!?という提案があればご指導願います!!! マクロがあれば、仕事するのが楽しくなります♪ありがとうございました!!