• ベストアンサー

【エクセルVBA】「インデックスが有効範囲にありません」というエラーがでます

こんにちは。VBA初心者ですが、下記コードを実行すると エラーが出てしまいました。 シート(シート1)のセルから別シート(シート2)のセルに 値のみコピーするVBAを組んでいます。 適宜、シート1に入力したものを読みこませていきたいので 変数を使用しています。 ------------------------------------------------------------- Sub セルのコピー() Dim X As Integer X = 3 Y = 2 Do While Cells(X, "A").Value <> "" Sheets("シート1").Cells(X, "A").Copy Sheets("シート2").Activate Sheets("シート2").Cells(Y, "F").PasteSpecial _ Paste:=xlPasteValues ⇒エラー対象 Application.CutCopyMode = False X = X + 1 Y = Y + 1 Loop End Sub ------------------------------------------------------------ つまり、シート1のA3セルを先頭にA4,A5,A6・・・と続くセルの値 をシート2のF2を先頭としたセル(以下、F3,F4・・・)に値のみコピー していきたいのですが。。 実行すると「インデックスが有効範囲にありません」というエラーが でます。デバック対象は上記、「⇒エラー対象」の構文です。 変数の設定の仕方がおかしいのでしょうか。。 ご教示のほどよろしくお願いいたします。

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

  • ベストアンサー
回答No.3

>Sheets("シート2").Cells(Y, "F").PasteSpecial _ Paste:=xlPasteValues ⇒エラー対象 で、「PasteSpecial _ Paste:=xlPasteValues」 の “_” を消去してください。 また、  Sheets("シート2").Activate で "シート2" を Activate にすると、 Do Loop の頭に返ってきたとき、  Do While Cells(X, "A").Value <> "" の Cells(X, "A") は "シート2" の Cells(X, "A") を見に行きますので、 思っているような動作はしません。  最後の Loop の前に、 Sheets("シート1").Activate を入れるか、While の後の Cells(X, "A").Value の頭に、Sheets("シート1"). をつければ、この問題を回避することができます。 コピー先のシートは、アクティブにしなくても、ペーストする方法があります。 あなたのコードを少し変更します。  Sub セルのコピー2()    Dim X As Integer, Y As Integer    X = 3    Y = 2    Do While Cells(X, "A").Value <> ""      Sheets("シート1").Cells(X, "A").Copy Destination:=Sheets("シート2").Cells(Y, "F")      X = X + 1      Y = Y + 1    Loop    Application.CutCopyMode = False  End Sub 注) 使っているブラウザの見る条件によって、「Sheets("シート1").Cells(X, "A").Copy Destination:=Sheets("シート2").Cells(Y, "F")」と「Destination:=Sheets("シート2").Cells(Y, "F")」が2行になったように見えることがあるかもしれません。 2つのコードはスペースを1つはさみ、続けて書いてください。 変更したコードの場合、"シート1" が常時表示されたままになります。 行数が200行くらいとのこと、速度を早くしたい場合は、最初に  application.ScreenUpdating=False 最後に、  application.ScreenUpdating=True を加えます。 なお、シート名は "Sheet1" ですか、"シート1"ですか、どちらかに揃えましょう。 、"シート1"と、"シート2"がブックの先頭から順になっているときは、シート名を使わなくてそれぞれ Sheets(1)、Sheets(2) でもいけます。 (1)、(2) は左から 1番目のシート、2番目のシートという意味です。 試してみてください。

dahco7
質問者

お礼

>konnamondeさま ご回答ありがとうございます。 返信がおそくなり申し訳ありません。 シート名を誤転記していたのと、Do while cells(X,"A")の前にsheets("シート1")を追加、sheets("シート2").activateを削除したら、無事動作しました。 また、ScreenUpdatingプロパティを加えてみたら各段に動作が速くなり 感動しております。。 Sheets("シート2").Activate で "シート2" を Activate にすると、 Do Loop の頭に返ってきたとき(以下省略) ⇒なるほど!でした。動作イメージがしっかり分かってないと。。ですね。 シート名を使わなくてそれぞれ Sheets(1)、Sheets(2) でもいけます ⇒こちらの方が使いやすそうですね。取り入れてみます!

