Nie proszę o pomoc przy żadnym scenariuszu, ale moje pytanie ma na celu wyjaśnienie. Ostatnio robiłem dużo skryptów VB w Excelu, więc naprawdę odnoszę się do Excela w tym pytaniu. Jaka jest różnica między .text, .value i .value2? Na przykład, kiedy powinienem używać target.text, target.value i target.value2? Nigdy nie korzystałem z opcji value2, ale nadal chciałbym wiedzieć, do czego jest używana.
Czasami, gdy używam .text, pojawia się błąd i muszę użyć .value, gdy tylko sprawdzam tekst w komórce lub manipuluję nim. Czasami, gdy myślę, że powinienem użyć .value, pojawia się błąd i muszę użyć .text. Zwykle akceptuje albo bez problemu, ale czasami robi różnicę. Wiem, że musi być w tym jakaś logika, ale nie mogę tego rozgryźć.
Dowiedziałem się również, że jeśli po prostu zostawisz go jako cel bez określenia .text lub .value, początkowo zadziała, ale coś, co ktoś zrobi, ostatecznie spowoduje błąd w skrypcie, więc zawsze najlepiej jest użyć na nim. . Myślę, że pytam, czy ktoś może dać mi jakąś wskazówkę, praktyczną zasadę, jak właściwie używać każdego z nich i kiedy należy go używać.
Dzięki za wyjaśnienie. Rozumiem to lepiej. Oba są dobrym wyjaśnieniem. Poniżej znajduje się mały przykład mojego kodu, który działa. Pomyślałem, że powinien to być target.text, ale wystąpiłby 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 trochę zdezorientowany, ponieważ kiedy myślę o value lub value2, szczególnie po twoich odpowiedziach, które udzieliłeś, myślę, że powinny być używane tylko do liczb. Jednak w moim przykładzie mówię o stricte tekstu, do którego odnosi się mój skrypt (tekst w komórkach, bardziej niż liczby).
Odpowiedzi:
.Text
daje ci ciąg reprezentujący to, co jest wyświetlane na ekranie dla komórki. Używanie .Text jest zwykle złym pomysłem, ponieważ możesz uzyskać ####.Value2
podaje podstawową wartość komórki (może być pusta, ciąg, błąd, liczba (podwójna) lub logiczna).Value
daje to samo co .Value2, z wyjątkiem sytuacji, gdy komórka została sformatowana jako waluta lub data, podaje walutę VBA (która może obcinać miejsca dziesiętne) lub datę VBA.Używanie .Value lub .Text jest zwykle złym pomysłem, ponieważ możesz nie uzyskać rzeczywistej wartości z komórki i są one wolniejsze niż .Value2
Aby uzyskać bardziej obszerną dyskusję, zobacz mój tekst vs wartość vs wartość2
źródło
Date
przekształcania a wDouble
(używanie.Value2
), gdy to, czego potrzebujesz, toDate
. Nie powinno.Value
być preferowane,.Value2
gdy patrzysz naDate
wartość? Z podanego artykułu też nie wynika jasno. Wydajność, ponieważ brak konwersji? Jasne, ale jeśli twój kod VBA działa z aDate
, stracisz tę krawędź, wykonując konwersję samodzielnie, niejawnie lub jawnie ... (kontekst - nie krępuj się)Format$(Range.Value2, Range.NumberFormat)
.Z wyjątkiem pierwszej odpowiedzi z Batszeby, z wyjątkiem informacji MSDN dotyczących:
.Value
.Value2
.Text
można przeanalizować te tabele, aby lepiej zrozumieć różnice między analizowanymi właściwościami.
źródło
.Value
jako standardowej właściwości przez cały czas - dla tekstu i liczb. Użyj,.Value2
gdy myślisz o dacie i niektórych liczbach. I używaj.Text
zawsze, jeśli chcesz zachować formatowanie wszystkiego, co masz w komórce / zakresie. Więc przykład twojego pytania, jeśli jest poprawny!target.Value
da ciVariant
typtarget.Value2
poda równieżVariant
typ, ale aDate
jest wymuszone naDouble
target.Text
próbuje wymusić na aString
i zakończy się niepowodzeniem, jeśliVariant
instrument bazowy nie podlega przymusowi do aString
typNajbezpieczniejszą rzeczą do zrobienia jest coś takiego
I sprawdź typ używanego wariantu,
VBA.VarType(v)
zanim spróbujesz użyć jawnego przymusu.źródło
Odnośnie konwencji w C #. Powiedzmy, że czytasz komórkę zawierającą datę, np. 2014-10-22.
Podczas używania:
.Text
, otrzymasz sformatowaną reprezentację daty, jak widać w skoroszycie na ekranie:2014-10-22 . Typ tej właściwości jest zawsze,
string
ale nie zawsze, zwraca satysfakcjonujący wynik..Value
kompilator próbuje przekonwertować datę naDateTime
obiekt: {2014-10-22 00:00:00} Przydatne najprawdopodobniej tylko przy odczytywaniu dat..Value2
, podaje rzeczywistą, podstawową wartość komórki. W przypadku dat jest to serial daty: 41934 . Ta właściwość może mieć inny typ w zależności od zawartości komórki. Jednak w przypadku seriali z datami typ todouble
.Możesz więc pobrać i zapisać wartość komórki w jednym lub drugim
dynamic
, ale pamiętaj, że wartość zawsze będzie miała jakiś rodzaj wrodzony, na który będziesz musiał działać.var
object
źródło
.Text to wyświetlana wartość sformatowanej komórki; .Value to wartość komórki, ewentualnie powiększona o wskaźniki daty lub waluty; .Value2 to surowa wartość bazowa pozbawiona wszelkich dodatkowych informacji.
Jeśli przetwarzasz wartość komórki, odczyt surowej wartości .Value2 jest nieznacznie szybszy niż .Value lub .Text. Jeśli lokalizujesz błędy, to .Text zwróci coś w rodzaju
#N/A
tekstu i może być porównane do łańcucha, podczas gdy .Value i .Value2 będą się dławić porównując swoją zwróconą wartość do łańcucha. Jeśli do danych zastosowano niestandardowe formatowanie komórek, podczas tworzenia raportu lepszym wyborem może być .Text.źródło
Z ciekawości chciałem zobaczyć, jak się
Value
spisuje przeciwkoValue2
. Po około 12 próbach podobnych procesów nie widziałem żadnych znaczących różnic w szybkości, więc zawsze zalecałbym używanieValue
. Użyłem poniższego kodu, aby uruchomić kilka testów z różnymi zakresami.Jeśli ktoś widzi coś sprzecznego z wydajnością, napisz.
źródło