.Text, .value ve .value2 arasındaki fark nedir?


180

Herhangi bir senaryo ile ilgili yardım istemiyorum ama sorum açıklığa kavuşturmak için. Son zamanlarda Excel'de çok sayıda VB komut dosyası yapıyorum, bu yüzden gerçekten bu soruda Excel'e atıfta bulunuyorum. .Text, .value ve .value2 arasındaki fark nedir? Target.text, target.value ve target.value2'yi ne zaman kullanmalıyım? Ben değer2 seçeneğini hiç kullanmadım ama hala ne için kullanıldığını bilmek istiyorum.

Bazen .text kullanırsam bana bir hata verir ve yalnızca bir hücre içindeki metni denetlerken veya işlerken .value kullanmam gerekir. Sonra bazen .value kullanmam gerektiğini düşündüğümde bir hata alıyorum ve .text kullanmam gerekiyor. Genellikle ya bir ya da bir sorun olmadan kabul eder, ancak bazen bir fark yaratır. Bunun bir mantığı olması gerektiğini biliyorum, ama anlayamıyorum.

Ayrıca, sadece .text veya .value belirtmeden hedef olarak bırakırsanız, başlangıçta işe yarayacağını, ancak birisinin sonunda komut dosyasının hataya neden olacağını bir şey olduğunu öğrendim, bu yüzden üzerinde bir .something kullanmak en iyisidir . Ben soruyorum ne soruyorum biri bana nasıl her biri düzgün kullanmak ve ne zaman kullanılması gerektiği hakkında bir tür rehberlik, başparmak kuralı verebilir eğer olduğunu.

Açıklama için teşekkürler çocuklar. Bunu daha iyi anlıyorum. İkisi de iyi açıklamalar. Aşağıda, bazı kodlarımın işe yarayan küçük bir örneği var. Ben target.text olması gerektiğini düşündüm, ancak target.value kullandığımda bu yüzden hata olur.

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

Hala biraz kafam karıştı, çünkü değer veya değer2'yi düşündüğümde, özellikle verdiğiniz cevaplardan sonra, sadece sayılar için kullanılmaları gerektiğini düşünüyorum. Bununla birlikte, benim örneğimde, tam olarak metinden bahsediyorum, bu benim komut dosyamın ifade ettiği bir çok şeydir (hücrelerdeki metin, sayılardan çok).


LCase bir bağımsız değişkene bir dize gerektirdiğinden, Target.Value bir dizeye zorlanamazsa LCase (Target.Value) başarısız olur. Cevabım doğrultusunda önce VarType'ı kontrol etmelisiniz. Ayrıca bunun yerine UCase'i kullanabileceğinizi ve doğrudan "HLO" ile karşılaştırabileceğinizi de unutmayın: değişmez bir değer üzerinde çalışırken fazla bir nokta yok.
Bathsheba

VarType hakkında bilgi için teşekkürler. Bunun için LCase veya UCase'e göre, hangisini kullandığım önemli değil. Bazıları onu hlo, diğerleri ise HLO olarak yazar. Gördüğüm kadarıyla, küçük harf daha sık kullanıldı.
Chris

Yanıtlar:


238

.Texthücre için ekranda neyin görüntülendiğini temsil eden bir dize verir. .Text kullanmak genellikle kötü bir fikirdir, çünkü ####

.Value2 hücrenin temel değerini verir (boş, dize, hata, sayı (çift) veya boolean olabilir)

.Value hücrenin para birimi veya tarih olarak biçimlendirilmesi dışında size .Value2 ile aynı verir, size bir VBA para birimi (ondalık basamakları kesebilir) veya VBA tarihi verir.

.Value veya .Text kullanmak genellikle kötü bir fikirdir çünkü gerçek değeri hücreden alamayabilirsiniz ve bunlar .Value2'den daha yavaştır.

Daha kapsamlı bir tartışma için Metnim ile Değer ve Değer2'ye bakın


6
Muhtemelen sayının bir dizeye nasıl dönüştürüldüğünü denetlemek için Biçim'i kullanırdım: var = Biçim (Aralık ("a1"). Değer2, "#")
Charles Williams

2
Umarım bu ayrı bir soru değildir, ancak: Varsayılan nedir? OP, metin / değer / değer2'yi dışarıda bırakmanın sorunlu olduğunu iddia ediyor, ancak şüphesiz bunlardan biri varsayılan mı?
Martin F

3
Maalesef bu oooooold yazı uyanmak için, ama şiddet uygulanması avantajını görmek için başaramıyorum Datebir içine Double(kullanarak .Value2neye ihtiyacınız olduğunda) Date. Bir değere bakarken .Valuetercih edilmemeli .Value2misiniz Date? Bağlantılı makale de bunu çok netleştirmiyor. Performans çünkü dönüşüm yok? Tabii, ama sonra VBA kodunuz bir ile çalışıyorsa Date, o zaman dönüşümü örtülü veya açık bir şekilde kendiniz gerçekleştirerek kaybedersiniz ... (bağlam - ağırlıktan çekinmeyin)
Mathieu Guindon

