.text、.value、および.value2の違いは何ですか?


180

スクリプトについては助けを求めていませんが、説明のために質問します。最近、Excelで多くのVBスクリプトを作成しているので、この質問ではExcelについて言及しています。.text、.value、および.value2の違いは何ですか?いつtarget.text、target.value、target.value2を使用すればよいですか?value2オプションを使用したことはありませんが、それが何のために使用されているのかを知りたいのですが。

場合によっては、.textを使用するとエラーが発生し、セル内のテキストをチェックまたは操作するだけのときに.valueを使用する必要があります。次に、.valueを使用する必要があると思うとき、エラーが発生し、.textを使用する必要があります。通常は問題なく受け入れるか、または問題なく受け入れますが、場合によっては違いが生じることもあります。これにはいくつかの論理が必要なのはわかっていますが、理解できないようです。

また、.textや.valueを指定せずにそのままにしておくと、最初は機能しますが、最終的に誰かが何かを行うと、スクリプトでエラーが発生するため、常に.somethingを使用することをお勧めします。私は私が求めているのは、誰かが私に、それぞれを適切に使用する方法といつ使用する必要があるかについて、ある種のガイドライン、経験則を与えることができるかどうかだと思います。

説明してくれてありがとう。私はそれをよく理解している。どちらも良い説明です。以下は、機能する私のコードのいくつかの小さな例です。target.textにすべきだと思いましたが、エラーになるので、target.valueを使用するとうまくいきました。

If LCase(Target.Value) = LCase("HLO") And Target.Column = 15 Then
    Target.Value = "Higher Level Outage"
End If

valueまたはvalue2について考えるとき、特にあなたが提供した回答の後で、それらは数値にのみ使用されるべきだと思うので、私はまだ少し混乱しています。ただし、私の例では、厳密にテキストについて話しています。これは、スクリプトが参照するテキストの多くです(セル内のテキストであり、数値ではありません)。


LCaseは引数に文字列を必要とするため、Target.Valueが文字列に強制変換できない場合、LCase(Target.Value)は失敗します。私の回答に従って、最初にVarTypeを確認する必要があります。また、代わりにUCaseを使用して、「HLO」と直接比較することもできます。リテラルの操作にはあまり意味がありません。
バトシェバ2013年

VarTypeについての情報をありがとう。このためのLCaseまたはUCaseに関しては、どちらを使用してもかまいません。それをhloと入力する人もいれば、HLOと入力する人もいます。私が見たところ、小文字がより頻繁に使用されているように見えました。
クリス

回答:


238

.Textセルの画面に表示される内容を表す文字列を提供します。####を取得する可能性があるため、通常、.Textを使用することはお勧めできません。

.Value2 セルの基本的な値を提供します(空、文字列、エラー、数値(double)、ブール値のいずれか)

.Value .Value2と同じですが、セルが通貨または日付としてフォーマットされている場合は、VBA通貨(小数点以下が切り捨てられる場合があります)またはVBA日付が表示されます。

.Valueまたは.Textを使用することは、セルから実際の値を取得できず、.Value2よりも遅いため、通常はお勧めできません。

より広範な議論については、私のテキストvs値vs値2を参照してください


6
おそらくFormatを使用して、数値を文字列に変換する方法を制御します
Charles Williams

2
これが別の質問ではないことを願っていますが、デフォルトは何ですか?OPは、text / value / value2を除外することは問題があると漠然と主張していますが、確かにデフォルトの1つになっていますか?
マーティンF

3
申し訳ありませんが、このooooooldポストを覚ますために、私は強制することの利点を参照することができないよDateDouble(使用して.Value2何が必要時には)ですDate。あなた.Valueが値を.Value2見ているときよりも優先されるべきではありませんDateか?リンクされた記事もそれを非常に明確にしません。変換がないのでパフォーマンス?もちろん、VBAコードがで動作しているDate場合、暗黙的または明示的に変換を実行すると、そのエッジが失われます... (コンテキスト-自由に重み付けしてください)
Mathieu Guindon 2017

2
@ Mat's Mug-問題はExcelに真の日付データ型がないことです-Excelの日付と時刻は、ユーザーが適用または変更した日付、時刻、通貨、または単に数。したがって、ValueはExcelをVBA日付に強制的に変換していますが、Value2は強制を行っていません...日付を倍精度に強制変換する日付については、コードが変更可能な形式に依存していることをコードが理解している限り、おそらくダメージはありません。そしてどちらか一方の短所-私たちが本当に必要なのは、この問題を回避するためのよりネイティブなExcelデータ型です。
チャールズウィリアムズ

2
タイプ変換なしで(たとえば、テキストとして格納されている数値を数値に変換せずに)セル値を別のセルと等しく設定したい場合は、次のようにします Format$(Range.Value2, Range.NumberFormat)
ChrisB

55

以下のMSDN情報を除いて、バトシェバの最初の回答フォームを除きます。

.Value
.Value2
.Text

これらのテーブルを分析して、分析されたプロパティ間の違いをよりよく理解することができます。

ここに画像の説明を入力してください


