Ich bitte nicht um Hilfe bei einem Skript, aber meine Frage dient der Klarstellung. In letzter Zeit habe ich viele VB-Skripte in Excel erstellt, daher beziehe ich mich in dieser Frage wirklich auf Excel. Was ist der Unterschied zwischen .text, .value und .value2? Zum Beispiel, wann sollte ich target.text, target.value und target.value2 verwenden? Ich habe die Option value2 nie verwendet, möchte aber trotzdem wissen, wofür sie verwendet wird.
Wenn ich .text verwende, wird manchmal ein Fehler angezeigt, und ich muss .value verwenden, wenn ich nur den Text in einer Zelle überprüfe oder bearbeite. Wenn ich dann denke, ich sollte .value verwenden, erhalte ich manchmal eine Fehlermeldung und muss .text verwenden. Normalerweise akzeptiert es entweder oder ohne Probleme, aber manchmal macht es einen Unterschied. Ich weiß, dass dies eine Logik haben muss, aber ich kann es nicht herausfinden.
Ich habe auch herausgefunden, dass, wenn Sie es einfach als Ziel belassen, ohne .text oder .value anzugeben, es zunächst funktioniert, aber dann etwas, das jemand tut, irgendwann zu einem Fehler im Skript führt. Daher ist es immer am besten, etwas .something darauf zu verwenden . Ich denke, ich frage, ob mir jemand eine Richtlinie geben kann, eine Faustregel, wie man jeden richtig benutzt und wann er benutzt werden muss.
Danke für die Erklärung Jungs. Ich verstehe es irgendwie besser. Sie sind beide gute Erklärungen. Unten finden Sie ein kleines Beispiel für einen Teil meines Codes, der funktioniert. Ich dachte, es sollte target.text sein, aber es würde ein Fehler sein, also funktionierte es, wenn ich target.value verwendete.
If LCase(Target.Value) = LCase("HLO") And Target.Column = 15 Then
Target.Value = "Higher Level Outage"
End If
Ich bin immer noch etwas verwirrt, denn wenn ich an Wert oder Wert2 denke, insbesondere nach Ihren Antworten, die Sie gegeben haben, denke ich, dass sie nur für Zahlen verwendet werden sollten. In meinem Beispiel spreche ich jedoch ausschließlich von Text, worauf sich mein Skript häufig bezieht (Text in den Zellen, mehr als Zahlen).
Antworten:
.Text
gibt Ihnen eine Zeichenfolge, die darstellt, was auf dem Bildschirm für die Zelle angezeigt wird. Die Verwendung von .Text ist normalerweise eine schlechte Idee, da Sie #### erhalten könnten.Value2
gibt Ihnen den zugrunde liegenden Wert der Zelle an (kann leer, Zeichenfolge, Fehler, Zahl (doppelt) oder boolesch sein).Value
gibt Ihnen das gleiche wie .Value2, außer wenn die Zelle als Währung oder Datum formatiert wurde, erhalten Sie eine VBA-Währung (die möglicherweise Dezimalstellen abschneidet) oder ein VBA-Datum.Die Verwendung von .Value oder .Text ist normalerweise eine schlechte Idee, da Sie möglicherweise nicht den tatsächlichen Wert aus der Zelle erhalten und diese langsamer als .Value2 sind
Für eine ausführlichere Diskussion siehe meinen Text vs Value vs Value2
quelle
Date
in aDouble
(using.Value2
) zu zwingen, wenn Sie a benötigenDate
. Sollte nicht.Value
vorgezogen werden,.Value2
wenn Sie einenDate
Wert betrachten? Der verlinkte Artikel macht das auch nicht sehr deutlich. Leistung weil keine Konvertierung? Sicher, aber wenn Ihr VBA-Code mit a arbeitetDate
, verlieren Sie diesen Vorteil, indem Sie die Konvertierung implizit oder explizit selbst durchführen ... (Kontext - zögern Sie nicht, dies zu gewichten)Format$(Range.Value2, Range.NumberFormat)
.Außer der ersten Antwort von Bathsheba, außer MSDN-Informationen für:
.Wert
.Wert2
.Text
Sie können diese Tabellen analysieren, um die Unterschiede zwischen den analysierten Eigenschaften besser zu verstehen.
quelle
.Value
als Standardeigenschaft verwenden - für Text und Zahlen. Verwenden.Value2
Sie diese Option, wenn Sie an Datum und einige Zahlen denken. Und.Text
immer verwenden, wenn Sie die Formatierung von allem, was Sie in Zelle / Bereich haben, beibehalten müssen. Also, dein Fragenbeispiel ist richtig!target.Value
wird Ihnen einenVariant
Typ gebentarget.Value2
gibt Ihnen auch einenVariant
Typ, aber aDate
wird zu a gezwungenDouble
target.Text
Versuche, zu einem zu zwingen, schlagenString
fehl, wenn der BasiswertVariant
nicht zu einemString
Typ erzwungen werden kannAm sichersten ist so etwas
Überprüfen Sie den Typ der Variante mit,
VBA.VarType(v)
bevor Sie einen expliziten Zwang versuchen.quelle
Zu Konventionen in C #. Angenommen, Sie lesen eine Zelle, die ein Datum enthält, z. B. 22.10.2014.
Beim Benutzen:
.Text
erhalten Sie die formatierte Darstellung des Datums, wie in der Arbeitsmappe auf dem Bildschirm angezeigt:2014-10-22 . Der Typ dieser Eigenschaft ist immer
string
, liefert jedoch möglicherweise nicht immer ein zufriedenstellendes Ergebnis..Value
Der Compiler versucht, das Datum in einDateTime
Objekt zu konvertieren : {2014-10-22 00:00:00} Höchstwahrscheinlich nur beim Lesen von Datumsangaben nützlich..Value2
gibt Ihnen den tatsächlichen, zugrunde liegenden Wert der Zelle. Bei Datumsangaben handelt es sich um eine Datumsserie : 41934 . Diese Eigenschaft kann je nach Inhalt der Zelle einen anderen Typ haben. Für Datumsserien ist der Typ jedochdouble
.So ermitteln Sie den Wert einer Zelle in entweder abrufen und speichern können
dynamic
,var
oderobject
aber zur Kenntnis , dass der Wert wird immer irgendeine Art von angeborenem Typ hat , dass Sie sich danach zu handeln.quelle
.Text ist der angezeigte Wert der formatierten Zelle. Der Wert ist der Wert der Zelle, der möglicherweise um Datums- oder Währungsindikatoren erweitert wird. .Wert2 ist der zugrunde liegende Rohwert, der keine fremden Informationen enthält.
Wenn Sie den Wert der Zelle verarbeiten, ist das Lesen des rohen .Value2 geringfügig schneller als .Value oder .Text. Wenn Sie Fehler suchen, gibt .Text so etwas wie
#N/A
Text zurück und kann mit einer Zeichenfolge verglichen werden, während .Value und .Value2 den zurückgegebenen Wert mit einer Zeichenfolge vergleichen. Wenn Sie eine benutzerdefinierte Zellenformatierung auf Ihre Daten angewendet haben, ist .Text möglicherweise die bessere Wahl, wenn Sie einen Bericht erstellen.quelle
Aus Neugier wollte ich sehen, wie man dagegen
Value
vorgehtValue2
. Nach ungefähr 12 Versuchen mit ähnlichen Prozessen konnte ich keine signifikanten Geschwindigkeitsunterschiede feststellen, daher würde ich immer empfehlen, diese zu verwendenValue
. Ich habe den folgenden Code verwendet, um einige Tests mit verschiedenen Bereichen durchzuführen.Wenn jemand etwas Gegenteiliges in Bezug auf die Leistung sieht, bitte posten.
quelle