2
@ Mat's Mug - sorun Excel'in gerçek bir Tarih veri türüne sahip olmamasıdır - excel tarihleri ​​ve saatleri, kullanıcı tarafından tarih, saat veya para birimi veya sadece bir biçim olarak görünmek için uygulanan veya değiştirilen biçime bağlı olarak iki katına çıkar. numara. Yani Değer, Excel çiftini VBA tarihine zorlar, ancak Value2 herhangi bir zorlama yapmaz ... Çifte bir tarihe zorlayan tarihler için, kodun değiştirilebilir bir biçime bağlı olduğunu anladığı sürece muhtemelen herhangi bir zarar vermez: artıları ve eksilerini her iki şekilde - gerçekten ihtiyacımız olan bu sorunu önlemek için daha doğal Excel veri türleri.
Charles Williams

2
Bir hücre değerini ayarlamak için istediğinizde bu kullanımı (bir dizi metin olarak depolanan bir dizi dönüştürmeden, örneğin) bir tür dönüştürme olmadan başka bir hücreye eşit: Format$(Range.Value2, Range.NumberFormat).
ChrisB

55

Bathsheba'nın ilk cevap formu hariç, MSDN bilgileri hariç:

.Value
.Value2
.Text

analiz edilen özellikler arasındaki farkların daha iyi anlaşılması için bu tabloları analiz edebilirsiniz.

resim açıklamasını buraya girin


4
@Chris, .Valuemetin ve sayılar için her zaman standart özellik olarak kullanın . .Value2Tarih ve bazı sayıları düşündüğünüzde kullanın . .TextHücre / aralıktaki herhangi bir şeyin biçimlendirmesini sürdürmeniz gerekiyorsa her zaman kullanın . Yani, soru örneğiniz doğruysa!
Kazimierz Jawor

1
tarih neden 10:12'den 10:05'e değiştirildi? typo?
Katrin

1
Bence sonuç üretme ve ekran görüntüsü alma zamanı arasında geçen zaman
Kazimierz Jawor

25

target.Valuesana bir Varianttür verecek

target.Value2size de bir Varianttür verecek ama DateaDouble

target.Texta'ya zorlama girişimleri Stringve altta yatan Variantbir Stringtipe zorlanamazsa başarısız olur

Yapılacak en güvenli şey,

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

Ve VBA.VarType(v)açık bir baskıya başlamadan önce varyantın türünü kontrol edin .


11

C # 'daki kurallara ilişkin. Diyelim ki tarih içeren bir hücre okuyorsunuz, örneğin 2014-10-22.

Kullanırken:

.Text, ekrandaki çalışma kitabında görüldüğü gibi tarihin biçimlendirilmiş temsilini alırsınız:
2014-10-22 . Bu mülkün türü her zaman geçerlidir, stringancak her zaman tatmin edici bir sonuç getirmeyebilir.

.Value, derleyici tarihi bir DateTimenesneye dönüştürmeye çalışır : {2014-10-22 00:00:00} Büyük olasılıkla yalnızca tarihleri ​​okurken faydalıdır.

.Value2, size hücrenin gerçek, altında yatan değerini verir. Tarihler için, bir tarih dizisi: 41934 . Bu özellik, hücrenin içeriğine bağlı olarak farklı bir türe sahip olabilir. Yine de tarih dizileri için türü double.

Eğer almak ve ya bir hücrenin değerini saklayabilir Yani dynamic, varya objectdeğer her zaman üzerinde hareket etmek olacağı doğuştan tip çeşit sahip olacağını ancak not.

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

Metin biçimlendirilmiş hücrenin görüntülenen değeridir; Değer, muhtemelen tarih veya para birimi göstergeleriyle artırılmış hücrenin değeridir; Değer2, herhangi bir yabancı bilgiden çıkarılan temel dayanak değerdir.

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

Hücrenin değerini işliyorsanız, ham .Value2 değerini okumak .Value veya .Text'ten biraz daha hızlıdır. Hataları buluyorsanız .Text, #N/Ametin gibi bir şey döndürür ve bir dizeyle karşılaştırılabilir .Value ve .Value2, döndürülen değerlerini bir dizeyle karşılaştırarak boğulur. Verilerinize bazı özel hücre biçimlendirmeleri uyguladıysanız, bir rapor oluştururken Metin daha iyi bir seçim olabilir.


0

Meraktan nasıl bir Valueperformans sergilediğini görmek istedim Value2. Benzer süreçlerin yaklaşık 12 denemesinden sonra, hızda önemli bir fark göremedim, bu yüzden her zaman kullanmanızı tavsiye ederim Value. Çeşitli kodlarla bazı testleri çalıştırmak için aşağıdaki kodu kullandım.

Performansla ilgili herhangi bir şey görürse, lütfen gönderin.

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

resim açıklamasını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.