5

次のスニペットを検討してください。同じ数式を 2 つのセルに書き込みA1A2

Sub Main()
    With Range("A1")
        .Formula = "=1+1"
    End With

    With Range("A2")
        .Formula = "=1+1"
        .Value = .Value
    End With
End Sub

2番目のwithブロックは.Value = .Value式を計算/実行するため、式は式バーから消えます。補助的な参照として、数式バーから数式を非表示にするを参照してください。

.Value = .Value は数式をバーから非表示にします

次に、別の with ブロックを追加します

With Range("A3")
     .Formula = "=1+1"
End With
Range("A4") = Evaluate(Range("A3").Formula)

数式をセルに追加すると、A3その新しいセルの数式がEvaluated()別のセルになりA4ます。示されているように結果

セルの式を評価する

上記のようなものはそれを示して.Value = .ValueおりEvaluate()、同じことをしていると思います。

ただし、以下のコードは、前述の 2 つのアプローチを使用して、閉じたワークブックから値を引き出します。book9.xlsmこの例ではhello、セル A1 に入力するワークブックを作成しました。の値を取得するものですbook9.xlsmA1コードを検討する

Sub PullValue()
    With Range("A1")
        .Formula = "='C:\Users\admin\Desktop\[book9.xlsm]Sheet1'!A1"
    End With

    With Range("A2")
        .Formula = "='C:\Users\admin\Desktop\[book9.xlsm]Sheet1'!A1"
        .Value = .Value
    End With

    Range("A3").Formula = "='C:\Users\admin\Desktop\[book9.xlsm]Sheet1'!A1"
    Range("A4") = Evaluate(Range("A3").Formula)
End Sub

最初のwithブロックは、 からセルのA1値に数式を入れbook9.xlsmます。実行されるため、プルされた値は ですhelloが、数式バーには実際の値が表示さ.FormulaれますC:\...

2 番目のwithブロックは、.Value = .Value上で示したように を使用して数式を評価し、数式を結果に置き換えることで非表示にします。

withRange("A3") は最初のブロックと同じです。

そして今(A4)最初の例(この質問の最初のスニペット)と同じ原則に従ってEvaluate()式を作成していますが、今回は機能しません。

アクティブ化されたすべてのセルの値とそれぞれの数式バーを確認してください

結果

.Value = .Valueしたがって、 が に等しいとは言えませんEvaluate()

Evalutate()のコメントは、数式で使用できると述べています。しかし、私が示した例では、それは機能しません。

Evaluate() msdn

Evaluate()式は制限されたパラメータとして使用されていますか? Evaluate は非常に強力だといつも思っていましたが、.Value = .Value実際にはさらに強力であることがわかりました。それらは非常に似ていますが、どういうわけか異なります(ただし、この例で選択した式が制限または制限されている可能性があるため、私のせいである可能性があると考えています)。私は、それらが同時に似ていると同時に異なっている理由を示したと思います. それはまだ 50%/50% のようなもので、それらが同じかどうか正確にはわかりません。誰かがここに何が欠けているかを説明できれば素晴らしいでしょう。

4

4 に答える 4

8

.value と Evaluate は同じではありません。
Excel は、使用されているセルごとに値と数式文字列の両方を保持しており、Range.Value と Range.Formula を使用して、これらの両方を個別に取得できます。
Application.Evaluate を使用して文字列を評価すると、文字列はアクティブなワークシートの数式として評価されます (したがって、実際には Application.Evaluate ではなく Worksheet.Evaluate を使用する方が適切であり、その方が高速です)。
Rng1.Value=Rng2.Value を使用すると、値が Rng2 から Rng1 にコピーされ、Rng1 の式が上書きされます。
Rng1.Value=Evaluate(rng2.Formula) を使用すると、Excel に rng2 から数式文字列を取得して評価し、結果を Rng1 に返すように要求します。

Evaluate メソッドは、セル内の数式とまったく同じようには機能しません。注意が必要な多くの「癖」があります (外部の閉じたブックを参照する数式では機能しないという事実を含む): myを参照してください。詳細についてはブログ投稿
また、一般的には .Value ではなく .Value2 を使用することをお勧めします。詳細については、Value と Value2 を参照してください。

于 2013-07-23T10:25:06.923 に答える
0

Evaluate は関数であり、関数の後にドット (.) を付けて使用するもので、プロパティとして呼び出されます。したがって、「.Value」、「.Formula」、「.Text」は、ここで使用している Range のプロパティです。

これら 2 つのことを混同しないでください。

関数は入力を受け取り、その入力変数を使用してアクションを実行し、結果を返します。また、構成されているデータ型で機能します。

.value は、データ型に依存しない汎用プロパティです。文字列、数値、浮動小数点数、または何でもかまいません。

そのため、1 からエラーが発生する可能性があり、他の作業はまったく問題ありません。

于 2013-07-22T20:12:21.213 に答える