パスワードを忘れた? アカウント作成
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

Excelがマクロ実行中に突然落ちる」記事へのコメント

  • by chi (11062) on 2019年04月11日 20時35分 (#3597383) 日記

    ループ内にDoEventsを入れてみるとか

    • > Cells(1,1).End(xlDown).Row

      これはforで都度計算するのではなく、事前に求めて変数に入れておいたほうがいいような。
      あと、A列が空だったら、最終行までの100万回ループになってひどいことになりそう。

      親コメント
      • え、vba都度評価するんですか
        いやforなら普通か。
        何となく最初に評価してn to mで決めうちで終わりかと思いこんでました。デバッガのステップ実行も最初だけ通ってあとは本体のみで通らないので。
        そのうち確認しよう、ループ内でインクリメントしてみたりとか。

        空列想定はそれはそうなんですが、シート末尾から上にというのも面倒だし、無視しています。
        使うのはほぼ自分だけだし、という言い訳。

        親コメント
        • 都度計算していると言うか都度インスタンス化してんね
          まあどっかに定数で最大行数が定義してあるからそこを参照すりゃいい気もするけど
          単に動的に設定されたiの型のサイズが最大行数よりも小さいから落ちてるだけな気がする

        • by Anonymous Coward

          whileでも毎回評価するでしょ…

          • なんというか、文法としてvbaのForは
            For [var] = [int] To [int]
            なイメージだったんです。
            [int]部分は数値リテラル。[var]は変数。みたいな。
            末端としてループ処理にはいる前に一度だけ評価が行われ数値になり、Forステートメントの評価段階では数値リテラルと同質な、単なる数値になっているようなイメージが。
            完全に思いこみです。
            言われてみれば他言語のループ構文は都度評価が基本ですよねぇ。そのためにパフォーマンス気にして代入したりするし。

            親コメント
      • by Anonymous Coward

        >A列が空だったら、最終行までの100万回ループになってひどいことになりそう。
        私はUsedRange.row+UsedRange.rows.count
        を取得しておいて、そこまでのループって事をよくやりますw

        これだと一番左が空でもOK

    • ええ、そんな対応になりますよね…。
      私の場合だと、ループ内でなくループ前におくと良いようです。
      するとその直後のループでは落ちなくなる。
      そしてその後のループで落ちる。

      親コメント
      • なんとなく、リソース不足で落ちるときに似ているような。

        シートやセルの参照を参照変数に入れた後、
        たしかexcelvbaって要らなくなったらnothingを代入するって後処理しないと、参照不要でもメモリ上に残る場合があった気が。
        で、同じ名前で再度宣言したときはまた、新しくメモリ確保して。。で落ちる。

アレゲは一日にしてならず -- アレゲ見習い

処理中...