【最大10000ポイント】当たる!!質問投稿キャンペーン!

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

このQ&Aに関連する最新のQ&A

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に関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QEXCELのシートを拡大・縮小するマクロ

EXCELのシートを拡大・縮小するマクロをご教授下さい。

拡大ボタンをクリックする度に拡大し
縮小ボタンをクリックする度に縮小させるのが目的です。

特定の倍率に対して1個のボタンを設定することは
できるのですが、上のようなことは可能でしょうか?

例えば、
拡大ボタンを押す毎に10%づつ拡大
縮小ボタンを押す毎に10%づつ縮小
のようなことができればと思うのですが・・・・

Aベストアンサー

こんにちは。

拡大ボタンに登録するマクロ

Sub 拡大()
With ActiveWindow
.Zoom = .Zoom + 10
End With
End Sub

縮小ボタンに登録するマクロ

Sub 縮小()
With ActiveWindow
.Zoom = .Zoom - 10
End With
End Sub

これでいかがでしょう。

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。

Qエクセル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ど素人なので、よろしくお願いします

Aベストアンサー

#4です。
>後半のものはうまくいきませんでした。
現象は、ボタンを押すと25%になって、何回押しても変化しないということでしょうか?
それでしたら、「ZmをPublic変数にして」とだけ書いて、ソースに明示しなかった部分の不足だと思います。
Public Zm As Integer 'これを追加
Private Sub CommandButton1_Click()
If Zm = 0 Then
  Zm = 25
Else
  Zm = Zm * 2
End If
ActiveWindow.Zoom = Zm
End Sub
これで動作すると思います。

QEXCELファイルのカレントフォルダを取得するには?

EXCELファイルのカレントフォルダを取得するには?

C:\経理\予算.xls

D:\2005年度\予算.xls

EXCEL97ファイルがあります。

VBAで
  カレントフォルダ名
(C:\経理\,D:\2005年度\)
を取得する事は可能でしょうか?

CURDIRでは上手い方法が見つかりませんでした。

Aベストアンサー

こんばんは。
Excel97 でも、同じですね。以下で試してみてください。

Sub test()
'このブックのパス
a = ThisWorkbook.Path
'アクティブブックのパス
b = ActiveWorkbook.Path
'Excelで設定されたデフォルトパス
c = Application.DefaultFilePath
'カレントディレクトリ
d = CurDir
MsgBox "このブックのパス   : " & a & Chr(13) & _
   "アクティブブックのパス: " & b & Chr(13) & _
   "デフォルトパス    : " & c & Chr(13) & _
   "カレントディレクトリ : " & d & Chr(13)
End Sub

QEXCEL VBAで計算値を四捨五入、切り上げ、切捨てする方法

ネットで探してみたのですが、計算結果を四捨五入して特定のセルを
返すにはどうしたらいいのでしょうか?

Sub hokangosa()

Dim ZPS As Double
Dim ZPOS As Double
Dim DMN As Double
MsgBox (" >>> 補間誤差自動計算 <<< ")
MsgBox (" >>> 初期値入力します <<< ")
ZPS = InputBox(">>> ステップを入力してください<<<")
ZPOS = Sheet1.Cells(22, 4).Value
DMN = ZPOS / ZPS
Sheet1.Cells(23, 6).Value = DMN
End Sub

ここでDMNの値を四捨五入したいです。

またこれとは別に切上げ、切捨ても教えていただけるとありがたいです。

Aベストアンサー

DMN = Application.WorksheetFunction.Round(ZPOS / ZPS, 0)
で、四捨五入
DMN = Application.RoundDown(ZPOS / ZPS, 0)
で切り捨て
DMN = Application.RoundUp(ZPOS / ZPS, 0)
で切り上げです。

引数で、対象桁を変更できます。

QEXCEL VBAで全選択範囲の解除

EXCEL VBAで
Cells.Select
と書くと、全セルが選択状態になりますが、
これを解除するには、どう書けばよいのでしょうか?

Aベストアンサー