その他の回答 (3)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんばんは。 ご披露なさったコードは、Excel VBAでは、ふつうは書かない練習コードですから、それ自体にとやかくいっても、あまり身につかないように思います。 >実行すると「インデックスが有効範囲にありません」というエラーがでます。 このエラーは、コードからすると「シート名が違っている」という意味のはずです。 「シート2」というシート名をわざわざ付けているのでしょうか?全角・半角の間違いとかありませんか? #1さん、#2さん,#3さんのご指摘は、ともに正しいです。 下に伸びるものは、Integer 型ではなく、Long型にしますが、 Dim x As Long Dim y As Long  Sheets("シート2").Cells(Y, "F").PasteSpecial Paste:=xlPasteValues 'アンダーライン余分 しかし、このコード自体は、シート1モジュールに書けば通るはずです。 標準モジュールに書けば、本来は、シート1 のA列を検査するはずが、シート2に移っていますので、シート2のA列が空なら、そこで止まります。 標準モジュールに書くと、アクティブシートが、 Sheets("シート2").Activate '←これでシート2 に移ってしまっています。 そして、 Cells(X, "A").Value <> "" Shhets("シート2") のA列を調べることになります。 ただ、あまり、失敗やエラーを出しやすい部分が多すぎるということは、自己流かもしれません。きちんとした教本で勉強したり、参考にしたりしてパターンを覚えたほうがよいのではないでしょうか? 以下も、あまり書かない方法ですが、End プロパティと、Copy メソッドを分かりやすくしたのコードです。 Sub Test2() '←なるべく2バイト文字は使わないほうがよいです。   Worksheets("Sheet1").Activate   Range("A3", Range("A65536").End(xlUp)).Copy Worksheets("Sheet2").Range("F2")   Worksheets("Sheet2").Activate End Sub Sub Test3()   Worksheets("Sheet1").Activate   Range("A3", Range("A65536").End(xlUp)).Copy   Worksheets("Sheet2").Range("F2").PasteSpecial Paste:=xlPasteValues   Worksheets("Sheet2").Activate End Sub

dahco7
質問者

お礼

>Wendy02さま ご回答ありがとうございます。 返信が遅くなり申し訳ありません。 シート名を誤転記していたのと、Do while cells(X,"A")の前にsheets("シート1")を追加、sheets("シート2").activateを削除したら、無事動作しました。 このエラーは、コードからすると「シート名が違っている」という意味のはずです。 ⇒それが分かりませんでした。。勉強になります。 ただ、あまり、失敗やエラーを出しやすい部分が多すぎるということは、自己流かもしれません。きちんとした教本で勉強したり、参考にしたりしてパターンを覚えたほうがよいのではないでしょうか? ⇒おっしゃる通りで基本的なことが書いてある参考書的な本と逆引き辞典でやっております。やりたいことができそうなコードを繋げているような状態なのでエラーが頻発してしまいます。教本は随分探したのですが、コレ!という本に出会えておりません。お勧めがあれば教えていただけますでしょうか。 以下も、あまり書かない方法ですが、End プロパティと、Copy メソッドを分かりやすくしたのコードです。 ⇒Do while文を使用したものより、さくっと処理できました。 実は質問はやりたいことの第一段階だったりします。。途中でこちらの コードに変更するかもしれません。ありがとうございます。

  • o_chi_chi
  • ベストアンサー率45% (131/287)
回答No.2

シート1、シート2はシート名と合っていますか? あと Do While Cells(X, "A").Value <> "" は Do While Sheets("シート1").Cells(X, "A").Value <> "" Sheets("シート2").Activate は必要ないです。

dahco7
質問者

お礼

>o_chi_chiさま ご回答ありがとうございます。 Do While Sheets("シート1").Cells(X, "A").Value <> "" Sheets("シート2").Activateは必要ないです。 ⇒言われてみるとその通りですね。。 まだ基本文法もわかってないのだなあ、、と反省しきりです。

  • moon00
  • ベストアンサー率44% (315/712)
回答No.1

多分、最初の Dim X As Integer を Dim X As Long に変更すれば、動くと思われます。 行数がIntegrでは足りないということだと思うのですが。 (Yも同じように定義していたら、Longにしてください)

