rangeメソッドの失敗とエラーの解決方法

このQ&Aのポイント
  • VBAのコードで使用したrangeメソッドが失敗し、エラーが発生しています。
  • コードの特定の箇所でエラーが発生しており、rangeメソッドを正しく使う方法を教えてください。
  • rangeメソッドの使い方を理解し、エラーを解決するためのヒントを教えてください。
回答を見る
  • ベストアンサー

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>

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

  • ベストアンサー
  • Picosoft
  • ベストアンサー率70% (274/391)
回答No.1

> Result = Application.WorksheetFunction.Average(.Range("D2:D&i")) i = 2のときは"D2:D2", i = 3のときは"D2:D3"……というようなことがしたいのでしょうか? それなら  Result = Application.WorksheetFunction.Average(.Range("D2:D" & i)) と書く必要があります。

lostsymbol
質問者

お礼

なるほど!! こちらの拙い質問の意図をきちんと汲み取ってくれそれに対して適切な回答をありがとうございました_(_^_)_ また機会があればよろしくお願いいたします!

関連するQ&A

  • PasteSpecialメソッドの失敗

    会社でVBAの勉強をしているのですが、 自分でコードを書いてみたところエラーが出て困っております 初心者なのでエラーの意味もわからずここにきました みなさまよろしくお願いします(・・;) Sub nigate() Const SH_NAME As String = "おはようございます" Dim i Dim ws As Worksheet Dim writerow As Integer Dim endrow As Long Set ws = ThisWorkbook.Worksheets(SH_NAME) writerow = 2 With ws endrow = .Cells(Rows.Count, 2).End(xlUp).Row .Columns("M:N").Clear For i = 2 To endrow If Range("D" & i).Font.ColorIndex = 3 Then Range("C" & i).Copy Range("L" & writerow) .PasteSpecial xlPasteAllExceptBorders writerow = writerow + 1 Application.CutCopyMode = False ElseIf Range("D" & i).Interior.ColorIndex = 36 Then Range("C" & i).Copy Range("K" & writerow) .PasteSpecial xlPasteAllExceptBorders writerow = writerow + 1 Application.CutCopyMode = False End If Next i End With End Sub これを実行すると、 PasteSpecialメソッドは失敗しました`Worksheet`オブジェクト と表示され止まってしまいます コードで言うと .PasteSpecial xlPasteAllExceptBorders のところが黄色くなります よろしくお願いしますm(__)m

  • 小数点以下表示

    averageで計算した値を表示したところ、 勝手に四捨五入されてしまいました 小数点第二位まで表示したいので どなたかよろしくお願いいたします<m(__)m> Option Explicit Public Sub 平均() Const SH_NAME As String = "VBA" Dim art As String Dim i Dim ws As Worksheet Dim endrow As Long Dim msg As String Dim writerow As Integer Dim target As Range Dim ActCell As Variant Dim Result As Integer Set ws = ThisWorkbook.Worksheets(SH_NAME) writerow = 2 art = InputBox("日付を入力してください") With ws endrow = .Cells(Rows.Count, 2).End(xlUp).Row For i = 2 To endrow If art = .Range("A" & i) Then If target Is Nothing Then Set target = Range("D" & i) Else Set target = Union(target, Range("D" & i)) End If Else If InStr(msg, .Range("A" & i)) = 0 Then msg = msg & .Range("A" & i) & vbCrLf End If End If Next i If msg <> "" Then MsgBox msg End If target.Select ActCell = Selection.Address Result = Application.WorksheetFunction.Average(.Range(ActCell)) Range("F39").Value = Result Range("F39").NumberFormatLocal = "0.00" End With End Sub

  • オブジェクト??

    またまた困っております inputboxで入力した日付を検索して複数選択しようとしたのですが unionの使い方がよくわかりません(・・;) どこが間違っているのかもしくは何が足りないのか教えてください<m(__)m> どうかよろしくお願いします! Option Explicit Sub グラフ() Const SH_NAME As String = "VBA" Dim art As String Dim i Dim ws As Worksheet Dim endrow As Long Dim msg As String Dim writerow As Integer Dim grahu As Chart Dim target As Range Set ws = ThisWorkbook.Worksheets(SH_NAME) writerow = 2 art = InputBox("日付を入力してください") With ws endrow = .Cells(Rows.Count, 2).End(xlUp).Row For i = 2 To endrow If art = .Range("A" & i) Then Set target = Union(target, "D" & i) Else If InStr(msg, .Range("A" & i)) = 0 Then msg = msg & .Range("A" & i) & vbCrLf End If End If Next i target.Select End With If msg <> "" Then MsgBox msg End If MsgBox "グラフベースを作成しました" End Sub Set target = Union(target, "D" & i) ↑ここでエラーが起きて 「オブジェクトが必要です」と言われました どうすればよいのでしょうか?

  • '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

  • 『実行時エラー'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

  • オブジェクトが必要です

    またまた困ってます、、 このコードを実行したとき .Range("H" & i).Copy.wsDetail.Range ("D24") ここでエラーが起きて 「オブジェクトが必要です」 と言われてしまいます(・・;) だれかよろしくお願いします<m(__)m> ※シートの宣言は上でやってます Private Sub 社会保険() Dim i Dim endrow As Long Dim kihon As Long Set wshoken = Worksheets("各種保険料表") Set wsDetail = Worksheets("給与明細") Set wsData = Worksheets("データ入力") kihon = WorksheetFunction.Round(wsData.Range("C5"), -4) endrow = Cells(Rows.Count, 3).End(xlUp).Row With wshoken For i = 2 To endrow If kihon = .Range("C" & i) Then .Range("H" & i).Copy.wsDetail.Range ("D24") .Range("L" & i).Copy.wsDetail.Range ("H24") .Range("N" & i).Copy.wsDetail.Range ("L24") Application.CutCopyMode = False End If Next i End With End Sub

  • Excel VBA 連番印刷

    昨日以下の質問をさせていただいた者です。 http://okwave.jp/qa/q8349562.html こちらで教えていただいた以下のコードに、 J2のセルに連番を振るコードを付け足したいと思い、 同じくこちらのサイトの過去の履歴にあった以下コードを参考にとやってみているのですが、 Next で指定された変数の参照が無効です。と言われてしまいます… 印刷部数の指定はいらず、sheet印刷のJ2セルに1から始まる連番を振りたいのです。 どのように修正をしたらいいのかご教示願います。 Sub Sample4() Dim i As Long, endRow1 As Long, endRow2 As Long, myArea1 As Range, myArea2 As Range Dim wS1 As Worksheet, wS2 As Worksheet, wS3 As Worksheet Set wS1 = Worksheets("DB") Set wS2 = Worksheets("印刷") Set wS3 = Worksheets("Sheet3") endRow1 = wS1.Cells(Rows.Count, "A").End(xlUp).Row Range(wS1.Cells(1, "A"), wS1.Cells(endRow1, "A")).AdvancedFilter Action:=xlFilterInPlace, unique:=True wS1.Range("A:A").Copy wS3.Range("A1") wS1.ShowAllData For i = 2 To wS3.Cells(Rows.Count, "A").End(xlUp).Row endRow2 = wS2.Cells(Rows.Count, "B").End(xlUp).Row If endRow2 > 9 Then Range(wS2.Cells(10, "B"), wS2.Cells(endRow2, "H")).ClearContents Range(wS2.Cells(10, "J"), wS2.Cells(endRow2, "J")).ClearContents End If wS1.Range("A1").AutoFilter field:=1, Criteria1:=wS3.Cells(i, "A") wS2.Range("B6") = wS3.Cells(i, "A") Set myArea1 = Range(wS1.Cells(2, "B"), wS1.Cells(endRow1, "H")).SpecialCells(xlCellTypeVisible) Set myArea2 = Range(wS1.Cells(2, "I"), wS1.Cells(endRow1, "I")).SpecialCells(xlCellTypeVisible) myArea1.Copy wS2.Activate ActiveSheet.Range("B10").Select Selection.PasteSpecial Paste:=xlPasteValues myArea2.Copy wS2.Activate ActiveSheet.Range("J10").Select Selection.PasteSpecial Paste:=xlPasteValues endRow2 = wS2.Cells(Rows.Count, "B").End(xlUp).Row 'Range(wS2.Cells(1, "A"), wS2.Cells(endRow2, "J")).PrintOut Next i wS1.AutoFilterMode = False wS3.Cells.Clear End Sub 連番印刷のコード Sub NumberPrint() Dim idx As Integer Dim res  res = Application.InputBox("印刷部数を入力してください", Type:=1)  If res > 0 Then   For idx = 1 To res    Range("AW3").Value = idx    ActiveSheet.PrintOut   Next idx  End If End Sub

  • VBAで複数列からの条件指定でデータを抽出したい

    講習会の受講者名簿を作成しています。(名簿は科目別で3つのシートに分かれています。) 現在下記モジュールで、受講者名・受講者番号を個々に入力し検索出来るようにしていますが、 受講日(例:2014/4/1~2014/4/31の間)で受講者を抽出できるようにしたいと考えています。 しかし、受講予定日は過去のものも含め複数列(I列~N列)まであり、受講者によって受講日の入力されている列がI列~N列間でまちまちです。 このような場合、どのようにVBAを変更したら受講日で検索が可能になるでしょうか? 宜しくお願いします。 Sub Sample2() Dim k As Long, endRow As Long, wS As Worksheet Set wS = Worksheets("検索&抽出") If wS.Range("B1") = "" And wS.Range("B2") = "" Then MsgBox "検索データを入力してください" Exit Sub End If endRow = wS.Cells(Rows.Count, "A").End(xlUp).Row If endRow > 4 Then wS.Rows(5 & ":" & endRow).ClearContents End If For k = 2 To 4 With Worksheets(k) If wS.Range("B1") <> "" Then .Range("A1").AutoFilter field:=2, Criteria1:=wS.Range("B1") End If If wS.Range("B2") <> "" Then .Range("A2").AutoFilter field:=3, Criteria1:=wS.Range("B2") End If If .AutoFilter.FilterMode Then endRow = .Cells(Rows.Count, "A").End(xlUp).Row If endRow > 2 Then Range(.Cells(3, "A"), .Cells(endRow, "N")).Copy wS.Cells(Rows.Count, "A").End(xlUp).Offset(1) End If .AutoFilterMode = False End If End With Next k End Sub

  • Range.Name プロパティの使い方

    VBAの勉強中のものです。(エクセル) 一つ一つヘルプを見て、検証して勉強していこうと思ってるのですが 使い方がわからないので教えてください。 Range.Value プロパティならうまくいくのですが、 Range.Name プロパティの使い方がわかりません。 ----------------------- Sub test1() MsgBox Range("a1").Name End Sub Sub test2() Dim R As Range Set R = Range("a1") MsgBox R.Name End Sub ----------------------- どちらも、アプリケーション定義またはオブジェクト定義のエラーです。になります。 ----------------------- Sub test1() MsgBox Range("a1").Value End Sub Sub test2() Dim R As Range Set R = Range("a1") MsgBox R.Value End Sub ----------------------- rangeにすればうまくいきます。 Range.Name プロパティの使い方を教えてください。アドバイスよろしくお願いします。

  • VBAで複数列からの条件指定でデータを抽出したい

    講習会の受講者名簿を作成しています。(名簿は科目別で3つのシートに分かれています。) 現在下記モジュールで、受講者名・受講者番号を検索出来るようにしていますが、 別シートに次回受講日(例:2014/4/1~2014/4/31)で受講者を抽出できるようにしたいと考えています。 しかし、受講予定日は過去のものも含め複数列(I列~N列)まであります。 このような場合、どのようにしたら受講日で検索が可能になるでしょうか? 宜しくお願いします。 Sub Sample2() Dim k As Long, endRow As Long, wS As Worksheet Set wS = Worksheets("検索&抽出") If wS.Range("B1") = "" And wS.Range("B2") = "" Then MsgBox "検索データを入力してください" Exit Sub End If endRow = wS.Cells(Rows.Count, "A").End(xlUp).Row If endRow > 4 Then wS.Rows(5 & ":" & endRow).ClearContents End If For k = 2 To 4 With Worksheets(k) If wS.Range("B1") <> "" Then .Range("A1").AutoFilter field:=2, Criteria1:=wS.Range("B1") End If If wS.Range("B2") <> "" Then .Range("A2").AutoFilter field:=3, Criteria1:=wS.Range("B2") End If If .AutoFilter.FilterMode Then endRow = .Cells(Rows.Count, "A").End(xlUp).Row If endRow > 2 Then Range(.Cells(3, "A"), .Cells(endRow, "N")).Copy wS.Cells(Rows.Count, "A").End(xlUp).Offset(1) End If .AutoFilterMode = False End If End With Next k End Sub

専門家に質問してみよう