アプリ版:「スタンプのみでお礼する」機能のリリースについて

早速ですが名前の決まっているそれぞれのシートがあります実際にはA,B,C、D7月、E6月と今月と先月の数字が入っています。

それぞれのシートはいつもあるとは限らない為エラー処理をしましたが、なぜかうまくいきません。

下記の例ではsheet7、sheet5、sheet3。とありそれぞれの倍率に合わせた後に最後にsheet7のシートに戻るようにしましたがe2:のラインで止まってしまいます。
練習ではなく実際に必要なマクロなので、助言して頂ければ幸いです。
よろしくお願いします。

Sub bairitu()

Worksheets("sheet" & Month(now())).Select '7
ActiveWindow.Zoom = 60

On Error GoTo e1
Worksheets("sheet" & Month(now()) - 1).Select '6
ActiveWindow.Zoom = 70

e1:
On Error GoTo e2
Worksheets("sheet" & Month(now()) - 2).Select '5
ActiveWindow.Zoom = 80

e2:
On Error GoTo e3
Worksheets("sheet" & Month(now()) - 3).Select '4
ActiveWindow.Zoom = 50

e3:
Worksheets("sheet" & Month(now())).Select

End Sub

A 回答 (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

といった段取りになります。
    • good
    • 0
この回答へのお礼

なるほど。resumeを入れなかったから、 On Error が働かなかったり、またシート名も多分機能しなくなってしまうのでしょうかね!?助かりました。どうでも良いこのシート倍率合わせを簡単にできるのでとっても助かります。

retryでエラー処理をしてもダメだったので困っていました。早速やってみます。
安易な質問になってしまいますが、もっとこんな風に作れば!?という提案があればご指導願います!!!
マクロがあれば、仕事するのが楽しくなります♪ありがとうございました!!

お礼日時:2011/07/02 06:18

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
    • good
    • 2
この回答へのお礼

シート名がsheet+n以外にも予測表のように文字だけの物もありましたので、コレを参考に作れるなと思いました。
また自分のレベルでも出来そうなので、挑戦してみます。ありがとうございました!!

お礼日時:2011/07/03 10:44

では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



#余談
安直な思いつき追加質問をする方って,往々にして元のご質問は綺麗に忘れて「追加質問の解決で万歳」になるヒトがとっても多いです。マジメに回答するのがバカみたいですね。
    • good
    • 0
この回答へのお礼

感謝してます♪
マクロって知っている人が自分が並べたコードを見た時に、整理整頓できるのかとか、基礎があるのかとか分かると思います。センスも有る無しありますし、自分以外の人なら同じ仕事をするのにどういう構文を何行書くのかなとか色々あると思い、質問させて頂きました。

勉強しているから、たくさんの人の意見を聞けた事に感謝です。早速実行したいのですが、なぜか私のMACPC漢字がVBA上でかけなくなったので全てwinPCのエクセル上で再生してみるつもりです!!
ありがとうございました!!

お礼日時:2011/07/02 23:11

こんにちは



プログラムをループさせる、やり方をひとつ載せておきます。
一応、理解してからご使用ください。
ループさせなくてもよいとは思いますが、覚えておくと応用できると思います。

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

を入れて終了します。

以上、長くなりましたが、今後のマクロ作成の参考にしてください。
それでは
    • good
    • 0
この回答へのお礼

自分の並べた構文を減らすアイディアを頂きました!!なんかパズルみたいですね。以前ちょっとだけVBA.NETを習っただけなので中々私には難かしくて困っておりました。ループもこんな使い方があるんですね、、。自分のマクロノートにしっかり書き留めます。ありがとうございました。

お礼日時:2011/07/02 23:17

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