人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

VBAの配列について教えてください。

練習で、あるシートのセル範囲を指定して、配列に格納し、
その内容を別シートのセルに書き出す事をやりたいのですが、
途中でインデックスが有効範囲にありませんというエラーが出ます。

Dim hairetsu As Variant
'元データを配列に格納
hairetsu = .Range("A2", .Range("A" & Rows.Count).Resize(, 5).End(xlUp))
'配列の情報を入れる
For i = 0 To UBound(hairetsu) - 1
.Cells(i +1, 1) = hairetsu(i + 1, 1) →OK
.Cells(i +1, 2) = hairetsu(i + 1, 2) →「インデックスが有効範囲にありません」
.Cells(i +1, 3) = hairetsu(i + 1, 3)
Next i

どこがダメなんでしょうか?

●質問者: 匿名質問者
●カテゴリ:コンピュータ
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● 匿名回答1号

配列のインデックスは0から始まるのに対し
CellsなどのExcelオブジェクトは1から始まるためと思われます。


匿名質問者さんのコメント
ありがとうございます。 いつも、VBAやる時は、0から、1から、問題にやられます。

2 ● 匿名回答2号

i + 1 しているのがダメ


匿名回答2号さんのコメント
Cells(i +1, 2) = hairetsu(i , 2) といったようにする。

匿名質問者さんのコメント
ありがとうございます。 やってみたのですが、下記のように、エラーが出る箇所が繰り上がりました… For i = 0 To UBound(hairetsu) - 1 .Cells(i +1, 1) = hairetsu(i, 1) →「インデックスが有効範囲にありません」 .Cells(i +1, 2) = hairetsu(i, 2) .Cells(i +1, 3) = hairetsu(i, 3) Next i う?ん、どうしてなんでしょう…

匿名回答2号さんのコメント
>「インデックスが有効範囲にありません」 このエラーは 配列外の箇所を指定したために おきるエラーです。

匿名質問者さんのコメント
色々とありがとうございます!またなにかありましたらお願いします。

3 ● 匿名回答3号
ベストアンサー

本質的には、他の回答者さんが指摘されている様な
後半部分の問題ではありません。試しに

.Range("A" & Rows.Count).Resize(, 5).End(xlUp).Select

という命令を"hairetsu=…"の直前に挿入&ブレイクポイントを設定した上で
実行し、ワークシート上の選択範囲がどうなるかご確認下さい。
貴方の意図されていらっしゃる結果とはきっと違うはずです。
それと意味を理解して用いていらっしゃればよいのですが
念のために指摘しておきますと、
UBound関数の第二引数で、添字最大値を得たい次元を指定できますが
ご質問文のコードでは省略されており、この場合は第一次元目になります。
つまり元となるセル範囲の行方向のサイズです。
それと、Option Base 0/1も
明示的に指定されておかれた方が良いのではないでしょうか。


匿名質問者さんのコメント
おお!ありがとうございます。 凡ミスというか、全然選べてないじゃん…でした。 最初のは、A列のみしか選択出来てない状態でした。 A列をRows.Count.End(xlUp)した後に.Resize(, 5)ですね。 iは0から始め、指定はi+1でうまくいきました。 Dim hairetsu As Variant '元データを配列に格納 hairetsu = .Range("A2", .Range("A" & Rows.Count).End(xlUp)).Resize(, 5) '配列の情報を入れる For i = 0 To UBound(hairetsu) - 1 .Cells(i +1, 1) = hairetsu(i + 1, 1) →OK .Cells(i +1, 2) = hairetsu(i + 1, 2) →OK .Cells(i +1, 3) = hairetsu(i + 1, 3) →OK Next i UBound関数の第二引数については、なんとなく知ってるレベルで、 Option Base 0/1 の指定もなんかテキストで見たレベルだったので、 今回は何もしなくてもうまくいきましたが、今後勉強します。

匿名回答3号さんのコメント
UBoundの第二引数については容易に理解できると思います。 例えば、hairetsuに「10行×6列」のセル範囲を代入した場合 (1?10, 1?6)の大きさにhairetsu配列がリサイズされると同時に 値が書き込まれます。UBoundは各次元の添字の最大値ですから UBound(hairetsu, 1)=10、UBound(hairetsu, 2)=6になります。 Option Base 0/1を指定しない場合、かつ、配列変数の宣言時に 各次元の添字範囲の始点を明示的に宣言しない場合、始点は「0」になります。 Option Base 0と指定した場合と同様です。 例) Dim Hairetsu(5) → 添字の範囲 0(=LBound) ? 5 (=UBound) Option Base 1の指定があれば 1?5 の範囲になります。

匿名質問者さんのコメント
ご丁寧にありがとうございます!勉強になります。 今まで色々なことをfor?nextで処理していたのですが、 配列を使いこなせるようになると、やれることが広がりますね!!
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