私はどんなスクリプトでも助けを求めていません、しかし私の質問は明確化のためです。最近、私は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について考えるとき、特にあなたが提供したあなたの答えの後で、私はそれらが数のために使われるべきだと思うからです。しかし、私の例では私は厳密にテキストについて話しています。それは私のスクリプトが言及していることの多くです(セル内のテキスト、数字以上のもの)。
.Text
は、セルの画面に表示されている内容を表す文字列を返します。あなたは####を得ることができるので.Textを使用することは通常悪い考えです。
.Value2
はあなたにセルの基本的な値を与えます(空、文字列、エラー、数(ダブル)またはブール値かもしれません)
.Value
は、セルが通貨または日付としてフォーマットされている場合を除いて、.Value2と同じです。VBA通貨(小数点以下が切り捨てられる場合があります)またはVBA日付になります。
セルから実際の値を取得することはできないので、.Valueまたは.Textを使用することは通常お勧めできません。また、.Value2よりも遅いです。
より広範な議論については私の テキスト対価値対価値2 を見てください。
target.Value
はあなたにVariant
型を与えるでしょう
target.Value2
はあなたにもVariant
型を与えますが、Date
はDouble
に強制変換されます
target.Text
はString
に強制しようとし、基礎となるVariant
がString
型に強制できない場合は失敗します
最も安全なことは次のようなものです。
Dim v As Variant
v = target.Value 'but if you don't want to handle date types use Value2
そして明示的な型変換を試みる前にVBA.VarType(v)
を使ってバリアントの型をチェックしてください。
C#の規約について日付を含むセルを読んでいるとしましょう。 2014-10-22。
使用する場合
.Text
、画面上のワークブックに見られるように、あなたは日付のフォーマットされた表現を得るでしょう:
2014-10-22。このプロパティの型は常にstring
ですが、必ずしも満足のいく結果が得られるとは限りません。
.Value
、コンパイラーは日付をDateTime
オブジェクトに変換しようとします。{2014-10-22 00:00:00}ほとんどの場合、読むときだけ役に立ちます。日付。
.Value2
は、セルの実際の基礎となる値を提供します。日付の場合は、日付のシリアル番号です。41934。このプロパティは、セルの内容に応じて異なる型を持つことができます。ただし、日付の通し番号の場合、型はdouble
です。
したがって、セルの値を取得してdynamic
、var
、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
.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を選択するほうが良いでしょう。
好奇心から、私は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