Apa perbedaan antara .text, .value, dan .value2?

180

Saya tidak meminta bantuan dengan skrip apa pun, tetapi pertanyaan saya adalah untuk klarifikasi. Akhir-akhir ini saya telah melakukan banyak skrip VB di Excel, jadi saya benar-benar merujuk ke Excel dalam pertanyaan ini. Apa perbedaan antara .text, .value, dan .value2? Seperti kapan saya harus menggunakan target.text, target.value, dan target.value2? Saya tidak pernah menggunakan opsi value2 tetapi masih ingin tahu untuk apa itu digunakan.

Kadang-kadang jika saya menggunakan .text itu memberi saya kesalahan dan saya perlu menggunakan .value ketika saya hanya memeriksa atau memanipulasi teks di dalam sel. Lalu kadang-kadang ketika saya pikir saya harus menggunakan. Nilai saya mendapatkan kesalahan dan saya harus menggunakan .text. Biasanya itu menerima baik atau tanpa masalah, tetapi kadang-kadang itu membuat perbedaan. Saya tahu harus ada logika untuk ini, tetapi saya tidak bisa memahaminya.

Saya juga menemukan bahwa jika Anda membiarkannya sebagai target tanpa menentukan .text atau .value pada awalnya akan berfungsi, tetapi kemudian sesuatu yang dilakukan seseorang pada akhirnya akan menyebabkan skrip salah, jadi selalu yang terbaik untuk menggunakan .sesuatu di atasnya . Saya kira apa yang saya tanyakan adalah apakah seseorang dapat memberi saya semacam pedoman, aturan praktis, bagaimana cara menggunakan masing-masing dengan benar dan kapan perlu digunakan.

Terima kasih untuk penjelasannya kawan. Saya agak mengerti lebih baik. Keduanya adalah penjelasan yang bagus. Di bawah ini adalah contoh kecil dari beberapa kode saya yang berfungsi. Saya pikir itu harus menjadi target.text, tetapi itu akan kesalahan sehingga ketika saya menggunakan target.value itu berhasil.

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

Saya masih sedikit bingung karena ketika saya memikirkan nilai atau value2, terutama setelah jawaban Anda yang Anda berikan, saya pikir mereka hanya boleh digunakan untuk angka. Namun, dalam contoh saya, saya berbicara tentang teks saja, yang banyak mengacu pada naskah saya (teks dalam sel, lebih dari angka).

Chris
sumber
LCase (Target.Value) akan gagal jika Target.Value tidak dapat dipaksakan ke string karena LCase membutuhkan string ke argumen. Anda harus memeriksa VarType terlebih dahulu sesuai jawaban saya. Juga perhatikan Anda bisa menggunakan UCase sebagai gantinya dan membandingkan langsung ke "HLO": tidak banyak gunanya beroperasi secara literal.
Batsyeba
Terima kasih atas informasi tentang VarType. Sejauh LCase atau UCase untuk ini, itu benar-benar tidak masalah yang mana yang saya gunakan. Beberapa orang mengetiknya sebagai hlo dan yang lain mengetiknya sebagai HLO. Dari apa yang saya lihat tampaknya huruf kecil lebih sering digunakan.
Chris

Jawaban:

238

.Textmemberi Anda string yang mewakili apa yang ditampilkan di layar untuk sel. Menggunakan .Text biasanya ide yang buruk karena Anda bisa mendapatkan ####

.Value2 memberi Anda nilai dasar sel (bisa kosong, string, kesalahan, angka (ganda) atau boolean)

.Value memberi Anda sama dengan .Value2 kecuali jika sel diformat sebagai mata uang atau tanggal itu memberi Anda mata uang VBA (yang dapat memotong tempat desimal) atau tanggal VBA.

Menggunakan .Value atau .Text biasanya ide yang buruk karena Anda mungkin tidak mendapatkan nilai nyata dari sel, dan mereka lebih lambat dari .Value2

Untuk diskusi yang lebih luas lihat Teks saya vs Nilai vs Value2