dahco7
質問者

お礼

>moon00さま ご回答ありがとうございます。 早速試してみましたが、longにしても同じ結果でした。 ちなみに、処理する行数は最大で200行となります。 変数の設定をせず、XとYに整数値を代入すると問題なく実行されます。 引き続きご指南いただけますと幸いです。 よろしくお願いいたします。

関連するQ&A

  • エクセルVBAで選択していないシートのセルコピー

    エクセルVBAで質問させてください。 現在選択していないシートから、セルの書式ごとコピーして貼り付けたいのです。 たとえば Sheets(1).Range(Cells(1, 1), Cells(4, 1)).Copy Sheets(2).Range("A1") 等とすると、Sheets(2)が選択されている状態だとエラーになってしまいます。 おそらく、Copyメソッドというのは、選択されているシートにのみ有効だからなのではないか、と思いますが、セルの値だけでなくフォントその他の書式を、別のシート(現在アクティブでない)から持ってくる方法はありますか?

  • VBAを使ってシート上に関数式を入れたいのですが・・・

    シート上の1つのセル内に次のような関数式を入れたいと思っています。 =RSQ(F2:F1000),(G2:F1000) F2の2、及びF1000の1000の部分は変数で、それぞれx,yとしています。 VBAのコードで Cells(68, y)="=RSQ(F" & x & ":F" & y & "),(G" & x & ":G" & y & ")" としたらエラーが出てしまいました。 正しい記述を教えてください。 (&の使い方がおかしいのでは、と思っているのですが・・・) よろしくお願いします。

  • Excel VBA インデックスが有効範囲にない

      よろしくお願いします。 Excel VBA 初心のものです。 プログラムを作ってみたのですが、 「インデックスが有効範囲にありません」となってその先に進めません。 ソースですが ------------------------------------------------------ Private Sub CommandButton1_Click() Dim buf As String, cnt As Long Dim TMP As Variant Const Path As String = "D:\Excel\sample\" buf = Dir(Path & "*.xls*") Set TMP = Workbooks(buf).Sheets("testdata").Range("A1").Value Do While buf <> "" cnt = cnt + 1 Cells(cnt, 1) = buf Cells(cnt, 2) = FileDateTime(Path & buf) Cells(cnt, 3) = TMP buf = Dir() Loop End Sub ------------------------------------------------------ エラーになる箇所は Set TMP = Workbooks(buf).Sheets("testdata").Range("A1").Value のところです。 このプログラムで何をしたいかと言いますと DドライブのExcel>sample というフォルダの中にある ・すべてのエクセルブック名(ファイル数は3個)と、 ・そのブックの作成日時と、 ・testdataというシート(各ブックに必ずあるシートです)のセルA1に入っている値 を実行ファイルのSheet1に書き出す、 というものです。 プログラムの実行ファイルはExcelフォルダ直下にあります。 どこが問題でエラーになっているのか分かりません。 ご指南よろしくお願いします。   

  • エクセルVBAで範囲を変数で設定する方法?

    Dim i As Integer For i = 1 to 50 とした場合、 セルであれば Sheets("Sheet2").Cells(i, 2).Value = Sheets("Sheet1").Cells(i, 2) のように変数を使えますが、範囲に使う場合にはどう書けばいいのでしょうか? 例えば、 Sheets("Sheet2").Range("A1:G1").Value = Sheets("Sheet1").Range("A1:G1") のような式で、行数を変数にする場合です。 よろしくお願いします。

  • VBAのCopyコマンドについて

    エクセルVBAでシート3のRangeの値をからシート2のRangeへデータをコピーしようとしているのですが Sheets(3).Range("B3:B100").Copy _ Sheets(2).Range(Cells(3, col2 - 1), Cells(100, col2 - 1)) がうまくいって、 Sheets(3).Range(Cells(2, col1), Cells(100, col1)).Copy _ sheets(2).Range(Cells(2, col2), Cells(100, col2)) が何故、オブジェクト定義エラーになってしまうのがわかりません。 col1、col2は列の変数です。 よろしくお願いします。

  • excelで別シートのセルを選択(VBA)

    どなたか教えてください。 シートXのB1に行番号 シートXのB2に列番号 が記載されていたとして、 別シート(Y)の、上記で指定したセルを選択する(フォーカスを移動する方法)を教えてください。 シート(X)   A   B   C  1 行  25  2 列  2  シート(Y)   A   B   C  1 2   ::::::: 24 25   (ここ) 以下のように書いても、最後の行でエラーになってしまいます。  行番号 = Sheets("X").Cells(1, 2).Value  列番号 = Sheets("X").Cells(2, 2).Value  Sheets("Y").Select  Range(Cells(行番号, 列番号)).Select

  • Excel-VBA rangeプロパティの使い方について

    Excel-VBA rangeプロパティの使い方について VBA初心者です。いろいろ調べたのですが、分からないので教えてください。 ThisWorkbookのSheet1のA1セルに、aというファイルのaというシートの特定のセルの値をコピーしたいです。 コピーする値のセルは、ThisWorkbookで入力した値を基に変数で記述したいです。 例えば、ThisWorkbookのSheet1のC2セルに「D1」と記載していたとして、その値を変数として設定して、最終的にaというファイルのaというシートの「D1」セルをThisWorkbookのA1セルに貼り付けるのが目的です。 この場合の、下記のhensuu = の設定方法について、ご教授願います。 hensuu = ThisWorkbook.Sheets("Sheet1").Range(“A1”)= Workbooks(a).Sheets(a).Range(hensuu)

  • VBAでのエラーです・・。

    最近VBAマクロを本を片手に勉強しています。シートを選択するVBAを作っていて次のような記述ができないのか考えています。 dim A as String A = "sheet2,sheet3" Sheets(Array(A)).select とやると、Arrayの行で「インデックスが・・・」というエラーで落ちます。Arrayを変数で指定することができないのですが・・。なにか記述に問題があるのでしょうか?(変数Aに"sheet2", "sheet3"と値が入るようにしても結果はNGでした・・。) 宜しくお願いします。

  • エクセルVBAで。

    お世話になります。 VBA初心者です。 (初心者でもないのですが、しばらく遠ざかっていました。) エクセルVBAの記述内容をコピーし、 エクセルの通常のシートへ貼り付けした際、 記述上「’」で始まる文字は緑色が付いていますが、 通常のシートへ貼り付けした際、黒字になってしまいます。 そこで、下記の様なVBAを記述し、貼り付け後に、 「’」から始まる文字を緑色に着色しようと試みましたが (やはり)うまくいきませんでした。 エクセル関数なんかも織り交ぜたおかしな記述だと思いますが 何となくやりたい事が伝わって頂けるかと思うのですが、 どう修正したら出来ますでしょうか。 ご教授下さいます様、宜しくお願いいたします。   記 Sub 色() Dim y As Integer Dim x As Integer Dim a As Integer mysheet = ActiveSheet.Name For y = 1 To 10 x = Sheets(mysheet).Cells(Rows.Count, y).End(xlUp).Row a = 0 Do Until a > x a = a + 1 If Right(Cells(y, a), 1) = "'" Then Cells(y, a).Select Selection.Font.ColorIndex = 10 End If Loop Next End Sub

  • VBA 印刷範囲設定がうまくいかない

    変数cntに値を代入し印刷範囲が変わるという事を、以下のコードで実行しようとしています。 Sub Macro1() cnt = 9 Sheets("A").Activate 範囲 = Sheets("A").Range(Cells(1, 1), Cells(33, cnt + 1)) ActiveSheet.PageSetup.PrintArea = 範囲 上記のコードですと、シート「A」のセルA1~J33までが印刷範囲になると思ったのですが、実行すると全く関係ないセルまで印刷範囲になってしまいます。 「A」シートには罫線やデータが入力されているセルが他にもあり、どうやらそれらのセルも同じく印刷範囲とされてしまっているようなのです。(例えばK列に罫線が引いてあり、セルに色がついているとK列まで印刷範囲になる) Sheets("A").Range(Cells(1, 1), Cells(33, cnt + 1)).select とすれば、望みどおりのセル範囲A1~J33がきちんと選択されるのですが、印刷範囲ではなぜこのようなことになってしまうのでしょうか。

専門家に質問してみよう