エクセルVBAで名前の決まっているシートの倍率変更

このQ&Aのポイント
  • エクセルVBAを使用して、名前の決まっているシートの倍率を変更する方法について質問があります。
  • シートはA,B,C,Dの7月とEの6月の数字が入っており、それぞれのシートがある場合にのみ処理を実行するようにエラー処理を行っています。
  • しかし、何らかの理由で処理が正常に動作せず、特にe2:のラインで停止してしまう状況です。質問者は実際に必要なマクロとして利用したいため、解決策を知りたいとのことです。
回答を見る
  • ベストアンサー

エクセルVBAで名前の決まっているシートの倍率変更

早速ですが名前の決まっているそれぞれのシートがあります実際には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

質問者が選んだベストアンサー

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7940)
回答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 といった段取りになります。

vitaminQQ
質問者

お礼

なるほど。resumeを入れなかったから、 On Error が働かなかったり、またシート名も多分機能しなくなってしまうのでしょうかね!?助かりました。どうでも良いこのシート倍率合わせを簡単にできるのでとっても助かります。 retryでエラー処理をしてもダメだったので困っていました。早速やってみます。 安易な質問になってしまいますが、もっとこんな風に作れば!?という提案があればご指導願います!!! マクロがあれば、仕事するのが楽しくなります♪ありがとうございました!!

その他の回答 (3)

  • jcctaira
  • ベストアンサー率58% (119/204)
回答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

vitaminQQ
質問者

お礼

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

  • keithin
  • ベストアンサー率66% (5278/7940)
回答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 #余談 安直な思いつき追加質問をする方って,往々にして元のご質問は綺麗に忘れて「追加質問の解決で万歳」になるヒトがとっても多いです。マジメに回答するのがバカみたいですね。

vitaminQQ
質問者

お礼

感謝してます♪ マクロって知っている人が自分が並べたコードを見た時に、整理整頓できるのかとか、基礎があるのかとか分かると思います。センスも有る無しありますし、自分以外の人なら同じ仕事をするのにどういう構文を何行書くのかなとか色々あると思い、質問させて頂きました。 勉強しているから、たくさんの人の意見を聞けた事に感謝です。早速実行したいのですが、なぜか私の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 を入れて終了します。 以上、長くなりましたが、今後のマクロ作成の参考にしてください。 それでは

vitaminQQ
質問者

お礼

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

