質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

1回答

21509閲覧

VBA エラーの原因:RangeクラスのSelectメソッドが失敗しました

321Kurumins

総合スコア18

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2021/05/12 23:09

編集2021/05/13 00:13

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のところでエラーが出ます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jinoji

2021/05/12 23:32

どの行で発生したかがわからないので確かなことは言えませんが、おそらくRangeクラスのSelectメソッドが失敗したのではないでしょうか。
321Kurumins

2021/05/13 00:16

エラー行は質問に追記しました。 どうやって対策したらいいいんでしょう?
jinoji

2021/05/13 00:56 編集

私の場合、基本的に以下のことを気を付けています。 ・Rangeオブジェクトは、極力シート名をつける ・・・ws.Range("A1")  (どのシートのRangeなのかを意識し、コード上も明確にする) ・シートオブジェクトは変数にセットする  Activesheetは途中の操作によって別のものに変わることもあるので、  Set ws = Activesheet としておいて、以降は ws を使う、など ・RangeのSelectメソッドは極力使わない  大抵の場合、使わなくても書ける  マクロの記録でコードを生成するとSelectが頻出するが、そのままで使うのでなくなるべく消していく
321Kurumins

2021/05/13 08:00

なるほど。勉強になります。 なるべく変数にセットしてわかりやすいように改善してみます。
guest

回答1

0

ベストアンサー

Dim Nengetu As Date Nengetu = Now Range("A2").Select ActiveCell.FormulaR1C1 = Format(Nengetu, "ggge年 m月 d日(aaa)")
Range("A2").Select

↑ここでエラーが出ていると思います。

標準モジュールにこのコードを書くと、
「アクティブなシートのA2セル」と解釈されます。
一方、シートのモジュールに書くと、
「そのモジュールのA2セル」と解釈されます。

セルを選択する命令をしたときに、
解釈されたシートが、アクティブになってなければ、セルを選択できないので、
エラーになります。
場当たり的にエラーを回避するならば、
Activesheet.Range("A2").Select
と書けば回避できるとは思いますが、
後で(数か月後または数年後に)読んだときに、どのシートの話か分かりにくくなるので、
複数のシートを扱うときは、どのシートのどのセルなのかをちゃんと書いた方がよいかと
思います。

ExcelVBA

1Option Explicit 2 3Private Sub CommandButton2_Click() 4 Dim wbkNew As Workbook 5 Dim dtmToday As Date 6 Dim sFName As String 7 8 ThisWorkbook.Worksheets(Array("はじめ", "原紙")).Copy '雛形をコピーして新規ブックへ 9 Set wbkNew = Workbooks(Workbooks.Count) '新しくできたブックを取得 10 dtmToday = Date '今日の日付を取得 11 12 '日付を記入 13 With wbkNew.Worksheets("はじめ") 14 .Name = Format(dtmToday, "m_d") 15 .Range("A2").Value = dtmToday 16 End With 17 18 '保存するファイル名を作成 19 sFName = ThisWorkbook.Path & "\" & "連絡書" _ 20 & Format(dtmToday, "(yyyy年mm月)") & ".xlsm" 21 22 '名前を付けて保存 23 wbkNew.SaveAs sFName, xlOpenXMLWorkbookMacroEnabled 24 25 'このブックを閉じる 26 ThisWorkbook.Close 27End Sub

こんな感じで書いてみてはいかがでしょう?
あくまで参考です。そちらのコードを修正したわけではありません。
コードを読んで分かるとこに想像で補完して書いてます。

投稿2021/05/13 02:53

編集2021/05/13 02:55
mattuwan

総合スコア2136

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

321Kurumins

2021/05/13 07:57

ありがとうございます。 参考にして修正したらうまくいきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問