web-dev-qa-db-ja.com

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

私はどんなスクリプトでも助けを求めていません、しかし私の質問は明確化のためです。最近、私は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

私がまだ少し混乱しているのは、私が価値または価値2について考えるとき、特にあなたが提供したあなたの答えの後で、私はそれらが数のために使われるべきだと思うからです。しかし、私の例では私は厳密にテキストについて話しています。それは私のスクリプトが言及していることの多くです(セル内のテキスト、数字以上のもの)。

157
Chris

.Textは、セルの画面に表示されている内容を表す文字列を返します。あなたは####を得ることができるので.Textを使用することは通常悪い考えです。

.Value2はあなたにセルの基本的な値を与えます(空、文字列、エラー、数(ダブル)またはブール値かもしれません)

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

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

より広範な議論については私の テキスト対価値対価値2 を見てください。

210

以下のMSDN情報を除いて、Bathshebaの最初の回答フォームを除く


。値2
。テキスト

分析された特性間の違いをよりよく理解するためにこれらの表を分析することができます。

enter image description here

51
Kazimierz Jawor

target.ValueはあなたにVariant型を与えるでしょう

target.Value2はあなたにもVariant型を与えますが、DateDoubleに強制変換されます

target.TextStringに強制しようとし、基礎となるVariantString型に強制できない場合は失敗します

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

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

そして明示的な型変換を試みる前にVBA.VarType(v)を使ってバリアントの型をチェックしてください。

23
Bathsheba

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

使用する場合

.Text、画面上のワークブックに見られるように、あなたは日付のフォーマットされた表現を得るでしょう:
2014-10-22。このプロパティの型は常にstringですが、必ずしも満足のいく結果が得られるとは限りません。

.Value、コンパイラーは日付をDateTimeオブジェクトに変換しようとします。{2014-10-22 00:00:00}ほとんどの場合、読むときだけ役に立ちます。日付。

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

したがって、セルの値を取得してdynamicvarobjectのいずれかに格納することができますが、値には必ず何らかの先天的な型があることに注意してください。

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
10
silkfire

.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を選択するほうが良いでしょう。

2
user4039065

好奇心から、私はValueValue2に対してどのように機能するかを見たかったのです。同様のプロセスを約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

enter image description here

0
PGCodeRider