Private
1 2If MsgBox("本日分作成しますか?", vbQuestion + vbOKCancel) = vbCancel Then 3 MsgBox "終了します。" 4 Exit Sub 5End If 6 7ActiveSheet.Select 8ActiveSheet.Copy Before:=ActiveSheet 9 10Dim Sname As String 11Sname = Now 12ActiveSheet.Name = Format(Sname, "m.d") 13 14Dim Nengetu As Date 15Nengetu = Now 16Range("A2").Select 17ActiveCell.FormulaR1C1 = Format(Nengetu, "ggge年 m月 d日(aaa)") 18 19Dim tomorrow As Date 20tomorrow = Now + 1 21Range("G2").Select 22ActiveCell.FormulaR1C1 = Format(tomorrow, "ggge年 m月 d日(aaa)") 23 24 Range( _ 25 "S4:S5,S8:S20,S23:S26,S29:S31,S34:S49,V4:V10,V13:V17,V20:V27,V30:V37,V40:V49,Y4:Y10,Y13:Y17,Y20:Y35,Y38:Y49,AB4:AB14,AB17:AB18,AB21:AB35,AB38:AB49,AE4:AE24,AE27:AE41,AE44,AE47:AE49,AH4:AH49" _ 26 ).Select 27 Range("AH4").Activate 28 Range( _ 29 "S4:S5,S8:S20,S23:S26,S29:S31,S34:S49,V4:V10,V13:V17,V20:V27,V30:V37,V40:V49,Y4:Y10,Y13:Y17,Y20:Y35,Y38:Y49,AB4:AB14,AB17:AB18,AB21:AB35,AB38:AB49,AE4:AE24,AE27:AE41,AE44,AE47:AE49,AH4:AH49,AK4:AK49" _ 30 ).Select 31 Range("AK4").Activate 32 Selection.ClearContents 33 34Range("G4:L43").Copy Range("A4:F43") 35 36Range("P4:P30").Copy 37Range("O4:O30").PasteSpecial xlPasteValues 38Range("O4:O30").PasteSpecial xlPasteFormats 39Application.CutCopyMode = False 40 41Range("A1").Select 42 43End Sub 44 45Private Sub CommandButton2_Click() 46 47If MsgBox("今月分作成しますか?", vbQuestion + vbOKCancel) = vbCancel Then 48 MsgBox "終了します。" 49 Exit Sub 50End If 51 52 Worksheets(Array("はじめ", "原紙")).Move Before:=Worksheets(3) 53 54 Dim LOOP_CNT As Long 55 Dim PAGE_CNT As Long 56 57 PAGE_CNT = Worksheets("原紙").Index + 2 58 Application.DisplayAlerts = False 59 For LOOP_CNT = Worksheets.Count To PAGE_CNT Step -1 60 Worksheets(LOOP_CNT).Delete 61 Next 62 Application.DisplayAlerts = True 63 64 Worksheets(5).Move Before:=Worksheets(3) 65 66 Dim Sname As String 67 Sname = Now 68 ActiveSheet.Name = Format(Sname, "m.d") 69 70 Dim Nengetu As Date 71 Nengetu = Now 72 Range("A2").Select 73 ActiveCell.FormulaR1C1 = Format(Nengetu, "ggge年 m月 d日(aaa)") 74 75 Dim tomorrow As Date 76 tomorrow = Now + 1 77 Range("G2").Select 78 ActiveCell.FormulaR1C1 = Format(tomorrow, "ggge年 m月 d日(aaa)") 79 80 Range("G4:L43").Copy Range("A4:F43") 81 82 Range("O4:O30").ClearContents 83 84 Worksheets.Copy 85 b = "連絡書" ' 86 c = Format(Now(), "(yyyy年mm月)") 87 d = b & c & ".xlsm" 88 e = ThisWorkbook.Path & "\" & d 89 ActiveWorkbook.SaveAs Filename:=e, FileFormat:=xlOpenXMLWorkbookMacroEnabled 90 91 Sheets(3).Activate 92 Range("A1").Select 93 94 Application.DisplayAlerts = False 95 ThisWorkbook.Close 96End Sub
現在上記のコードを使用しています。
今まで標準モジュールで使っていたコードをそのままコマンドボタンに設定したらエラーが出るようになりました。エラーが出るようになった理由と対策を教えてください。
Range("A2").Select、Range("A1").Selectのところでエラーが出ます。
どの行で発生したかがわからないので確かなことは言えませんが、おそらくRangeクラスのSelectメソッドが失敗したのではないでしょうか。
エラー行は質問に追記しました。
どうやって対策したらいいいんでしょう?
私の場合、基本的に以下のことを気を付けています。
・Rangeオブジェクトは、極力シート名をつける ・・・ws.Range("A1")
(どのシートのRangeなのかを意識し、コード上も明確にする)
・シートオブジェクトは変数にセットする
Activesheetは途中の操作によって別のものに変わることもあるので、
Set ws = Activesheet としておいて、以降は ws を使う、など
・RangeのSelectメソッドは極力使わない
大抵の場合、使わなくても書ける
マクロの記録でコードを生成するとSelectが頻出するが、そのままで使うのでなくなるべく消していく
なるほど。勉強になります。
なるべく変数にセットしてわかりやすいように改善してみます。
回答1件
あなたの回答
tips
プレビュー