10

Excel VBAではRange("A1").Value、ワークシートの範囲A1の基になる値を返す必要があります。しかし、セルがアカウンティングとしてフォーマットされている場合、私は異なる値を取得しています。

セルの実際の基礎となる値を取得するにはどうすればよいですか?

ワークシート

新しいドキュメントを作成し、セルに次の値を入力します。

  • A1:0.00001
  • A2:= A1
  • A3:= A1 = A2

ご想像のとおり、A3の結果はTRUE。次に、小数点以下2桁を使用して、A2のフォーマットをアカウンティングに変更します。A2は現在、を読み取ります$ 0.00が、基になる値はまだ0.00001であるため、A3はまだTRUEです。

VBA

新しいモジュールを作成し、次の関数を追加します。

Function f(addr As String)
    f = Range(addr).Value
End Function

ご覧のとおり、これはオブジェクトのValueメソッドを使用して範囲の値を取得するだけです。Range

ワークシート

ワークシートに戻ります。次の値を入力します。

  • B1:= f( "A1")
  • B2:= f( "A2")
  • B3:= B1 = B2

A1A2は同じ基本値を持ちますが、との方法を使用して計算されたとしても、そうではB1ありB2ません。ValueA1A2

A3( )の式は=A1=A2、との実際の基になる値にアクセスしていA1ますA2。VBAでこれらの値にアクセスするにはどうすればよいですか?

4

2 に答える 2

13

数式を入力した後に書式を追加したので、最初は私にもTRUEが表示されました。

再現するには-B2を再編集します。

基になる値を取得するには、フォーマットを無視しているように見えるVALUE2プロパティを使用する必要があります。

Function f(addr As String)
    f = Range(addr).Value2
End Function
于 2012-04-04T23:58:26.240 に答える
4

小数点以下4桁を超える通貨形式のセルでVBAとValueを使用する際の問題は、Dickのブログのこの投稿で十分にカバーされています。

Excelの書式なしセルに数値を入力すると、その数値はDoubleデータ型に格納されます。その番号をフォーマットするときは、特定の方法で表示しますが、番号は変更しません。たとえば、数値1をコンマスタイルとしてフォーマットすると、1.00になります。基になるデータはまだ1であり、表示方法が異なります。日付形式と通貨形式は、この規則の2つの例外です。

日付または通貨としてフォーマットする場合、実際には(Valueプロパティに格納されている値の)基になるデータ型を変更します。日付形式に関しては、データを変更せずに日付データ型と倍精度データ型を切り替えることができるため、これはセマンティクスです。Currencyデータ型ではそれほど多くありません。Currencyは小数点以下4桁のみをサポートするため、たとえば、小数点以下5桁のDoubleをCurrencyデータ型に詰め込むと、異なる数値になります。

于 2012-04-05T01:57:27.503 に答える