質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

3回答

402閲覧

Ecelvbaでデータを配列ないでforを用いて計算

Apoll047

総合スコア12

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/06/12 02:28

Excel 2013 VBAについての質問です。
シートのA1からD10までの範囲をDataTBという配列に格納してその中のデータをforを使って計算させるというものを作成しました。そのなかで以下のコーであると最後に一番最後のiの時なぜか1増えるのはなぜでしょう?

VBA

1``` 2Dim LR As Long '最終行の取得 3 LR = ws1.Cells(Rows.Count, 4).End(xlUp) 4Dim dataTB As Variant 5 dataTB = ws1.Range(ws1.Cells(1, 1), ws1.cels(LR, 4)) 6’シートの最終行が不定のためLRを使用 7 8Dim i As Long 9 For i = 2 To LR '1行目はデータの題目を入れるため開けている 10 dataTB(i, 4) = dataTB(i, 1) + dataTB(i, 2) 11 Next i 12 'i=LRのときにLRが(LR+1)になってしまう。 13 'これによりLR行までしか配列がないため「インデックスがありません。」となってしまう。 14 15``` 16上記のようになってしまう 17例えばLR=10ならばi=10のとき配列dataTB(10,4)がdataTB(11,4)になる 18要は配列最後のiが増えるのはなぜか 19どうすれば治せるのかを知りたいです。 20(個人的に自身の配列に対する知識不足な気がしますが、、)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

vba

1Dim LR As Long '最終行の取得 2LR = ws1.Cells(Rows.Count, 4).End(xlUp)

これだとD列の最終行の行番号ではなく、最終行のセルの値が代入されます。
最終行の行番号を取得するなら、下記でないと。

vba

1Dim LR As Long '最終行の取得 2LR = ws1.Cells(Rows.Count, 4).End(xlUp).Row

vba

1Dim i As Long 2For i = 2 To LR '1行目はデータの題目を入れるため開けている 3 dataTB(i, 4) = dataTB(i, 1) + dataTB(i, 2) 4Next i 5'i=LRのときにLRが(LR+1)になってしまう。 ←なりません。

For Nextを抜けてもLRの値が変化することはありません。(iは変化しますが。)
D列の最終行のセルの値がたまたま(LR+1)だったのでしょう。

おまけ

セル範囲を配列に格納したとき、セル番地と配列のインデックスが一致するとは限りません。
(今回はセル範囲が1行目から始まってますのでまたまた一致しますが。)

LBound、UBound 関数でインデックスの最小値と最大値を取得したほうがいいでしょう。

サンプルコード

vba

1Public Sub test() 2 Dim ws1 As Worksheet 3 Set ws1 = ActiveSheet 4 5 Dim LR As Long '最終行の取得 6 LR = ws1.Cells(Rows.Count, 4).End(xlUp).Row 7 Dim dataTB As Variant 8 dataTB = ws1.Range(ws1.Cells(2, 1), ws1.Cells(LR, 4)).Value '1行目はタイトルなので配列に含めない 9 10 'セルの行番号と配列のインデックスが一致するとは限らないので 11 'LBound関数で配列の最終インデックスを取得した方かいい。 12 Dim i As Long 13 For i = LBound(dataTB) To UBound(dataTB) '1行目はデータの題目を入れるため開けている 14 dataTB(i, 4) = dataTB(i, 1) + dataTB(i, 2) 15 Next i 16 17 '更新した配列を元に戻す 18 ws1.Cells(2, 1).Resize(UBound(dataTB), UBound(dataTB, 2)).Value = dataTB 19End Sub

投稿2021/06/12 06:24

編集2021/06/12 06:46
hatena19

総合スコア33699

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

VBA

1LR = ws1.Cells(Rows.Count, 4).End(xlUp).Row

Sub test() Dim i For i = 1 To 10 Next Debug.Print i '11 End Sub

投稿2021/06/12 04:50

編集2021/06/12 04:53
jinoji

総合スコア4585

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

配列のサイズを1つ大きくすることで解決になるでしょうか。

VBA

1dataTB = ws1.Range(ws1.Cells(1, 1), ws1.Cells(LR + 1, 4)) 2'dataTB = ws1.Range(ws1.Cells(1, 1), ws1.cels(LR, 4))

投稿2021/06/12 02:38

編集2021/06/12 03:04
TanakaHiroaki

総合スコア1063

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Apoll047

2021/06/12 02:52

Emptyが返されてきます。 一応インデックスありなので成立していますがやはりiが1つ増加しています。 この現象の理由を知りたいです。
TanakaHiroaki

2021/06/12 03:08

直接の回答になっていないですが、 For-Next ループ終了後 i = LR +1 となるのは仕様通りです。
Apoll047

2021/06/12 05:37

確かに今思えばその通りですね、、 今気づきました。 このような場合さきほどご教授いただいたように配列の要素を一つ大きくしておけばよろしいのでしょうか?またはそのまま”LR”にしておいてインデックスなしでも問題ないのでしょうか? また空白のセルを配列に格納した場合その配列の要素のは”Empty”という認識でよろしいのでしょうか? 以下サイトを参考にしたのですが配列を使用するのが初めてなものでしてよろしければご教授ください。 https://sugoikaizen.com/excelvba/9_316/
TanakaHiroaki

2021/06/12 06:09

配列の要素を一つ大きくしなくてもjinojiさんの回答で解決するかもしれません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問