Worksheetsオブジェクト(エクセル)で実行時エラーが発生する理由を教えてください

このQ&Aのポイント
  • エクセルでWorksheetsオブジェクトを使用してセルに値を代入する際に、実行時エラー9が発生しています。
  • エラーメッセージは「インデックスが有効範囲にありません」と表示されています。
  • セル範囲の指定方法やコレクションの取得方法に問題がある可能性があります。
回答を見る
  • ベストアンサー

Worksheetsオブジェクト(エクセル)

エクセルで次のような文を書いて実行したところ Worksheets(sheet_name).Cells(r.Row, myFindR.Column).Value = "1" 実行時エラー9 インデックスが有効範囲にありませんとでました。 sheet_name=Left(Me.my_range, InStr(Me.my_range, "!") - 1)とRefEditで入力したセル範囲を指定しています。 rは、For Each r In Range(Me.input_sheet)と同じくRefEditで入力したセル範囲から、コレクションを取得しています。 myFindRは、myFindR = Range(Me.my_range).Find(What:=r_r1.Value, lookat:=xlWhole)としています。 私の力では、なぜエラーが出るのか?解りません。 どなたか?詳しい方がいらっしゃいましたら教えてください。 よろしくお願い致します。

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

  • ベストアンサー
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.1

こんばんは。 コードはできるだけ全体象がわかるように掲載した方が良いですよ。文字数 制限ならこの回答の補足欄をご利用ください。 取り合えず、気になったとこです。 > Worksheets(sheet_name).Cells(r.Row, myFindR.Column).Value = "1" > 実行時エラー9 インデックスが有効範囲にありませんとでました。 1. sheet_name が正しく取得できていない 2. myFindR が Nothing または不正値であるため、Column が取得できない のいずれかに原因がありそうな気がします。 ▼ 1. について > sheet_name=Left(Me.my_range, InStr(Me.my_range, "!") - 1) RefEdit はユーザーが手入力可能なコントロールです。つまり、 Sheet1!$A$1 のつもりで、Shee1!$A$1 などのように間違った入力した場合、 Range の参照でエラーになります。エラートラップした方が良いです。  # Range からシートオブジェクトを参照するには Parent が便利です。   On Error Resume Next   ' RefEdit の値が不正の場合 Range を参照しようとするとエラーが発生   ’それをトラップします   sheet_name = Range(Me.my_range).Parent.Name   If Err Then     MsgBox "RefEdit の値が不正でエラー"     Exit Sub   End If   On Error GoTo 0 ▼ 2. について > myFindR = Range(Me.my_range).Find(What:=r_r1.Value, lookat:=xlWhole)   ↓ Set myFindR = Range(Me.my_range).Find(What:=r_r1.Value, lookat:=xlWhole) Set がないと変数 myFindR には Find で見つかったセルの値が代入されて しまいそうな気がしますが...だとすれば、 > myFindR.Column はエラーになりませんか? 変数は宣言してますか? 変数を全然宣言しない、つまり全部 Variant でコードを書いていると、この ようなミスが発見しにくくなるのですが...この点はどうでしょうか? それから Find は該当セルがない場合 Nothing を返しますのでエラートラップ をしてみて下さい。 Dim myFindR As Range   Set myFindR = Range(Me.my_range).Find(What:=r_r1.Value, _                      LookIn:=xlValues, _                      LookAt:=xlWhole)   If myFindR Is Nothing Then '<--ココがエラートラップ     MsgBox "該当セルなし"     Exit Sub   End If 以上です。

