4

評価の使用が何であるかを理解しようとして、オンラインで検索してきました。msdn から得られるのは、「適用対象リスト内のオブジェクトを返す式」です。これが何を意味するのかわかりません。

私が質問する理由は、与えられたコードの一部を論理的に理解しようとしているからです。なぜこのように書かれているのですか?より伝統的なアプローチの代わりに評価を使用する利点は何ですか? ネストされた関数の長い行の正しい構文は何ですか?

これが私のコード例です:

With Range("B1", Cells(Rows.Count, "B").End(xlUp))
        .Value = Evaluate("Index(If(Left(Trim(" & .Address & "),1)=""."",Replace(Trim(" & .Address & "),1,1,""""),Trim(" & .Address & ")),)")
End With

誰かがこれを分解して意味を理解するのを手伝ってくれますか? 先頭のピリオドを削除し、列 b のすべてのセルの余分なスペースを取り除くことになっています。私の問題は、2回実行した場合にのみ機能することです。これを理解できれば、それを操作して正しく機能させることができるかもしれません。

追加のクレジットとして、同じ範囲を通過してすべてのダッシュ ("-") を削除したい場合、このようなステートメントを作成するにはどうすればよいですか?

本当に学びたいです。どんな助けでも感謝します。

4

1 に答える 1

3

OKここに行きます:

Evaluateこのコンテキストで関数を評価するようにアプリケーションに指示します。

関数は、範囲全体に適用されるため、"Index(If(Left(...いくつかの動的コンポーネント ( ) を含む文字列連結です。.Address

Range("B1", Cells(Rows.Count, "B").End(xlUp))

これが実際に行うことは、その範囲内の各セルの数式を評価することですが、数式の評価値を各セルに書き込むだけです。

範囲を数式で埋めてから、その範囲にコピー + 特殊な貼り付け (値のみ) を実行することも同等です。これは、メモリと時間のかかるプロセスの点で、特により大きな範囲のオブジェクトの場合、明らかにより高価です。

私は個人的にこのアプローチを好みませんが、それは主に私の個人的な好みの問題です。

この場合の利点は、1 つのステートメントで 10 個のセルまたは 10,000 個のセルまたは 1,048,576 個のセル (Excel 2007 以降) になる可能性がある、セル範囲全体を埋めていることです。

別の方法はFor/Next、メモリ内の配列に対してループを実行し、結果の配列をワークシートに書き込んでいる場合でも、ループを実行することです (これはメモリの点で高価であるため、大きな範囲では低速です)。このコードのように1 つのステートメントを使用することの優雅さ。

于 2013-09-05T01:33:44.140 に答える