'Range'メソッドは失敗しました

このQ&Aのポイント
  • ExcelのVBAの質問になりますが、最後の行をセレクトする際に'Range'メソッドでエラーが発生してしまいます。
  • 質問者は、セレクトしたい最後の行を指定するために'Range'メソッドを使用していますが、'_Worksheet'オブジェクトというエラーが表示されています。
  • 質問者は、最後の行をセレクトするための正しい方法を知りたいと述べています。
回答を見る
  • ベストアンサー

'Range'メソッドは失敗しました

ExcelのVBAの質問になりますが、教えてください。 下記を動かすと最後の行で「'Range'メソッドは失敗しました: '_Worksheet' オブジェクト」と出ます どうしても最後の行をセレクトしたいのですが、どうしたらよいでしょうか。 Option Explicit Public WB1 As Workbook Public WB1SH1 As Worksheet Public CSVWB1 As Workbook Public CSVWB1SH1 As Worksheet Dim MaxRow As Integer Private Sub CommandButton1_Click() Set WB1 = ActiveWorkbook Set WB1SH1 = WB1.Worksheets(1) Dim a As String a = WB1SH1.Range("a1) Workbooks.Open "C:\Users\User\Desktop\" & a & ".CSV" Set CSVWB1 = ActiveWorkbook Set CSVWB1SH1 = CSVWB1.Worksheets(1) MaxRow = CSVWB1SH1.Cells(Rows.Count, 1).End(xlUp).Row WB1SH1.Activate WB1SH1.Range(Cells(1, 1), Cells(MaxRow, 3)).Select CSVWB1SH1.Activate CSVWB1SH1.Range(Cells(1, 1), Cells(MaxRow, 3)).Select  '←ここでエラーがでる End Sub

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

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.1

初心者さんが必ず一度は失敗します。 >Private Sub CommandButton1_Click() のようにシートオブジェクトに記載したマクロでは、シートを修飾しないセル(レンジ)オブジェクトは全て「マクロを記載したシート」に紐付けられています。 CSVWB1SH1.Range(CSVWB1SH1.Cells(1, 1), CSVWB1SH1.Cells(MaxRow, 3)).Select のようにしなければいけません。

xxxcocoxxx
質問者

お礼

keithin様 早々のご回答ありがとうございます。 回答をメールで確認できたおかげで午前中に出先で処理ができました。 見事動きました!! 自己流でコードを組んでいるためとても読みづらかったと思われるのに 的確なご指摘で驚きました。 自分では全く何がダメなのかわからず困り果てての質問だったため感動 しました。 本当にありがとうございました。

その他の回答 (1)

回答No.2

こんにちは。 私のように細かなことを言う人はいないかと思いますが、少し我慢してください。 Private Sub CommandButton1_Click() ということは、シートモジュール(オブジェクトモジュール)ですね。 シートモジュール上で、Public ステートメントが使えません。 シートモジュールに、もし入れるなら、 Dim Wb1 As Workbook Dim Wb1Sh1 As Worksheet Dim CSVwb1 As Workbook Dim CSVwb1Sh1 As Worksheet Dim MaxRow As Integer のようにしますが、ブックが閉じるまで、変数を抱えることになりますから、必要以上には、モジュールスコープ(=そのモジュールだけの範囲)でも、用いません。 Public ステートメントを使うなら、標準モジュールを使います。しかし、Public ステートメントは、慎重に使わないといけない書き方です。テキストには「グローバル変数(Public変数)はできる限り使わない」ということが書かれています。それは、プロジェクト全体に関わってきますので、通常、使っても、モジュール内だけにします。ちなみに、なぜ「グローバル」と呼ぶのか、少し疑問がつくのは、厳密には、複数のプロジェクト間には使えないからです。 それと、変数は、大文字・小文字を含めていれるというのが、標準的な記法です。そうすることによって、入力ミスを減らすわけです。大文字だけで書くのは、定数に限ります。 例: '標準モジュール Public Wb1 As Workbook Public Wb1Sh1 As Worksheet Public CSVwb1 As Workbook Public CSVwb1Sh1 As Worksheet また、VB6系では、Sub プロシージャ名の直下から、Dim の変数定義の宣言をまとめるというのが通例になっていますから、 Private Sub CommandButton1_Click() Dim a As String '←ここに置く Set Wb1 = ActiveWorkbook Set Wb1Sh1 = WB1.Worksheets(1) --------------------- Set Wb1 = ActiveWorkbook Set Wb1Sh1 = Wb1.Worksheets(1) 実際は、このようには書きません。Worksheet("*****") を変数に入れた時に、すでに親オブジェクトの、Workbookも含まれていますから、2つにする必要はありません。 Set Wb1Sh1 = ActiveWorkbook.Worksheets(1) '←出来る限り、パラメータは、シート名にしてください。 だけで良いです。 ---------------------- このコードは少し問題がありますから、正確には書けませんが、Rangeのパラメータで、Cells を2ついれることは、ふつうはしません。いずれにしても、なるべく、Withステートメントを使うようにしましょう。(オブジェクトの前に、ピリオド[.]が入っていますから、注意してください) もちろん、前に変数を使って、コンテナ型(親オブジェクトから全部入れる)という方法も悪くはありませんが、VBAの書き方の基本は、文字数を少なくして、なおかつ可読性を悪くしないということです。 '// With Wb1Sh1  .Activate   .Range(.Cells(1, 1), .Cells(MaxRow, 3)).Select   '前々行のActivate を含めて、実務上は、Activate やSelect はあまり使いません。これらのメソッドはユーザーに見せるために使うものです。 End With With CSVwb1Sh1  .Activate  .Range(.Cells(1, 1), .Cells(MaxRow, 3)).Select 'こちらも同様です。 End With '// 記法の参考資料です。今さらという人もいるかもしれませんが、私でも参考にしています。 コーディング技法(VS.Net 2003) http://msdn.microsoft.com/ja-jp/library/aa291593(v=vs.71).aspx Microsoft Office 2000/Visual Basic プログラマーズ ガイド http://msdn.microsoft.com/ja-jp/library/cc375992.aspx 私は、この書籍版を手に入れています。 面倒な話を長く書きましたが、少しずつ習得してみてください。信じないかもしれませんが、これを覚えればエラーが減り、自然と上達していきます。なお、インデント(桁下げ)は、mougで知られた渡辺さんという方の、VBePlus というツールを使っています。これも、エラーを発見するためです。

xxxcocoxxx
質問者

お礼

WindFaller様 ご指導、ありがとうござます。 初心者で独学の私にはとても勉強になりました。 >シートモジュール上で、Public ステートメントが使えません >変数は、大文字・小文字を含めていれるというのが、標準的な記法です >大文字だけで書くのは、定数に限ります >Subプロシージャ名の直下から、Dim の変数定義の宣言をまとめるというのが通例 これらはどれも知りませんでした。。。 >親オブジェクトの、Workbookも含まれていますから、2つにする必要はありません。 2個も書く必要はないのですね!!少しコンパクトになります! >なるべく、Withステートメントを使うようにしましょう Withはとても苦手で避けているところが自分にあります。 もっと勉強して活用します。 記法の参考資料、Web版も参考になりますが、書籍版ももっと興味があります。 Web版を活用してみて自分にあっていそうだったら入手を考えてみます。 ご指導、ありがとうございました。感謝いたします。

関連するQ&A

  • 『実行時エラー'1001': 'Range'メソッドは失敗しました:'

    『実行時エラー'1001': 'Range'メソッドは失敗しました:'_Worksheet'オブジェクト』 先週から仕事に必要なためVBAの勉強を始めましたが、別シートへコピーする際などに上記のエラーが発生してしまい原因が分からず困っています。どこが間違っているのでしょうか?? 処理はデータが書かれているシートから作業用のシートにセル範囲を指定してコピーする、というものです。 なお、マクロ自体は別にマクロ用ファイルを作成し、そこのシートモジュールへ記述しています。 よろしくお願いします。 Sub test() '--------- 対象ファイルの呼び出し Dim MAIN As Workbook Dim ws As Worksheet Dim sh As String 'ファイルを呼び出す Call GetMAINFile Set MAIN = ActiveWorkbook Set ws = MAIN.Worksheets(1) sh = ws.Name '--------- 一時作業用TEMPシートの作成 Dim TEMP As Worksheet Worksheets.Add(after:=ws).Name = "TEMP" Set TEMP = Worksheets("TEMP") '--------- 対象シートから一時作業用TEMPシートへデータのコピー Dim x1, x2, y1, y2 As Integer x1 = 5 x2 = 10 y1 = 1 y2 = 4 ws.Range(Cells(x1, y1), Cells(x2, y2)).Copy _ Destination:=TEMP.Range(Cells.SpecialCells(xlLastCell).Row, 1) End Sub '--------- ファイル名を指定ダイアログの表示 Sub GetMAINFile() Dim NewBook As Workbook Dim OpenFileName As String OpenFileName = Application.GetOpenFilename() If OpenFileName <> "False" Then Workbooks.Open OpenFileName Else Exit Sub End If End Sub

  • エクセルVBAのオートフィルタについて

    いつもお世話になります。 エクセル2007でVBAでオートフィルタを操作したいのですが、 一部うまくいきません。 以下の様なコードを書いて 日付で絞り込みたいのですが、 何も抽出されません。 リストを見てみると、変数はちゃんと入っており OK ボタンを押すとその日付で抽出されます。 何故VBAでの操作では抽出されないのでしょうか。 ご存じの方がおられましたら、よろしくお願いします。 Sub test() Dim mydate As Variant Dim rng3 As Range Dim fmt As Variant Dim objList3 As ListObject Dim wb1 As Workbook Dim wb2 As Workbook Dim wb4 As Workbook Dim sh1 As Worksheet Dim sh2 As Worksheet Dim sh3 As Worksheet Dim sh4 As Worksheet Dim sh7 As Worksheet '----------------------------------------------------------------------- Set wb1 = Workbooks("301.xlsm") Set wb2 = Workbooks("1.xls") Set wb4 = Workbooks("2.xls") Set sh1 = wb1.Worksheets("@") Set sh2 = wb1.Worksheets("@@") Set sh3 = wb2.Worksheets("@@@") Set sh4 = wb2.Worksheets("@@@@") Set sh7 = wb4.Worksheets("@@@@@") '---------------------------------------------------------- sh2.Range("A1:z63").ClearContents With sh7 Set objList3 = .ListObjects("リスト1") fmt = .Range("A2").NumberFormatLocal mydate = Format(mydate, fmt) objList3.Range.AutoFilter Field:=7, Criteria1:=mydate objList3.Range.AutoFilter Field:=5, Criteria1:="test" Set rng3 = objList3.Range.SpecialCells(xlCellTypeVisible) rng3.Copy sh2.Range("A2") objList3.Range.AutoFilter Field:=5 objList3.Range.AutoFilter Field:=5, Criteria1:=">=190" Set rng3 = objList3.Range.SpecialCells(xlCellTypeVisible) rng3.Copy sh2.Range("A20") objList3.Range.AutoFilter Field:=5 objList3.Range.AutoFilter Field:=7 End With Application.CutCopyMode = False Set rng3 = Nothing Set fmt = Nothing Set objList3 = Nothing Set wb1 = Nothing Set wb2 = Nothing Set wb4 = Nothing Set sh1 = Nothing Set sh2 = Nothing Set sh3 = Nothing Set sh4 = Nothing Set sh7 = Nothing End Sub (一部省略しています)

  • VBAのコピー

    VBAのコピー Dim xls As New Excel.Application Dim wbk As New Excel.Workbook Dim sh3 As Worksheet Set sh3 = Worksheets("全") sh3.Activate sh3.Range("A1:Z65536").Select Selection.Clear Set wbk = xls.Workbooks.Open("\\***.***.*.***\管理\全データ抽出.xls") wbk.Worksheets("全").Activate 'ワークシートをアクティブにする wbk.Worksheets("全").Range("A1:Z65536").Copy 'コピーする 'ActiveSheet.Paste Destination:=Worksheets("全").Range("A1") '貼り付ける Worksheets("全").Range("A1").PasteSpecial Paste:=xlPasteValues wbk.Close SaveChanges:=False 'Worksheets("メイン").Cells(1, 1).Select を実行すると 『wbk.Close SaveChanges:=False』のところで クリップボードに大きな情報があります。・・・・ と言うメッセージがでて必ずとまってしまうのですが メッセージをでないようにしたいのですが 教えてください。お願いします。

  • rangeメソッドは失敗しました

    またまたエラーが起きてしまいました、、 D列にある数値の平均値を出すマクロを組みたいのですが そのD列は今後増えていくので変数を使い指定したいのです Option Explicit Public Sub all() Const SH_NAME As String = "VBA" Dim i Dim endrow As Long Dim ws As Worksheet Dim Result As Integer Set ws = ThisWorkbook.Worksheets(SH_NAME) With ws endrow = .Cells(Rows.Count, 4).End(xlUp).Row For i = 2 To endrow Result = Application.WorksheetFunction.Average(.Range("D2:D&i")) .Range("F39").Value = Result .Range("F39").NumberFormatLocal = "0.00" Next i End With End Sub このコードだと Result = Application.WorksheetFunction.Average(.Range("D2:D&i")) のところでrangeメソッドは失敗しました と言われてしまいます どうかよろしくお願いします<m(__)m>

  • どなたかマクロ修正お願いします。

    自分なりに 作成してみましたがどうもうまくいきません。 Sub 変換() Dim Sh1 As Worksheet, Sh2 As Worksheet, Sh3 As Worksheet, Dim r As Range Set Sh1 = Worksheets("1") Set Sh2 = Worksheets("2") Set Sh3 = Worksheets("3") Sh3.Select Set c = Cells.Find(What:="9876543", LookAt:=xlWhole) c.Offset(, 1).Activate ActiveCell.Replace What:="中田", Replacement:="中田英寿" End Sub このように作成しましたがうまくいきません。恐らくsheet3のデータはsheet1から( =1!A100 )といったように値を他のsheetから持ってきてるからではないんでしょうか?

  • VBA なんですが

    VBA なんですが すべてのワークシートを順番に選択して 指定した範囲をコピーし『まとめ』と言う別のシートに貼り付けたいのですが どうしたらいいのかわかりません。 それらしいのは考えたのですが Set sh = Worksheets(sh.Name)でエラーになります。 頭がいいかた教えてください。   Dim sh3 As Worksheet Dim sh As Worksheet Dim en As Long Set sh3 = Worksheets("まとめ") For Each sh In ActiveWorkbook.Worksheets If sh.Name <> "まとめ" Then en = sh.UsedRange.Rows.Count Set sh = Worksheets(sh.Name) sh.Range(Cells(2, 1), Cells(en, 10)).Copy

  • エクセル VBA シート名を別シートにコピー

    早速の質問ですが エクセルVBAで シート名を別シートにコピーなのですが 10個のシートを順にシート名をコピー&ペーストしたいのです。 Dim aworkbook As Workbook Dim bworkbook As Workbook Set bworkbook = ActiveWorkbook Workbooks.Add Set aworkbook = ActiveWorkbook for i=1 to 10 bworkbook.Activate Worksheets(i).Select Application.CutCopyMode = False aworkbook.Activate Worksheets(i).Select ここに入る文章がわかりません Range("A1").Select next と以上な感じで作ってみたのですが どう貼り付けして良いかわからない状況です nextでまわす以上変数でなければだめなんでしょうけれども 構文が思いつきません。 皆様よろしくお願いいたします。

  • VBA 実行時エラーで、"プロパティまたはメソッド

    ・Sheet1(コード) Private Sub CommandButton1_Click() Call aaa End Sub ・Module1(コード) Sub aaa() Dim wb As Workbook Dim ws As Worksheet Workbooks.Open ("c:\test.xls") Set wb = Workbooks("test.xls") Set ws = wb.Worksheets("Sheet1") wb.ws.Range("A2").Value = "CCC" End Sub wb.ws.Range("A2").Value = "CCC"の部分で 以下の実行エラーが出ます。 ------------------------------------------------------------------------ 実行時エラー'438': オブジェクトは、このプロパティまたはメソッドをサポートしていません。 ------------------------------------------------------------------------ Set wb = Workbooks("test.xls") Set ws = wb.Worksheets("Sheet1") の部分で特にエラーも出ないので、オブジェクトの取得は成功していると 思うのですが、WorkSheetオブジェクトのwsからRangeメソッドを呼ぶことが できません。 動かない原因と対策を教えてください!!

  • エクセル マクロ range

    rangeの使い方が分かりません. 特にグラフの範囲指定の方法で・・・ 1..  r1=range("cells(28,RETU1)")  ? RETU1、RETU2は、inputboxで指定したい。 2. r2=range("cells(28,RETU1),cells(295,RETU2") ? 3. range("a28,a295","cells(28,RETU1),cells(295,RETU2").select ? 離れた範囲2つを一つの範囲にしたグラフを書きたい。 4.  inputboxで列名を記入するとき、数字でないといけないのか、アルファベットでもいいのですか? 5. range("cells(28,RETU1)").activate ? 以上を別法で以下のようにしたら? 6.  Dim r1 As RANGE ・・・となって、Rangeになりません。   このあと、例えば、 r1.select とかr1.activateでいいですか? 7. set R1=range("cells(28,RETU1),cells(250,RETU2") set R2=range(a28,a250) unite (R1,R2) ?

  • マクロ組んでみましたが、動きません・・・・TT

    当方ビギナーにつき、参考片手にマクロ組んでいますが、苦戦してます。 処理コメント追って頂くと、やりたいことわかって頂けると思うのですが、、 具体的にどこがいけないのか、ご指導願います。 Dim myDic As Object Dim wb1 As Workbook Dim wb As Workbook Dim ws As Worksheet Dim sh As Worksheet Dim myKey Dim Hiduke As Variant '出力確認 Dallc = MsgBox("抽出データは、営業ブック担当シートの行末尾に追加されます。", vbYesNo + vbExclamation, "出力確認") Select Case Dallc Case vbYes Set myDic = CreateObject("Scripting.Dictionary") Set wb1 = ThisWorkbook Application.ScreenUpdating = False '営業部ブックの中から担当シートを探す For Each sh In wb1.Worksheets If InStr(ActiveSheet.Name, "担当") Then End If Next '作成日時の確認 Hiduke = ActiveSheet.Range("B5") '他ブックシート貼り付けデータ抽出 ActiveSheet.Range("B5").AutoFilter Field:=1, Criteria1:="=" & Hiduke ActiveSheet.AutoFilter.Range.SpecialCells(xlCellTypeVisible).Copy '他フォルダの営業ブック読み込み、データ行末尾に追加上書き Workbooks.Open Filename:="C:\仕事\営業.xls" Worksheets("担当").Activate Range("A65536").End(xlUp).Offset(1, 0).PasteSpecial With ActiveSheet .Columns("A:AC").EntireColumn.AutoFit Windows("営業.xls").Close End With 'MSGボックスNOの場合 Case vbNo Worksheets("edit").Activate End Select

専門家に質問してみよう