Charles Williams
sumber
6
Saya mungkin akan menggunakan Format untuk mengontrol bagaimana angka dikonversi menjadi string: var = Format (Rentang ("a1"). Value2, "#")
Charles Williams
2
Saya harap ini bukan pertanyaan terpisah tetapi: Apa standarnya? OP secara samar mengklaim bahwa meninggalkan teks / nilai / value2 bermasalah, tapi pasti itu default ke salah satunya?
Martin F
3
Maaf membangunkan postingan ini, tapi saya gagal melihat manfaat dari memaksa Datea Double(menggunakan .Value2) ketika yang Anda butuhkan adalah a Date. Bukankah .Valueseharusnya lebih disukai daripada .Value2ketika Anda melihat Datenilai? Artikel yang ditautkan tidak memperjelas hal itu. Performa karena tidak ada konversi? Tentu, tetapi kemudian jika kode VBA Anda bekerja dengan Date, maka Anda akan kehilangan keunggulan melakukan konversi sendiri, secara implisit atau eksplisit ... (konteks - jangan ragu untuk
mempertimbangkannya
2
@ Mat's Mug - masalahnya adalah bahwa Excel tidak memiliki tipe data Tanggal sejati - tanggal dan waktu excel hanya berlipat ganda yang bergantung pada format apa pun yang telah diterapkan atau diubah oleh pengguna untuk muncul sebagai tanggal, waktu atau mata uang atau hanya sebuah jumlah. Jadi Value memaksa Excel ganda ke tanggal VBA tetapi Value2 tidak melakukan paksaan ... Untuk tanggal yang memaksa double ke tanggal mungkin tidak melakukan kerusakan selama kode memahami bahwa itu tergantung pada format yang dapat diubah: pro dan kontra apa pun - yang kita butuhkan adalah tipe data Excel yang lebih asli untuk menghindari masalah ini.
Charles Williams
2
Ketika saya ingin menetapkan nilai sel sama ke sel lain tanpa konversi jenis (misalnya, tanpa mengubah nomor disimpan sebagai teks ke nomor a) Saya menggunakan ini: Format$(Range.Value2, Range.NumberFormat).
ChrisB
55

Kecuali formulir jawaban pertama Batsyeba, kecuali informasi MSDN untuk:

.Value
.Value2
.Text

Anda bisa menganalisis tabel ini untuk lebih memahami perbedaan antara properti yang dianalisis.

masukkan deskripsi gambar di sini

Kazimierz Jawor
sumber
4
@ Chris, gunakan .Valuesebagai properti standar sepanjang waktu - untuk teks dan angka. Gunakan .Value2ketika Anda memikirkan tanggal dan beberapa angka. Dan gunakan .Textselalu jika Anda perlu memformat apa pun yang Anda miliki di sel / rentang. Jadi, contoh pertanyaan Anda jika benar!
Kazimierz Jawor
1
mengapa tanggalnya berubah dari 10:12 menjadi 10:05? salah ketik?
Katrin
1
Saya pikir ini hanya waktu yang berlalu antara menghasilkan hasil dan waktu membuat screenshot
Kazimierz Jawor
25

target.Valueakan memberi Anda Varianttipe

target.Value2akan memberi Anda Varianttipe juga tetapi Datedipaksa untuk aDouble

target.Textmencoba untuk memaksa ke Stringdan akan gagal jika yang mendasarinya Varianttidak dapat dipaksakan untuk suatu Stringjenis

Hal paling aman untuk dilakukan adalah sesuatu seperti

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

Dan periksa jenis varian yang digunakan VBA.VarType(v)sebelum Anda mencoba paksaan eksplisit.

Batsyeba
sumber
11

Mengenai konvensi dalam C #. Katakanlah Anda sedang membaca sel yang berisi tanggal, misalnya 2014-10-22.

Ketika menggunakan:

.Text, Anda akan mendapatkan representasi tanggal yang diformat, seperti yang terlihat di buku kerja di layar:
2014-10-22 . Jenis properti ini selalu stringtetapi tidak selalu memberikan hasil yang memuaskan.

.Value, kompiler mencoba mengubah tanggal menjadi DateTimeobjek: {2014-10-22 00:00:00} Kemungkinan besar hanya berguna saat membaca tanggal.

.Value2, memberi Anda nilai sel yang nyata dan mendasar. Dalam hal tanggal, ini adalah serial tanggal: 41934 . Properti ini dapat memiliki tipe yang berbeda tergantung pada konten sel. Untuk serial serial, jenisnya adalah double.

Jadi, Anda dapat mengambil dan menyimpan nilai sel di salah satu dynamic, varatau objecttetapi perhatikan bahwa nilainya akan selalu memiliki semacam jenis bawaan yang harus Anda tindak lanjuti.

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
ulat sutra
sumber
2

. Teks adalah nilai ditampilkan sel yang diformat; .Nilai adalah nilai sel yang mungkin ditambah dengan tanggal atau indikator mata uang; .Value2 adalah nilai dasar mentah yang dilucuti dari setiap informasi asing.

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

Jika Anda memproses nilai sel maka membaca .Value2 mentah sedikit lebih cepat dari .Value atau .Text. Jika Anda menemukan kesalahan maka. Teks akan mengembalikan sesuatu seperti #N/Asebagai teks dan dapat dibandingkan dengan string sementara. Nilai dan. Nilai2 akan tersedak membandingkan nilai yang dikembalikan ke string. Jika Anda memiliki beberapa pemformatan sel khusus yang diterapkan pada data Anda, maka .Teks mungkin merupakan pilihan yang lebih baik saat membuat laporan.


sumber
0

Karena penasaran, saya ingin melihat bagaimana Valuekinerja melawan Value2. Setelah sekitar 12 percobaan proses serupa, saya tidak bisa melihat perbedaan kecepatan yang signifikan jadi saya selalu merekomendasikan untuk menggunakannya Value. Saya menggunakan kode di bawah ini untuk menjalankan beberapa tes dengan berbagai rentang.

Jika ada yang melihat sesuatu yang bertentangan dengan kinerja, silakan posting.

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

masukkan deskripsi gambar di sini

PGSystemTester
sumber