その1
A1 など、適当なセルを選択する。
(回答#1と同じ)

その2
全選択する前の選択範囲に戻る。

全選択前に
変数 = Selection.Address で記憶

全選択後
Range(変数).Select で元の選択範囲を選択

Q別のシートから値を取得するとき

Worksheets("シート名").Activate
上記のを行ってから別シートの値を取得するのですが、
この処理を行うと指定したシートへ強制的にとんでしまいます。。。

※イメージ
For ~ To ~
  Worksheets("シートA").Activate
  シートAの値取得
       :
  Worksheets("シートB").Activate
  シートBの値取得
Next

このイメージ処理を行うとものすごい勢いで画面がチカチカします。。。
シートを変えずに他のシートから値を取得する方法はないのでしょうか。
教えてください!

Aベストアンサー

Worksheets("シートA").Range("A1")

みたいな感じでできませんか?

QVBAで文字列を数値に変換したい

A列とE列の文字列になってしまった数値を
数値に変換したく、以下のようなものを作ったのですが、
文字の無いセルまで、数値に変換しようとするので
時間がかなりかかります。
何かよい方法は無いでしょうか?
よろしくお願いいたします。


Sub 数値に変換()
Range("A:A,E:E").Select
For Each xCell In Selection
xCell.Value = xCell.Value
Next xCell
End Sub

使用ソフトEXCEL2000orEXCEL2003

Aベストアンサー

>Range("A:A", "E:E")
これは、A、B,C,D,E列のことなので
A列とE列であれば質問者のようにRange("A:A,E:E")です。

ま、それはそれとして、回答。

Sub Test()
 Range("A:A").Value = Range("A:A").Value
 Range("E:E").Value = Range("E:E").Value
End Sub

以上。
 

QVBA 実行時エラー1004 rangeメソッドは失敗しました。globalオブジェクトのエラー

始めまして、VBA初心者のものです。
ただいまエクセルでグラフを作成しています。作業自体は単純作業の繰り返しなのでVBAを用いてやりたいのですが、マクロを実行したときに実行時エラー’1004’rangeメソッドは失敗しました。’_global’オブジェクトとメッセージが出て、実行できません。 デバックをすると以下の5行目で黄色のバーが出ていました。自分なりに原因を考えたのですがrangeの関係するところに、Range("A8:A1587,e8:e1587")というような変数を用いないやり方でやると上手くいくので、変数に関する定義がまずいと思うのですが、それ以上の事は分かりません。どなたか、分かる方がおりましたら、よろしくお願いします。また、プログラムは以下のようになります。

Sub 繰り返し()
'繰り返し
Dim s As Integer
For s = 0 To 17
Range("cells(8,1):cells(1580,1),cells(8,s+2):cells(1580,s+2)").Select
Range("cells(8,s+2)").Activate
Charts.Add
ActiveChart.ChartType = xlXYScatter
ActiveChart.SetSourceData Source:=Sheets("20081216_210647").Range( _
"cells(8,1):cells(1580,1),cells(8,s+2):cells(1580,s+2)"), PlotBy:=xlColumns
ActiveChart.SeriesCollection(1).Name = "=""0810p2x"""
ActiveChart.Location Where:=xlLocationAsNewSheet, Name:="0810p2x"
With ActiveChart
.HasTitle = True
.ChartTitle.Characters.Text = "0810p2x"
.Axes(xlCategory, xlPrimary).HasTitle = True
.Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "t"
.Axes(xlValue, xlPrimary).HasTitle = False
End With
Next
End Sub

始めまして、VBA初心者のものです。
ただいまエクセルでグラフを作成しています。作業自体は単純作業の繰り返しなのでVBAを用いてやりたいのですが、マクロを実行したときに実行時エラー’1004’rangeメソッドは失敗しました。’_global’オブジェクトとメッセージが出て、実行できません。 デバックをすると以下の5行目で黄色のバーが出ていました。自分なりに原因を考えたのですがrangeの関係するところに、Range("A8:A1587,e8:e1587")というような変数を用いないやり方でやると上手くいくので、変数に関する定義...続きを読む

Aベストアンサー

>ご指摘を受けたところを書き換えて回してみた結果、書き換えた箇所
>でエラーがでます。(実行時エラー’1004’’cells’メソッドは失敗
>しました。’global’オブジェクト)
>しかし、何が原因でエラーになるか自分では分かりません。

≪例1≫
Range(Cells(8, 1), Cells(1587, 2)).Select
上記の例では、RangeとかCellsの上位オブジェクトであるシート名が省略されています。
ActiveSheet.Range(ActiveSheet.Cells(8, 1), ActiveSheet.Cells(1587, 2)).Select
というわけです。
マクロ実行時に、Activeな(Excelで表示されている)シートが上位オブジェクトとして、自動的に認識されます。

≪例2≫
Sheets("Sheet2").Range(Cells(8, 1), Cells(1587, 2)).Select
上記の例では、Rangeのみシート名が記述されています。
Sheets("Sheet2").Range(ActiveSheet.Cells(8, 1), ActiveSheet.Cells(1587, 2)).Select
というわけです。
Activeなシートが、Sheet2の場合はエラーになりません。
しかし、ActiveなシートがSheet2以外の場合、エラーが発生します。
直前に、
Sheets("Sheet1").Select
などとしていれば、ActiveシートがSheet1になっていますから、エラーになります。

Sheets("Sheet2").Range(Sheets("Sheet2").Cells(8, 1), Sheets("Sheet2").Cells(1587, 2)).Select
と書いておけば安心です。
Withステートメントを使えばスッキリ纏めることができます。
With Sheets("Sheet2")
  .Range(.Cells(8, 1), .Cells(1587, 2)).Select
End With

# Sheets("Sheet2")の上位オブジェクトが省略されていることにも気がついてください。

>そこで自分で基礎を勉強したいのですが推薦できる参考書などがござ
>いましたら、教えていただけませんか?
私自身は、入門書程度の雑誌を1冊買っただけです。どれが良いとかはよく分かりません。
「マクロの記録」を活用して、参考コードを取得し、汎用性のあるコードに編集しています。
新しい単語があれば、文字カーソルを単語の上に置き、F1キーを押してVBAのヘルプを必ず見るようにしています。
躓いた時は、Web検索して欲しい情報を得たり、あるいは、こうした掲示板で先輩方のお力をお借りしています。

Excel(エクセル)VBA入門:目次
http://oshiete1.goo.ne.jp/kotaeru_reply.php3?q=4651404
エクセル入門・初級編
http://www.kenzo30.com/excel_kiso.htm

>ご指摘を受けたところを書き換えて回してみた結果、書き換えた箇所
>でエラーがでます。(実行時エラー’1004’’cells’メソッドは失敗
>しました。’global’オブジェクト)
>しかし、何が原因でエラーになるか自分では分かりません。

≪例1≫
Range(Cells(8, 1), Cells(1587, 2)).Select
上記の例では、RangeとかCellsの上位オブジェクトであるシート名が省略されています。
ActiveSheet.Range(ActiveSheet.Cells(8, 1), ActiveSheet.Cells(1587, 2)).Select
というわけです。
マクロ実行時に、Activeな...続きを読む

Q【Excel VBA】マクロでExcel自体を終了させたい

環境:WindowsXP、Excel2003

マクロでエクセルを終了(ブックを閉じて、アプリケーション自体も終了)させたいのですが、以下のコードではアプリケーションが閉じてくれません。

ThisWorkbook.Close
ExcObj.Quit
Application.Quit

どこか悪いところはありますでしょうか?

よろしくお願いします。

Aベストアンサー

普通に考えれば質問者のコードで上手くいきそうですが
hana-hana3さんの回答にもあるようにThisWorkBook.Closeでコード終了となりますので
Application.QuitをThisWorkBook.Closeの前にもってこないといけません。
Application.Quitはそれがあるプロシージャのコードが全て終わるまで
その実行を保留するちょと特別動作をします。

'-------------------------------------
 Application.Quit
 ThisWorkbook.Close
'-------------------------------------
 
 


人気Q&Aランキング