.Text, .value और .value2 के बीच अंतर क्या है?


180

मैं किसी स्क्रिप्ट की मदद नहीं मांग रहा हूं, लेकिन मेरा सवाल स्पष्टीकरण के लिए है। हाल ही में मैं एक्सेल में बहुत सारे VB स्क्रिप्टिंग कर रहा हूं, इसलिए मैं वास्तव में इस सवाल में एक्सेल का जिक्र कर रहा हूं। .Text, .value और .value2 के बीच अंतर क्या है? जैसे कि मुझे target.text, target.value और target.value2 का उपयोग कब करना चाहिए? मैंने कभी भी value2 विकल्प का उपयोग नहीं किया, लेकिन फिर भी जानना चाहूंगा कि इसका उपयोग किस लिए किया जाता है।

कभी-कभी अगर मैं उपयोग करता हूं। तो यह मुझे एक त्रुटि देता है और मुझे उपयोग करने की आवश्यकता होती है। जब मैं केवल एक सेल के भीतर पाठ की जांच या हेरफेर कर रहा हूं। फिर कभी-कभी जब मुझे लगता है कि मुझे उपयोग करना चाहिए। तब मुझे एक त्रुटि मिलती है और मुझे .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 के बारे में सोचता हूं, खासकर आपके उत्तरों के बाद जो आपने प्रदान किए हैं, तो मुझे लगता है कि उन्हें केवल संख्याओं के लिए उपयोग किया जाना चाहिए। हालांकि, मेरे उदाहरण में मैं कड़ाई से पाठ के बारे में बात कर रहा हूं, जो कि मेरी स्क्रिप्ट को संदर्भित करता है (कोशिकाओं में पाठ, संख्याओं से अधिक)।


LCase (Target.Value) अगर Target.Value एक स्ट्रिंग के लिए जबरदस्ती नहीं है क्योंकि LCase को एक तर्क के लिए एक स्ट्रिंग की आवश्यकता होती है। आपको मेरे उत्तर के अनुसार पहले VarType की जांच करनी चाहिए। यह भी ध्यान दें कि आप इसके बजाय यूसीज़ का उपयोग कर सकते हैं और सीधे "एचएलओ" से तुलना कर सकते हैं: शाब्दिक रूप से संचालित करने के लिए अधिक बिंदु नहीं।
बतशेबा

VarType के बारे में जानकारी के लिए धन्यवाद। जहां तक ​​इसके लिए LCase या UCase की बात है, यह वास्तव में मायने नहीं रखता कि मैं किसका उपयोग करता हूं। कुछ लोग इसे hlo के रूप में लिखते हैं और कुछ लोग इसे HLO के रूप में लिखते हैं। मैंने जो देखा उससे यह प्रतीत होता है कि निचली स्थिति एक बार अधिक प्रयोग की गई थी।
क्रिस

जवाबों:


238

.Textआपको सेल के लिए स्क्रीन पर प्रदर्शित की जाने वाली स्ट्रिंग का प्रतिनिधित्व करता है। का उपयोग करना। आम तौर पर एक बुरा विचार है क्योंकि आप #### प्राप्त कर सकते हैं

.Value2 आपको सेल का अंतर्निहित मूल्य देता है (रिक्त हो सकता है, स्ट्रिंग, त्रुटि, संख्या (डबल) या बूलियन)

.Value यदि आप सेल को मुद्रा या दिनांक के रूप में स्वरूपित करते हैं, तो आपको वैसा ही देता है जैसे कि यह आपको VBA मुद्रा देता है (जो दशमलव स्थानों को छोटा कर सकता है) या VBA दिनांक।

.Value या .Text का उपयोग करना आमतौर पर एक बुरा विचार है क्योंकि आपको सेल से वास्तविक मूल्य नहीं मिल सकता है, और वे धीमी गति से ।Value2

अधिक व्यापक चर्चा के लिए मेरा पाठ बनाम मान 2 मान देखें


6
मैं शायद प्रारूप का उपयोग यह नियंत्रित करने के लिए करूंगा कि कैसे संख्या एक स्ट्रिंग में परिवर्तित हो जाती है: var = Format (रेंज ("a1")। Value2, "#")
चार्ल्स विलियम्स

2
मुझे उम्मीद है कि यह एक अलग सवाल नहीं है लेकिन: क्या डिफ़ॉल्ट है? ओपी अस्पष्ट रूप से दावा करता है कि पाठ / मूल्य / मूल्य 2 को छोड़ना समस्याग्रस्त है, लेकिन निश्चित रूप से यह उनमें से एक के लिए चूक है ?
मार्टिन एफ

3
इस ओउडोल्ड पोस्ट को जगाने के लिए क्षमा करें, लेकिन जब आप की आवश्यकता होती है तो Dateएक Double(उपयोग .Value2) में जोर लगाने का लाभ देखने में विफल हो रहा है Date। जब आप एक मूल्य को देख रहे हों, तो इसे .Valueप्राथमिकता नहीं दी जानी चाहिए ? लिंक किया गया लेख या तो बहुत स्पष्ट नहीं करता है। कोई रूपांतरण नहीं होने के कारण प्रदर्शन? ज़रूर, लेकिन फिर अगर आपका VBA कोड a के साथ काम कर रहा है , तो आप उस किनारे को स्वयं रूपांतरण करते हुए, स्पष्ट रूप से या स्पष्ट रूप से खो देंगे ... (संदर्भ - वजन में स्वतंत्र महसूस करें).Value2DateDate
Mathieu Guindon

2
@ मैट की मग - समस्या यह है कि एक्सेल में एक सही तारीख डेटा-प्रकार नहीं है - एक्सेल तारीखें और समय केवल युगल हैं जो कि उपयोगकर्ता द्वारा दिनांक, समय या मुद्रा के रूप में प्रकट होने के लिए जो भी प्रारूप लागू किया गया है या बदल दिया गया है, उस पर निर्भर करता है नंबर। इसलिए मान एक VBA तिथि के लिए एक्सेल डबल को coercing कर रहा है, लेकिन Value2 कोई जोर-जबरदस्ती नहीं कर रहा है ... तारीखों को दोगुना करने के लिए किसी भी तरह का नुकसान नहीं कर रहा है क्योंकि जब तक कोड समझता है कि यह परिवर्तनशील प्रारूप पर निर्भर है, तब तक कोई नुकसान नहीं कर रहा है। और किसी भी तरह से विपक्ष - इस समस्या से बचने के लिए हमें वास्तव में अधिक मूल एक्सेल डेटा प्रकारों की आवश्यकता है।
चार्ल्स विलियम्स

2
जब मैं एक प्रकार के रूपांतरण के बिना किसी अन्य सेल के बराबर एक सेल मान सेट करना चाहता हूं (उदाहरण के लिए, एक नंबर को पाठ के रूप में संग्रहीत संख्या में परिवर्तित किए बिना) मैं इसका उपयोग करता हूं Format$(Range.Value2, Range.NumberFormat):।
क्रिस बी

55

बाथशीबा को छोड़कर, पहले उत्तर फॉर्म के लिए MSDN जानकारी को छोड़कर:

.Value
.Value2
.text

आप विश्लेषण की गई संपत्तियों के बीच अंतर की बेहतर समझ के लिए इन तालिकाओं का विश्लेषण कर सकते हैं।

यहां छवि विवरण दर्ज करें


4
@ क्रिस, .Valueपाठ और संख्या के लिए हर समय मानक संपत्ति के रूप में उपयोग करें । .Value2जब आप तारीख और कुछ संख्याओं के बारे में सोचें तो उसका उपयोग करें । और .Textहमेशा उपयोग करें यदि आपको सेल / रेंज में किसी भी चीज़ का प्रारूपण रखने की आवश्यकता है। तो, आपका प्रश्न उदाहरण यदि सही है!
काज़िमीरेज़ जौहर

1
10:12 से 10:05 तक तारीख क्यों बदली? लेखन त्रुटि है?
कैटरीन

1
मुझे लगता है कि यह सिर्फ समय पैदा करने के परिणाम और बनाने स्क्रीन शॉट के समय के बीच गुजरे है
Kazimierz Jawor

25

target.Valueआपको एक Variantप्रकार देगा

target.Value2आपको एक Variantप्रकार देगा, लेकिन एक के Dateलिए मजबूर हैDouble

target.TextStringयदि कोई अंतर्निहित Variantएक Stringप्रकार के लिए ज़बरदस्त नहीं है , तो एक के लिए ज़बरदस्ती करने का प्रयास विफल हो जाएगा

सबसे सुरक्षित चीज कुछ ऐसा है

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

आप निकालते हैं और या तो में एक सेल का मान स्टोर कर सकते हैं तो 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

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 की तुलना में थोड़ा तेज है। यदि आप त्रुटियों का पता लगा रहे हैं, तो #N/Aपाठ पाठ जैसा कुछ लौटाएगा और इसकी तुलना स्ट्रिंग से की जा सकती है ।Value और .Value2 एक स्ट्रिंग में उनके दिए गए मूल्य की तुलना करते हुए चोक करेंगे। यदि आपके पास कुछ कस्टम सेल फ़ॉर्मेटिंग आपके डेटा पर लागू है तो रिपोर्ट बनाते समय यह बेहतर विकल्प हो सकता है।


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

यहां छवि विवरण दर्ज करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.