関連するQ&A

  • シートを増やすVBA

    フィルタで隠れている場合もある列の値を シート名として増やしていくVBAで以下のようなものをつくりました (値は重複している場合もある) 雛型シートがありそれをシート名だけ増やしていくというものです Sub シートを増やす() Dim target As Range Dim h As Range On Error Resume Next Set target = Worksheets("一覧シート").Range("E10:E" & Worksheets("一覧シート").Range("E65536").End(xlUp).Row).SpecialCells(xlCellTypeVisible) If target Is Nothing Then Exit Sub 'シートを増やしていく For Each h In target On Error GoTo errhandle Worksheets(h.Value).Select On Error GoTo 0 Next Sheets("一覧シート").Select Exit Sub errhandle: Worksheets("雛型").Copy after:=Worksheets(Worksheets.Count) ActiveSheet.Name = h.Value Resume End Sub そうすると、実行エラー1004 ”シートの名前をほかのシート、Visual Basicで参照されるオブジェクトライブラリまたはワークシートと同じ名前に変更することはできません。” というエラーがたまにおきます(シート名が数字の場合におきるようです) 解決方法及び理由をご教授ください

  • エクセルVBA 1つのシートで出来ますか?

    説明が下手で申し訳ございませんが、宜しくお願い致します。 sheet(1)に20個のボタンがあります。 ボタンをクリックすると、別のシートが開きます。 開いたシートにも複数のボタンがあり、そのうちの任意のボタンをクリックすると、そのボタンの値がsheet(1)のそれぞれのボタンに対応したセルに入力される、という動作を実現したいと思っています。 現状、下記のようなコードで目的の動作は実現できてはいるのですが、各ボタンそれぞれにシートを作っているような状況です。(データ自体は全く同じ内容のものが、計20シート) たぶん、もの凄く頭の悪い事をやっているんだろうと思います。 sheet(1)を除いた各シートの入力データ自体は全く同じなので、シート一枚で出来るんじゃないのかなと思い、ネットや本で調べながら色々試してみたのですが、どうも上手く行きません。データが同じでも、sheet(1)のクリックしたボタンによって入力するセルを変えなければならないのが問題です。 sheet(1)のボタンとセルの関連付けや、sheet(1)のどのボタンを押したのかの判別ができればいいのかなと思って調べてみても、初心者にはよく理解できず、もう何週間もチャレンジしているのですがお手上げです。 上級者の方の知恵をお借りできれば幸いです。 Sub sheet2を開く() Worksheets(2).Select End Sub Sub 入力1() Worksheets(1).Range("F8") = "データ1" Worksheets(1).Select End Sub Sub 入力2() Worksheets(1).Range("F8") = "データ2" Worksheets(1).Select End Sub Sub 入力3() Worksheets(1).Range("F8") = "データ3" Worksheets(1).Select End Sub Sub sheet3を開く() Worksheets(3).Select End Sub Sub 入力1() Worksheets(1).Range("H8") = "データ1" Worksheets(1).Select End Sub Sub 入力2() Worksheets(1).Range("H8") = "データ2" Worksheets(1).Select End Sub Sub 入力3() Worksheets(1).Range("H8") = "データ3" Worksheets(1).Select End Sub Sub sheet4を開く() Worksheets(3).Select End Sub Sub 入力1() Worksheets(1).Range("M8") = "データ1" Worksheets(1).Select End Sub Sub 入力2() Worksheets(1).Range("M8") = "データ2" Worksheets(1).Select End Sub Sub 入力3() Worksheets(1).Range("M8") = "データ3" Worksheets(1).Select End Sub    ・    ・    ・    ・    ・

  • セルの値をシート名にするエクセルVBA

    件名のVBAを以下のように書きました B列の4からずっと下までのセルの値を次々とシート「ひな型」をコピーし増やしていくものです。 Sub テスト() ' ' Macro ' ' Dim target As Range Dim h As Range '見えてるセルを取得する。「全部隠れていた」場合も考える。 On Error Resume Next Set target = Worksheets("Sheet1").Range("B4:B" & Worksheets("Sheet1").Range("B65536").End(xlUp).Row).SpecialCells(xlCellTypeVisible) If target Is Nothing Then Exit Sub 'シートを増やしていく For Each h In target On Error GoTo errhandle Worksheets(CStr(h.Value)).Select On Error GoTo 0 Next Sheets("Sheet1").Select Exit Sub errhandle: Worksheets("ひな型").Copy after:=Worksheets(Worksheets.Count) ActiveSheet.Name = h.Value Resume End Sub これだと、一応思った通りにはなるのですが B列のセルに複数同じ名前があった時に、既に作ったシートの名前がある場合 それは無視するという風に実行したいです お知恵をお貸しくださいませ

  • EXCEL2000 VBA でエラートラップできません。

    次のスクリプトで”Select Case Workbooks(saki).Worksheets(z).Name”のところで変数zに存在しないワークシートのインデックスが入った時にはエラーが出るので、On Erroe Goto で回避しようと思うのですができません(そのままマクロが止まってしまう)。 なぜ回避できないのか教えてください。 また回避するいい方法があれば教えてください。 Private Sub UserForm_Activate() moto = Cells(2, 5) saki = Cells(1, 5) For z = 1 To 50 On Error GoTo e0 Select Case Workbooks(moto).Worksheets(z).Name Case "検索" Case "結果" Case "エフ" Case "ツール" Case "記憶" Case Else On Error GoTo e0 UserForm3.ComboBox1.AddItem Workbooks(moto).Worksheets(z).Name End Select Next e0: For z = 1 To 50 On Error GoTo e1 Select Case Workbooks(saki).Worksheets(z).Name    ’ここでエラーが出る(実行時エラー'9' インデックスが有効範囲にありません) Case "検索" Case "結果" Case "エフ" Case "ツール" Case "記憶" Case Else On Error GoTo e1 UserForm3.ComboBox2.AddItem Workbooks(saki).Worksheets(z).Name End Select Next e1: End Sub

  • エクセルマクロで 新規ブックにシートをコピーして保存

    エクセルのマクロを使い 名前の決まっている特定のシートを 新規ブックにして名前をつけて保存をしたいのです. 色々参考にして以下のようなマクロを書いたのですが これだと元々のファイル名が変わって保存されてしまいました。 どなたかお知恵をお貸しください。 今作ったマクロ Sub p() Worksheets("印刷用日誌").Copy MsgBox Year(Now) & "-" & Format(Now(), "yy-mm") & "-" & Range("k7") On Error Resume Next Application.DisplayAlerts = False ThisWorkbook.SaveAs Year(Now) & "-" & Format(Month(Now), "00") & "-" & Format(Day(Now), "00") Application.DisplayAlerts = True On Error GoTo 0 End Sub よろしくお願いします

  • エクセルVBAで表示倍率の変更

    ワークシート上の所定の位置に、拡大・縮小のコマンドボタンを作って、押すごと、25倍、50倍、100倍・・・(その逆)という風に表示倍率を変えたいのですが、 Dim Zm As Integer Zm = 25 Private Sub ZoomButton_Click() Zm = Zm * 2 ActiveWindow.Zoom = Zm End Sub と、こんなふうにやってみたんですが、最初値25倍のInitializeが分かりません。どうしたら良いのでしょうか? VBAど素人なので、よろしくお願いします

  • Excel VBA セルの値をシート名にしたいのです。

    こんばんは 新しくシートを挿入させて、「シート2」の値のみをコピーさせたいと考えています。 その新しく挿入させたシート名を「シート1」のせるA3とA4の文字列をあわせたものにしたいのですが、どうしたらよいのでしょうか。 途中まで考えたところでいきずまってしまいました。 どうか英知をお貸しください。 宜しくお願い致します。 A3には日付、A4には名前が入力されています。 Dim sheetName As String Worksheets("月度集計").Activate Sheets.Add After:=Sheets(Sheets.Count) ActiveSheet.Name = Worksheets("Sheet1").Cells(3, 3).Value On Error Resume Next Worksheets(1).Name = sheetName On Error GoTo 0 Range("f2").Select

  • エクセルVBAについて

    Sub a() Sheets("Sheet1").Select End Sub Sub b() Worksheets("Sheet1").Select End Sub どちらコードもSheet1を選択しますが 「こちらを使うべき!」ってありますか? 独学のため、SheetsとWorksheetsの違いがわかりません。 ご教授よろしくお願いします。

  • ExcelVBAで選択シートを真ん中にする

    ExcelのVBAで、選択されているシートの前後を選択するマクロとして、下記のようなものを作成してメニューボタンに割り付けて使っています。で、質問は、選択されたシートがシート見出しの真ん中になるようにすることって出来ますか?どなたか?詳しい方いらっしゃったら教えてください。宜しくお願い致します。(シートの総数は100ぐらいはあります) Sub Sheet_Move_Right() On Error Resume Next ActiveSheet.Next.Select On Error GoTo 0 End Sub Sub Sheet_Move_Left() On Error Resume Next ActiveSheet.Previous.Select On Error GoTo 0 End Sub

  • エクセルVBAで別シートにコピー貼り付け

    VBA初心者です。下記のようにプログラムしましたがうまくいかなくて困ってます。どなたかお力をお貸しください。内容としましては輸入Partsのシートからコピーして商品内容確認のシートのセルB17に貼り付けたいです。輸入Partsシートで3列目の空白を探し同じ行の1列目をコピーします。商品内容確認のシートのセルB17にはカーソルは動いているようですが貼りつきません。 Private Sub 商品内容確認2_Click() If MsgBox("商品内容確認へ移動しますか?", 33, "移動の確認") = 2 Then MsgBox "処理を中止します。" Range("A2").Select Exit Sub End If Dim Line As String Dim Maxrow As String Worksheets("輸入Parts").Select Line = 2 Do Until Cells(Line, 1).Value = "" On Error Resume Next If Cells(Line, 3).Value = "" Then Cells(Line, 1).Copy 'コピーする Maxrow = Worksheets("商品内容確認").Range("B17").End(xlDown).Row + 1 Worksheets("商品内容確認").Range("B" & Maxrow).PasteSpecial Paste:=xlPasteValues '値を貼り付け End If On Error GoTo 0 '次の行に移り最後の行まで検索 Line = Line + 1 Loop Worksheets("商品内容確認").Visible = True Worksheets("商品内容確認").Select Worksheets("商品内容確認").Range("B6").Select Worksheets("商品内容確認").輸入Partsシート2.Visible = True Worksheets("商品内容確認").輸出Partsシート2.Visible = False Worksheets("輸入Parts").Visible = False End Sub

専門家に質問してみよう