早速ですが名前の決まっているそれぞれのシートがあります実際には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
No.1ベストアンサー
- 回答日時:
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
といった段取りになります。
なるほど。resumeを入れなかったから、 On Error が働かなかったり、またシート名も多分機能しなくなってしまうのでしょうかね!?助かりました。どうでも良いこのシート倍率合わせを簡単にできるのでとっても助かります。
retryでエラー処理をしてもダメだったので困っていました。早速やってみます。
安易な質問になってしまいますが、もっとこんな風に作れば!?という提案があればご指導願います!!!
マクロがあれば、仕事するのが楽しくなります♪ありがとうございました!!
No.2
- 回答日時:
こんにちは
プログラムをループさせる、やり方をひとつ載せておきます。
一応、理解してからご使用ください。
ループさせなくてもよいとは思いますが、覚えておくと応用できると思います。
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を習っただけなので中々私には難かしくて困っておりました。ループもこんな使い方があるんですね、、。自分のマクロノートにしっかり書き留めます。ありがとうございました。
No.3
- 回答日時:
では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のエクセル上で再生してみるつもりです!!
ありがとうございました!!
No.4
- 回答日時:
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以外にも予測表のように文字だけの物もありましたので、コレを参考に作れるなと思いました。
また自分のレベルでも出来そうなので、挑戦してみます。ありがとうございました!!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ACCESSのVBAにてExcelのシ...
-
Excelマクロ 別シートへ連続コ...
-
教えて下さい
-
配列数式の解除
-
メッセージボックスのOKボタ...
-
エクセルで特定の列が0表示の場...
-
Excel・Word リサーチ機能を無...
-
UserForm1.Showでエラーになり...
-
特定のPCだけ動作しないVBAマク...
-
一つのTeratermのマクロで複数...
-
【EXCEL VBA】オートシェイプを...
-
VBAでfunctionを利用しようとし...
-
Excel マクロ VBA プロシー...
-
String""から型'Double'への変...
-
wordを起動した際に特定のペー...
-
Excel マクロでShearePoint先の...
-
ExcelのVBA。public変数の値が...
-
Excel VBAからAccessマクロを実...
-
On ErrorでエラーNoが0
-
End Sub が必要です。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
excelのInitializeイベントとAc...
-
ACCESSのVBAにてExcelのシ...
-
Excelマクロ 別シートへ連続コ...
-
「IsText」の使い方を教えてく...
-
CSVファイルの読み込みVBA作成...
-
エクセルVBAで名前の決まってい...
-
VBAでシートをまたぐ処理の方法
-
【VBA】3個のワークブックから...
-
VBAで繰り返し処理の速度を...
-
ほんの少し変更しただけで、マ...
-
Excel VBA 指定シートの取込
-
エクセル2010の内容を次のシー...
-
Excelのセルのコピー マクロ
-
エクセル2007 マクロについて...
-
VBA処理でこんな条件処理ってで...
-
複数シート内容を1 シートに纏...
-
EXCELで1シートのデータを複数...
-
ExcelVBAを使っての振り分け処理
-
Excel・Word リサーチ機能を無...
-
特定のPCだけ動作しないVBAマク...
おすすめ情報