早速ですが名前の決まっているそれぞれのシートがあります実際には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.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以外にも予測表のように文字だけの物もありましたので、コレを参考に作れるなと思いました。
また自分のレベルでも出来そうなので、挑戦してみます。ありがとうございました!!
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.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を習っただけなので中々私には難かしくて困っておりました。ループもこんな使い方があるんですね、、。自分のマクロノートにしっかり書き留めます。ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAコードが作動せず、どこに問題があるのか教えて下さい。 3 2023/06/13 13:20
- Excel(エクセル) なぜExit Subがあるのかわかりません 4 2023/02/19 12:34
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Excel(エクセル) vba シートの並び替え 1 2023/04/19 13:44
- Visual Basic(VBA) EXCELのVBAについて 2 2023/07/05 17:17
- Visual Basic(VBA) 【変更】ファイルを閉じてダイアログで保存した時、更新したシートだけの処理の実行をする 5 2022/03/26 18:31
- Visual Basic(VBA) Sheet「状況」から、分類の年齢別カウント数をSheet「D表」へ転記する下記マクロを作っています 7 2022/12/14 17:57
- Visual Basic(VBA) Changeイベントで複数セルへの貼り付けおよび値削除時に1個目のセルのみエラーになる 3 2022/12/21 09:07
- Excel(エクセル) ②Excel 簡単にシートコピーしたら前日の残高と日付を変更させたい→マクロの記録でエラーが出ます 8 2022/07/16 20:40
- PowerPoint(パワーポイント) エクセルのマクロについて教えてください。 2 2022/11/18 15:34
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excelマクロ 別シートへ連続コ...
-
「IsText」の使い方を教えてく...
-
ACCESSのVBAにてExcelのシ...
-
特定のPCだけ動作しないVBAマク...
-
UserForm1.Showでエラーになり...
-
Excel・Word リサーチ機能を無...
-
エクセルで特定の列が0表示の場...
-
ExcelのVBA。public変数の値が...
-
一つのTeratermのマクロで複数...
-
String""から型'Double'への変...
-
文字列内で括弧を使うには
-
TERA TERMを隠す方法
-
メッセージボックスのOKボタ...
-
Excel VBAからAccessマクロを実...
-
Excel マクロ VBA プロシー...
-
ExcelVBAでPDFを閉じるソース
-
ユーザーフォームを起動しなが...
-
実行時エラー'-2147467259(8000...
-
End Sub が必要です。
-
配列数式の解除
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
excelのInitializeイベントとAc...
-
ACCESSのVBAにてExcelのシ...
-
Excelマクロ 別シートへ連続コ...
-
エクセルVBAで名前の決まってい...
-
VBAで繰り返し処理の速度を...
-
「シートを削除しますか」のメ...
-
excel
-
VBAでシートをまたぐ処理の方法
-
VBA処理でこんな条件処理ってで...
-
エクセルVBAでブックの分割
-
オートシェイプの不具合について
-
同一ブック内・別シートの内容...
-
エクセル2010の内容を次のシー...
-
Excel・Word リサーチ機能を無...
-
特定のPCだけ動作しないVBAマク...
-
エクセルで特定の列が0表示の場...
-
UserForm1.Showでエラーになり...
-
Excel マクロ VBA プロシー...
-
配列数式の解除
-
メッセージボックスのOKボタ...
おすすめ情報