アカウント名:
パスワード:
ループ内にDoEventsを入れてみるとか
> Cells(1,1).End(xlDown).Row
これはforで都度計算するのではなく、事前に求めて変数に入れておいたほうがいいような。あと、A列が空だったら、最終行までの100万回ループになってひどいことになりそう。
え、vba都度評価するんですかいやforなら普通か。何となく最初に評価してn to mで決めうちで終わりかと思いこんでました。デバッガのステップ実行も最初だけ通ってあとは本体のみで通らないので。そのうち確認しよう、ループ内でインクリメントしてみたりとか。
空列想定はそれはそうなんですが、シート末尾から上にというのも面倒だし、無視しています。使うのはほぼ自分だけだし、という言い訳。
都度計算していると言うか都度インスタンス化してんねまあどっかに定数で最大行数が定義してあるからそこを参照すりゃいい気もするけど単に動的に設定されたiの型のサイズが最大行数よりも小さいから落ちてるだけな気がする
whileでも毎回評価するでしょ…
なんというか、文法としてvbaのForはFor [var] = [int] To [int]なイメージだったんです。[int]部分は数値リテラル。[var]は変数。みたいな。末端としてループ処理にはいる前に一度だけ評価が行われ数値になり、Forステートメントの評価段階では数値リテラルと同質な、単なる数値になっているようなイメージが。完全に思いこみです。言われてみれば他言語のループ構文は都度評価が基本ですよねぇ。そのためにパフォーマンス気にして代入したりするし。
>A列が空だったら、最終行までの100万回ループになってひどいことになりそう。私はUsedRange.row+UsedRange.rows.countを取得しておいて、そこまでのループって事をよくやりますw
これだと一番左が空でもOK
ええ、そんな対応になりますよね…。私の場合だと、ループ内でなくループ前におくと良いようです。するとその直後のループでは落ちなくなる。そしてその後のループで落ちる。
なんとなく、リソース不足で落ちるときに似ているような。
シートやセルの参照を参照変数に入れた後、たしかexcelvbaって要らなくなったらnothingを代入するって後処理しないと、参照不要でもメモリ上に残る場合があった気が。で、同じ名前で再度宣言したときはまた、新しくメモリ確保して。。で落ちる。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
UNIXはシンプルである。必要なのはそのシンプルさを理解する素質だけである -- Dennis Ritchie
違ったらすみません (スコア:2)
ループ内にDoEventsを入れてみるとか
Re:違ったらすみません (スコア:1)
> Cells(1,1).End(xlDown).Row
これはforで都度計算するのではなく、事前に求めて変数に入れておいたほうがいいような。
あと、A列が空だったら、最終行までの100万回ループになってひどいことになりそう。
Re:違ったらすみません (スコア:1)
え、vba都度評価するんですか
いやforなら普通か。
何となく最初に評価してn to mで決めうちで終わりかと思いこんでました。デバッガのステップ実行も最初だけ通ってあとは本体のみで通らないので。
そのうち確認しよう、ループ内でインクリメントしてみたりとか。
空列想定はそれはそうなんですが、シート末尾から上にというのも面倒だし、無視しています。
使うのはほぼ自分だけだし、という言い訳。
俺たちゃ金持ちだー気にすんなー (スコア:0)
都度計算していると言うか都度インスタンス化してんね
まあどっかに定数で最大行数が定義してあるからそこを参照すりゃいい気もするけど
単に動的に設定されたiの型のサイズが最大行数よりも小さいから落ちてるだけな気がする
Re: (スコア:0)
whileでも毎回評価するでしょ…
Re:違ったらすみません (スコア:1)
なんというか、文法としてvbaのForは
For [var] = [int] To [int]
なイメージだったんです。
[int]部分は数値リテラル。[var]は変数。みたいな。
末端としてループ処理にはいる前に一度だけ評価が行われ数値になり、Forステートメントの評価段階では数値リテラルと同質な、単なる数値になっているようなイメージが。
完全に思いこみです。
言われてみれば他言語のループ構文は都度評価が基本ですよねぇ。そのためにパフォーマンス気にして代入したりするし。
Re: (スコア:0)
>A列が空だったら、最終行までの100万回ループになってひどいことになりそう。
私はUsedRange.row+UsedRange.rows.count
を取得しておいて、そこまでのループって事をよくやりますw
これだと一番左が空でもOK
Re:違ったらすみません (スコア:1)
ええ、そんな対応になりますよね…。
私の場合だと、ループ内でなくループ前におくと良いようです。
するとその直後のループでは落ちなくなる。
そしてその後のループで落ちる。
落ちる場所近辺に原因があるとは限らない (スコア:0)
なんとなく、リソース不足で落ちるときに似ているような。
シートやセルの参照を参照変数に入れた後、
たしかexcelvbaって要らなくなったらnothingを代入するって後処理しないと、参照不要でもメモリ上に残る場合があった気が。
で、同じ名前で再度宣言したときはまた、新しくメモリ確保して。。で落ちる。