匿名質問者
匿名質問者匿名質問者とは「匿名質問」を利用して質問した質問者。
「匿名質問」では、ユーザー名を公開せずに匿名の質問ができます。
詳しくはこちら

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

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

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2012/12/28 12:33:53
  • 終了:2012/12/28 17:12:14

ベストアンサー

匿名回答3号 No.3

匿名回答3号「匿名質問」を利用した質問に回答すると「匿名回答○号」と匿名で表示されます。
「匿名質問」では、ユーザー名を公開せずに匿名の質問ができます。
詳しくはこちら
2012/12/28 13:40:39

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

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

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

他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 の範囲になります。

2012/12/28 15:27:48
匿名質問者

ご丁寧にありがとうございます!勉強になります。
今まで色々なことをfor~nextで処理していたのですが、
配列を使いこなせるようになると、やれることが広がりますね!!

2012/12/28 17:11:45

その他の回答(2件)

匿名回答1号 No.1

匿名回答1号「匿名質問」を利用した質問に回答すると「匿名回答○号」と匿名で表示されます。
「匿名質問」では、ユーザー名を公開せずに匿名の質問ができます。
詳しくはこちら
2012/12/28 12:57:46

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

匿名質問者

ありがとうございます。
いつも、VBAやる時は、0から、1から、問題にやられます。

2012/12/28 15:15:23
匿名回答2号 No.2

匿名回答2号「匿名質問」を利用した質問に回答すると「匿名回答○号」と匿名で表示されます。
「匿名質問」では、ユーザー名を公開せずに匿名の質問ができます。
詳しくはこちら
2012/12/28 13:02:41

i + 1 しているのがダメ

他2件のコメントを見る
匿名回答2号

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

2012/12/28 13:43:53
匿名質問者

色々とありがとうございます!またなにかありましたらお願いします。

2012/12/28 15:13:07
匿名回答3号 No.3

匿名回答3号「匿名質問」を利用した質問に回答すると「匿名回答○号」と匿名で表示されます。
「匿名質問」では、ユーザー名を公開せずに匿名の質問ができます。
詳しくはこちら
2012/12/28 13:40:39ここでベストアンサー

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

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

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

他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 の範囲になります。

2012/12/28 15:27:48
匿名質問者

ご丁寧にありがとうございます!勉強になります。
今まで色々なことをfor~nextで処理していたのですが、
配列を使いこなせるようになると、やれることが広がりますね!!

2012/12/28 17:11:45

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません