2013-06-28 3 views
109

Nie proszę o pomoc w jakimkolwiek scenariuszu, ale moje pytanie dotyczy wyjaśnień. Ostatnio robiłem dużo skryptów VB w Excelu, więc w tym pytaniu naprawdę mam na myśli program Excel. Jaka jest różnica między .text, .value i .value2? Kiedy powinienem użyć target.text, target.value i target.value2? Nigdy nie użyłem opcji value2, ale nadal chciałbym wiedzieć, do czego służy.Jaka jest różnica między .text, .value i .value2?

Czasami, jeśli używam .text, daje mi to błąd i muszę użyć .value, gdy sprawdzam lub manipuluję tekstem w komórce. Wtedy czasami, gdy myślę, że powinienem użyć .value, pojawia się błąd i muszę użyć .text. Zwykle akceptuje albo problem, albo nie, ale czasami robi różnicę. Wiem, że musi być jakaś logika do tego, ale nie mogę tego zrozumieć.

Dowiedziałem się również, że jeśli po prostu zostawisz to jako cel bez określania .text lub .value, to na początku zadziała, ale wtedy coś, co ktoś zrobi, ostatecznie doprowadzi do błędu skryptu, więc zawsze najlepiej jest użyć Coś na tym. Chyba pytam, czy ktoś może mi podać jakąś wskazówkę, zasadę, jak właściwie używać każdego z nich i kiedy należy go użyć.

Dzięki za wyjaśnienia. Rozumiem to lepiej. Obaj są dobrymi wytłumaczeniami. Poniżej znajduje się malutki przykład mojego kodu, który działa. Pomyślałem, że powinien to być tekst target.text, ale byłby to błąd, więc gdy użyłem target.value, zadziałało.

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

nadal jestem nieco zdezorientowany bo kiedy myślę o wartości lub wartość2, zwłaszcza po swoich odpowiedziach, że przewidziane, myślę, że powinny one być stosowane tylko do liczb. Jednak w moim przykładzie mówię o ściśle tekstowym, który jest dużo tego, o czym mówi mój skrypt (tekst w komórkach, bardziej niż liczby).

+0

LCase (Target.Value) zakończy się niepowodzeniem, jeśli parametr Target.Value nie jest koerowalny do ciągu znaków, ponieważ LCase wymaga łańcucha do argumentu. Powinieneś najpierw sprawdzić VarType według mojej odpowiedzi. Zauważ, że możesz użyć UCase zamiast tego i porównać bezpośrednio z "HLO": nie ma sensu operowanie literałem. – Bathsheba

+0

Dziękujemy za informację o VarType. Jeśli chodzi o LCase lub UCase do tego, to naprawdę nie ma znaczenia, którego użyłem. Niektórzy ludzie wpisują go jako hlo, a inni wpisują go jako HLO. Z tego, co zobaczyłem, okazało się, że ten drugi był częściej używany. – Chris

Odpowiedz

149

.Text daje ciąg reprezentujący co jest wyświetlane na ekranie komórki. Za pomocą .Tekst jest z reguły złym pomysłem, ponieważ można dostać ####

.Value2 daje wartość podstawowej komórki (może być pusty, łańcuch, błąd, numer (podwójne) lub logiczna)

.Value daje taki sam jak .Value2, chyba że komórka została sformatowana jako waluta lub data, która daje walutę VBA (która może obciąć miejsca po przecinku) lub datę VBA.

Korzystanie .Value lub .text jest zazwyczaj zły pomysł, ponieważ nie może uzyskać rzeczywistą wartość z komórki i są wolniejsze niż .Value2

Dla szerszej dyskusji zobaczyć moją Text vs Value vs Value2

+0

Mam w komórce następującą wartość: '1420470000000000'. Chcę uzyskać to jako ciąg. Użycie '.Value' i' Value2' zwraca mi następujące dane: '1.42047E + 15'. To, czego naprawdę chcę, to pełna wartość jako ciąg, tj. "1420470000000000". Używam '.Formula' na razie, ale chciałbym wiedzieć o bardziej odpowiednie rozwiązanie? –

+4

Prawdopodobnie użyłbym Format, aby kontrolować sposób konwersji liczby na ciąg znaków: var = Format (Zakres ("a1"). Wartość 2, "#") –

+0

Mam nadzieję, że nie jest to osobne pytanie, ale: Co to jest wartość domyślna?OP stwierdza niejasno, że pomijanie tekstu/wartości/wartości 2 jest problematyczne, ale z pewnością domyślnie jest to * jeden * z nich? –

18

target.Value daje Variant typ

target.Value2 dadzą Ci typ Variant jak dobrze ale Date jest wymuszali do Double

target.Text prób zmuszania do String i zakończy się niepowodzeniem, jeśli instrument bazowy Variant nie można używać jako urządzenia typu String typu

Najbezpieczniejszą rzeczą do zrobienia jest coś takiego jak

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

I sprawdź typ wariantu za pomocą VBA.VarType(v) przed próbą wyraźnego przymusu.

38

wyjątkiem pierwszej postaci odpowiedź Batszeba, z wyjątkiem informacji MSDN:

.Value
.Value2
.Text

można analizować tych tabel dla lepszego zrozumienia różnic pomiędzy analizowanymi właściwości.

enter image description here

+1

@Chris, używaj '.Value' jako standardowej właściwości przez cały czas - dla tekstu i liczb. Użyj '.Value2' kiedy myślisz o randce i niektórych liczbach. I używaj '.Text' zawsze, jeśli potrzebujesz zachować formatowanie wszystkiego, co masz w komórce/zasięgu. A więc przykład twojego pytania, jeśli jest poprawny! –

+0

Mam nadzieję, że nie jest to oddzielne pytanie, ale: Jaki jest wynik * domyślny *? OP stwierdza niejasno, że pomijanie tekstu/wartości/wartości 2 jest problematyczne, ale z pewnością domyślnie jest to * jeden * z nich? –

8

Odnośnie konwencji w języku C#. Załóżmy, że czytasz komórkę zawierającą datę, np. 2014-10-22.

Podczas korzystania:

.Text, dostaniesz sformatowaną reprezentację daty, jak widać w skoroszycie na ekranie:
2014-10-22. Ten typ właściwości to zawsze string, ale nie zawsze może dać zadowalający wynik.

.Value, kompilator próbuje konwertować datę do DateTime obiektu: {2014-10-22 00:00:00} Najprawdopodobniej tylko przydatne podczas czytania dat.

.Value2, daje rzeczywistą, podstawową wartość komórki. W przypadku dat jest to data seryjna: . Ta właściwość może mieć inny typ w zależności od zawartości komórki. W przypadku seriali randkowych typem jest double.

Dzięki temu można pobrać i zapisać wartość komórki w komórkach dynamic, var lub object, ale należy pamiętać, że wartość zawsze będzie mieć rodzaj wrodzonego typu, na który trzeba będzie działać.

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