4
@Chris、.Valueテキストと数値の場合は常に標準プロパティとして使用します。.Value2日付や数字を考えるときに使います。また.Text、セル/範囲にあるもののフォーマットを維持する必要がある場合は、常に使用してください。だから、あなたの質問の例が正しければ!
Kazimierz Jawor 2013年

1
なぜ日付が10:12から10:05に変わったのですか?打ち間違え?
カトリン

1
結果を生成してからスクリーンショットを作成するまでの時間の経過だと思います
Kazimierz Jawor 2018年

25

target.ValueあなたにVariantタイプを与えます

target.Value2あなたにもVariantタイプを与えますが、a Dateはa に強制されますDouble

target.Textを型変換しようとしString、基になるものVariantString型に強制できない場合は失敗します

最も安全なことは次のようなものです

Dim v As Variant
v = target.Value 'but if you don't want to handle date types use Value2

VBA.VarType(v)明示的な強制を試みる前に、を使用してバリアントのタイプを確認してください。


11

C#の規則について。たとえば、2014-10-22のように、日付を含むセルを読んでいるとしましょう。

使用する場合:

.Text、画面のワークブックに表示されるように、日付のフォーマットされた表現を取得します:
2014-10-22。このプロパティのタイプは常にstringですが、常に満足できる結果が返されるとは限りません。

.Value、コンパイラは日付をDateTimeオブジェクトに変換しようとします:{2014-10-22 00:00:00}おそらく日付を読み取る場合にのみ役立ちます。

.Value2、セルの実際の基本的な値を提供します。日付の場合、それは日付のシリアル:41934です。このプロパティは、セルの内容に応じて異なるタイプを持つことができます。ただし、日付のシリアルの場合、タイプはdoubleです。

あなたが取得し、いずれかのセルの値を格納することができますのでdynamicvarまたはobject値は常にあなたが作用しなければならないこと生来のタイプのいくつかの並べ替えを持っていることが、注意してください。

dynamic x = ws.get_Range("A1").Value2;
object  y = ws.get_Range("A1").Value2;
var     z = ws.get_Range("A1").Value2;
double  d = ws.get_Range("A1").Value2;      // Value of a serial is always a double

2

.Textは、フォーマットされたセルの表示値です。.Valueは、セルの値であり、日付または通貨インジケーターで補強されている可能性があります。.Value2は、無関係な情報を取り除いた生の基本値です。

range("A1") = Date
range("A1").numberformat = "yyyy-mm-dd"
debug.print range("A1").text
debug.print range("A1").value
debug.print range("A1").value2

'results from Immediate window
2018-06-14
6/14/2018 
43265 

range("A1") = "abc"
range("A1").numberformat = "_(_(_(@"
debug.print range("A1").text
debug.print range("A1").value
debug.print range("A1").value2

'results from Immediate window
   abc
abc
abc

range("A1") = 12
range("A1").numberformat = "0 \m\m"
debug.print range("A1").text
debug.print range("A1").value
debug.print range("A1").value2

'results from Immediate window
12 mm
12
12

セルの値を処理している場合、生の.Value2の読み取りは.Valueまたは.Textよりもわずかに高速です。エラーを見つけている場合、.Textは#N/Aテキストのようなものを返し、文字列と比較できます。.Valueと.Value2は、返された値を文字列と比較するのを妨げます。データにカスタムセルの書式を適用している場合は、レポートを作成するときに.Textを選択することをお勧めします。


0

好奇心から、私はに対してどのようにValue実行されるかを見たかったValue2。同様のプロセスを約12回試しても、速度に大きな違いは見られなかったため、常にを使用することをお勧めしValueます。以下のコードを使用して、さまざまな範囲でいくつかのテストを実行しました。

パフォーマンスに反することがあれば、投稿してください。

Sub Trial_RUN()
    For t = 0 To 5
        TestValueMethod (True)
        TestValueMethod (False)
    Next t

End Sub




Sub TestValueMethod(useValue2 As Boolean)
Dim beginTime As Date, aCell As Range, rngAddress As String, ResultsColumn As Long
ResultsColumn = 5

'have some values in your RngAddress. in my case i put =Rand() in the cells, and then set to values
rngAddress = "A2:A399999" 'I changed this around on my sets.



With ThisWorkbook.Sheets(1)
.Range(rngAddress).Offset(0, 1).ClearContents


beginTime = Now

For Each aCell In .Range(rngAddress).Cells
    If useValue2 Then
        aCell.Offset(0, 1).Value2 = aCell.Value2 + aCell.Offset(-1, 1).Value2
    Else
        aCell.Offset(0, 1).Value = aCell.Value + aCell.Offset(-1, 1).Value
    End If

Next aCell

Dim Answer As String
 If useValue2 Then Answer = " using Value2"

.Cells(Rows.Count, ResultsColumn).End(xlUp).Offset(1, 0) = DateDiff("S", beginTime, Now) & _
            " seconds. For " & .Range(rngAddress).Cells.Count & " cells, at " & Now & Answer


End With


End Sub

ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.