関連するQ&A

  • セルの交点に入力するには?

    あるセルとあるセルの交点に変数に格納した値を入力したいのですが、うまくいきません。 どなたかご教授をお願いできないでしょうか。 VBAを以下にご紹介します。s,e,aの変数はStringで定義しています。Longだとemptyになるようなので・・・ .Cells(i, t).Value = Format(Now(), "yyyy/mm/dd AM/PM") s = Me.s.Value 'ユーザフォームから入力された値を格納 16桁の数値 e = .Cells(i, t).Value a = Me.a,.Value'ユーザフォームから入力された値を格納 16桁の数値 Intersect(Range("$B:$B").Find(s, Lookat:=xlWhole).EntireRow, Range("$1:$1").Find(e, Lookat:=xlWhole).EntireColumn).Value = a これで実行すると、 「実行時エラー91 オブジェクト変数、またはwithブロック変数が設定されていません。」 となってしまいます。 よろしくお願いします。

  • エクセルのVBAで悩んでいます。

    いつもありがとうございます。 エクセルのVBAで悩んでいます。 セルの範囲指定をVBAで行いたいのです。 ただし、引数に数値変数を使用する為、Cellsプロパティを使います。 すると、離れている範囲の範囲指定が出来ないのです。 例えば、Rangeプロパティだと、 Range("A5:E5,A9:E32").Select こうなるところを、 A9:E32 を変数に置き換えたくて、 Range("A5:E5", Cells(g, 1), Cells(h, 5)).Select と、するとエラーが出ます。 VBAの前文は次の通りです。 Private Sub CommandButton1_Click() a = Me.TextBox1.Value b = Me.TextBox2.Value Set c = Range("a:a").Find(what:=a, LookIn:=xlValues, lookat:=xlWhole) Set d = Range("a:a").Find(what:=b, LookIn:=xlValues, lookat:=xlWhole) 'MsgBox c + d e = c.Address 'MsgBox e f = d.Address 'MsgBox f g = Range(e).Row MsgBox g h = Range(f).Row MsgBox h Range(Cells(g, 1), Cells(h, 5)).Select End sub よろしくお願い致します。

  • エクセルVBA  activesheetの非表示

    エクセル2002使用です。 sheet1のモジュールにsheet2のセルから値を取得するコードを書きました。 セルの値を取得後、sheet1の画面に戻します。 値を取得するために一度sheet2をactivesheetにする必要があると思うのですが、 その際にマクロを実行するとエクセルの画面が一瞬sheet1からsheet2に変わってしまいます。 この、一瞬のsheet2の画面を出さない方法はあるのでしょうか? sub aaa() Dim tukikekka as range Worksheets("sheet2").Activate Set tukikekka = ActiveSheet.Range("A2:A15") _ .Find(what:=ActiveSheet.Range("A1"), lookat:=xlWhole) Worksheets("sheet1").Activate ActiveSheet.Range("H7").Value = tukikekka.Offset(,7) end sub (実際のコードはもう少し長いので、Sheet2がはっきりと見えます) よろしくお願いします。

  • VBA 変数Variantは万能??

    エクセル2002使用です。 A1セル  日付入力(ex.2005/7/25) A2セル  A1セルから月のみワークシート関数で取得 =month(A1) A3セル  日付入力 '12ヶ月分(ex.2005/7/25~2006/6/25) A4セル  A3セルから月のみワークシート関数で取得 =month(A3) ’12ヶ月分 3行目、4行には12ヶ月分AからL列に同じ設定があります。 (この質問にはあまり関係ないですが・・・) A7セルにA2の値を参照して入力のため sub test() Dim Myrg as variant ’またはstring、Duble Set Myrg = Range("A4:L4") _ .Find(what:=range("A2").value, lookat:=xlWhole) range("A7").value = myrg end sub とすると、Myrgはemptyのままで数値を拾ってくれません。 A2セルとA4~L4セルをA5セルA6~L6セルにフォーマットして sub test() Dim Myrg as variant ’またはstring、Duble  Range("A5").Value = Format(Range("A2").Value, "##")  Range("A6").Value = Format(Range("A4").Value, "##")  Range("B6").Value = Format(Range("B4").Value, "##")   ’(以下12ヶ月分フォーマット) Set Myrg = Range("A6:L6") _ .Find(what:=range("A5").value, lookat:=xlWhole) range("A7").value = myrg end sub とするとちゃんと数値を拾ってくれます。 分からないのは、  1.変数variantは、万能ではないのでしょうか?  2.ワークシート関数で得た数値はすべて一度フォーマットする必要があるのでしょうか?    フォーマットしない良い方法はあるのでしょうか? ちなみにキーボードから入力した数値もちゃんと拾ってくれます。 詳しい原因がわからないのでよろしくお願いします。

  • エクセルRangeオブジェクトの使い方

     エクセルで名簿を作ろうとしています。よくあることですが、入力を簡単にするため、入力メニューを作り、一人目を入力したら次の行に行くようにマクロを考えているのですが、その前に最初のセルを選択させようと下記のように記述したところ、コンパイル時に実行時エラー'1004'アプリケーション定義またはオブジェクト定義エラーです。というエラーになります。  また、作成したコマンドボタンから実行しても実行時エラー'1004'RangeクラスのSelectメソッドが失敗しましたというエラーになります。 Rangeオブジェクトの記載の仕方は間違いないと思うのですが....ちなみに書こうとしている意味は、表が、全く登録がない場合、最初B2セルから記載していくように考え、追加登録していくときはB1セル(項目に当たる行)から空白行になるまで改行するように考えました。 記述内容 Sub CommandButton1_Click() Worksheets("名簿").Select If Range("B2").Value = "" Then Range("B2").Select ←エラーになる行です Else Range("B1").Select Selection.End(xlDown).Select ActiveCell.Offset(1, 0).Select End If 名簿登録.Show End Sub

  • EXCEL VBA 他のワークシートのデータを見るには?

    EXCEL VBAでsheet1のセルに何かデータが入力された時に、sheet2のどこかのセルに同じ文字列がないかを探したいと思います。 データの入力と同時に検索をかけるため、sheet1の部分にイベントプロシージャを定義し、 データが入力された時にそのルーチンの中からsheet2のデータを見に行きたいのですが、エラーが出てしまいます。 こういうことはできないのでしょうか? Private Sub Worksheet_Change(ByVal Target As Range) Dim LineNo As Integer Dim tmp_str As String tmp_str = Target.Value LineNo = Sheets("sheet2").Cells.Find(what:=tmp_str, lookat:=xlWhole).Row MsgBox (LineNo) End Sub

  • ユーザーフォーム オプションボタン について

    ユーザーフォーム内にオプションボタンを21個作っており、 Private Sub CommandButton1_Click() Dim SerchArea As Range '検索範囲(シート名指定) Set SearchArea = Sheets("1").Range(Range("A:A"), Range("A:A").End(xlDown)) '検索処理(引数:LookAt に xlWhole で完全一致 Set FoundCell = SearchArea.Find( _ What:=Me.TextBox1.Value, _ SearchOrder:=xlByRows, _ LookAt:=xlWhole, _ LookIn:=xlValues, _ MatchCase:=False) '商品コードが無い場合の処理 If FoundCell Is Nothing Then MsgBox "ありません!", vbCritical GoTo ExitHandler End If '見つかった場合の処理 With FoundCell Me.TextBox1.Value = .Offset(0, 0).Value Me.TextBox2.Value = .Offset(0, 11).Value Me.TextBox3.Value = .Offset(0, 12).Value Me.TextBox4.Value = .Offset(0, 4).Value テキストボックスにセルの値が入るようにしており、追加でオプションボタンを付けて更新としたいのですが、21個のうちどれか一つを選択して、その値をZ列に反映させたいのですが Private Sub CommandButton2_Click() With FoundCell .Offset(0, 13).Value = Me.TextBox20.Value .Offset(0, 4).Value = Me.TextBox4.Value .Offset(0, 5).Value = Me.TextBox5.Value ここの追加でオプションボタンを設定するにはどうすれば良いでしょうか?

  • VBA 並び替え

    たびたびお世話になります 選択範囲の並べ替えを行いたく こちらで教わった方法で セル位置の取得を行い Set r = Columns("A").Find("b1", lookat:=xlWhole, After:=Range("A" & Rows.Count)) Set rr = Columns("A").Find("bm123-1", After:=r, Searchdirection:=2) その取得した位置を元に並べ替えを行いたい 範囲選択をしています Range(r, rr.Offset(, 14)).Select その後並び替えを実施したいのですが Selection.Sort Key1:=Range(r.Offset(, 14)) この様にしてみましたが 実行時エラー1004が返されてしまいます どのようにすれば 並び替えができるのでしょうか よろしくお願いします

  • VBA 並び替え

    たびたびお世話になります 選択範囲の並べ替えを行いたく こちらで教わった方法で セル位置の取得を行い Set r = Columns(\"A\").Find(\"b1\", lookat:=xlWhole, After:=Range(\"A\" & Rows.Count)) Set rr = Columns(\"A\").Find(\"bm123-1\", After:=r, Searchdirection:=2) その取得した位置を元に並べ替えを行いたい 範囲選択をしています Range(r, rr.Offset(, 14)).Select その後並び替えを実施したいのですが Selection.Sort Key1:=Range(r.Offset(, 14)) この様にしてみましたが 実行時エラー1004が返されてしまいます どのようにすれば 並び替えができるのでしょうか よろしくお願いします

  • EXCELのシート名自動入力

    EXCELでシート名にセルA1の値を自動入力したいので、 下記のマクロを使いましたが、いちいちマクロを実行しないと自動入力できません。 Public Sub SheetName() ActiveSheet.Name = Range("A1").Value End Sub これを、マクロを実行しなくても、セルA1の値が変わった時点で 自動的にシート名も変わるようにできないでしょうか?

専門家に質問してみよう