Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
876to880
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
876to880
876to880
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

.VALUE oder nicht .VALUE

.VALUE oder nicht .VALUE
12.06.2007 21:31:50
Daniel
Hallo
vor kurzem war es mal ein Thema, ob es einen Unterschied gibt, ob man jetzt CELLS(1,1).VALUE = xxx schreibt oder nur CELLS(1,1) = xxx
https://www.herber.de/forum/archiv/872to876/t874689.htm
ich habe jetzt festgestellt, JA ES GIBT EINEN UNTERSCHIED, und zwar in diesem Fall:

Cells(a) = Cells(b)
liefert nicht das gleiche Ergebnis wie
Cells(a).value = Cells(b).value 
wenn Cells(b) eine als Text formatiert Zahl enthält (also einen TextString, der nur aus Ziffern besteht) 


im ersten Fall wird 1:1 übertragen, dh. der Textstring bleibt ein Textstring
im zweiten Fall mit .VALUE dagegen, wird das Präfix, das den String kennzeichnet, nicht mit übertragen, dadurch wandelt dann die Excel-Eingabeautomatik den Textstring in eine Zahl um.
(entscheident ist dabei das =Cells(b).value)
Ein Unterschied, der machmal durchaus relevant sein kann.
Gruß, Daniel

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: .VALUE oder nicht .VALUE
12.06.2007 21:43:00
Original
Hi,
nennt man implizite Typumwandlung.
Was uns mal wieder lehrt, dass es gut ist zu wissen, was man tut.
mfg Kurt

AW: .VALUE oder nicht .VALUE
12.06.2007 21:55:40
Daniel
Hi
was dann auch erklären würde, warum es ohne .value marginal schneller geht als mit.
hat also nix mit dem ominösen Defalut zu tun, sonder einfach damit, daß die Typerkennung und -umwandlung entfallen kann.
Gruß, Daniel

AW: .VALUE oder nicht .VALUE
12.06.2007 22:17:00
Original
Hi,
ne, mit default hat das schon was zu tun:
Cells(a).value = Cells(b).value
Hier greift default:
Cells(a) = Cells(b).value
mfg Kurt

AW: .VALUE oder nicht .VALUE
12.06.2007 22:25:00
Dan
Hi Daniel,
das Unterschied zwiscen Cells(1, 1) und Cells(1, 1).Value ist ziemlich gross. Cells ist eine Property, die immer eine Referenze auf ein RANGE-Object zurueck gibt. Also Cells als eine Eigenschfft kann selbst keine Defult Eigenschafft haben, sondern sie gibt eine Referenze auf ein Range und erst ein Range hat eine.
Was genau wird zuruck gegeben beim Cells(1, 1) und beim Cells(1, 1).Value? Hier ein Beispiel:
' schreib "Hallo" in die Zelle a1...

Public Sub CellsPropertyTest()
Dim value1 As Variant
Dim value2 As Variant
Set value1 = ActiveSheet.Cells(1, 1) ' geht
' Set value2 = ActiveSheet.Cells(1, 1).Value ' geht nicht, weil property value gibt ein  _
wert zureck und keine referenz
value2 = ActiveSheet.Cells(1, 1).Value ' das geht
' hier beide Variablen, value1 und 2 in n Watch geben ... und auf den VAriant Daten Sub-Typ  _
schauen
End Sub


Also der Variant Daten Sub-Typ in vlaue1 ist range, aber der Variant Daten Sub-Typ von value2 ist String.
Und noch zu der Default Eigenschft vom Range. Laut Excel Help :
Because the Item property is the default property for the Range object, you can specify the row and column index immediately after the Cells keyword. For more information, see the Item property and the examples for this topic.
Also Value ist keine Defaut Eigenschafft hier. Nicht von Cells (kann auch nicht sein, weil Cells ist selbst ene Eigenschafft) aber vom Range auch nicht.
Gruss Dan, cz.

Anzeige
AW: .VALUE oder nicht .VALUE
12.06.2007 22:58:53
Daniel
Hallo
liegt hier das problem nicht eher darin, daß du über die Verwendung von SET vorgibst, ob value1 jetzt eine Objekt- oder eine "normale" Array-Variable werden soll?
also
value1 = Cells(1,1)
liefert mir das gleiche Ergebnis wie
value1 = cells(1,1).value
auch im ersten Fall wird value1 nicht zum Objekt, sondern es wird brav nur der Wert der Zelle 1,1 übergeben.
gruß, Daniel

AW: .VALUE oder nicht .VALUE
13.06.2007 12:33:09
Dan
Hallo Daniel,
also
value1 = Cells(1,1)
liefert mir das gleiche Ergebnis wie
value1 = cells(1,1).value
...es sieht so aus, dass Cells(1,1) das selbe ist wie Cells(1,1).Value....aber nicht ganz :-). Auch sieht es so aus, als ob Value die default property vom Range wuerde....auch das ist wahrscheinlich nicht ganze Wahrheit. Siehe den Code Sample unten.
auch im ersten Fall wird value1 nicht zum Objekt, sondern es wird brav nur der Wert der Zelle 1,1 übergeben.
... so kann value1 nicht zum Objekt werden. Wenn man eine Objekt Referenze in eine Variable speicher will, muss man den Set Statement benutzen:
Set vlaue1 = cells(1,1) ... so wird value1 die Referenze auf ein Range Objekt beinhalten.

Sub test2()
Dim allCellsOnActiveSheet As Range
Set allCellsOnActiveSheet = Cells
' hier gibt man ein Wert in den Range A1 ein, ohne der Name der Property zu schreiben,
' also hir wird die default property benutzt:
allCellsOnActiveSheet(1, 1) = "Test ... ohne Value"
' es muss eine default property geben, sonnst heatten wir warscheinlich ein Error bekommen:
' error 438: Object does not support this property of method
' laut Excel help ist die default property vom Range die Property Item:
' ... Because the Item property is the default property for the Range object ...
' viele Leute meinen aber, dass default property vom Range ist die Property Value
' ... ich habe es mir auch gedacht :-)
' aber wenn man in den Object browser geht, und die 'Hidden members' sich anzeigen laesst,
' sieht man, dass beides nicht stimmt.
' Als default property ist da die hidden _Default property markiert (blaues punkt ueber der  _
Ikone der Property)
' Ich vermute:
' also wenn man allCellsOnActiveSheet(1, 1) schreibt, ruft man in Wirklichkeit volgendes an: _
' (Die _Default property aendert die Koordinaten und dann aendert den Wert)
allCellsOnActiveSheet.[_Default](1, 1) = "Hallo .... hier _Default Property of Range"
' auch hier muss erstmanls _Default property gerufen werden, die _Default Property
' aendert nur die Koordinaten, und dann wird die Value gerufen
allCellsOnActiveSheet(1, 1).Value = "Test ... mit Value"
' Wenn ich mir das ganze jetzt ansehe, bin ich mir nicht sicher ob sich der Aufwand gelohnt  _
hat.
' Wenn interressiert das schon, dass da eine _Default property ist :-)
' zum Schluss noch etwas. So ist es am klarsten: nimm eine Item aus allen Zellen und  _
aendere dessen Wert
' ... aber so ist es auch langsam, weil die methoden Item und Value dabei gerufen werden...
allCellsOnActiveSheet.Item(1, 1).Value = "Komplett ... "
End Sub


Gruss Dan, cz

Anzeige
AW: .VALUE oder nicht .VALUE
13.06.2007 23:14:00
Daniel
Hi
das mit dem Set und Objekt habe ich schon verstanden.
durch die verwendung von SET wird festgelegt, ob value1 zur Objekt- oder normalen Variable wird, dh. wenn SET value1 = cells(1,1),dann wird value1 eine Objektvariable und benötigt als Eingabe die Referenz zum Objekt.
=cells(1,1) liefert alle Eigenschaften vom Objekt cells(1,1), darunter auch die Referenz, somit ist alles tok.
=cells(1,1).valueliefert dagegen nur die .Value-Eigenschaft des Objekts Cells(1,1), die benötigte Refernz fehlt, dh. es gibt einen Fehler.
etwas anders ist bei value1=cells(1,1). Da kein SET verwendet wird ist klar, daß value eine normale Variable wird, und diese benötigt einen beliebiegen WERT.
bei =.cells(1,1).value , ist es eindeutig, welcher Wert überbeben wird, nämlich die Value-Eigenschaft von Cells.
bei =.cells(1,1) werden wiederum alle Eingenschaften des Objetks angeboten. Die Programmierer von VBA haben sich halt entschieden, in diesem Fall eben die VALUE-Eigenschaft als logischte Möglichkeit an die Variable zu übergeben (sie hätten natürlich auch einen "too much information-Error" einbauen können)
Aber nochmal zur Ursprungsfrage zurück (da waren ja Variablen nicht das Thema)
der Unteschied muß wohl der sein, daß bei
Cells(a).value = cells(b).value nur die Valueeingenschaft von a nach b übergeben wird.
bei Cells(a) = Cells(b) wird auch die Value-Eigenschaft übergeben und eine weitere, nämlich die Eigenschaft, ob der Wert als Text oder als Zahl zu interpretieren ist. (alle anderen Eigenschaften des Cell-Objekts werden nicht übergeben)
jetzt ist die Frage, welche Eigenschaft es ist, die da mit im Spiel ist. Ich hatte ja erst die .PrefixCharacter im Verdacht, aber die ist es nicht.
Gruß, Daniel

Anzeige
AW: .VALUE oder nicht .VALUE
14.06.2007 01:02:00
Dan
Hi Daniel,
Aber nochmal zur Ursprungsfrage zurück (da waren ja Variablen nicht das Thema)
der Unteschied muß wohl der sein, daß bei ...
Ja ich habe es reproduzieren koennen. Tatsaechlich ist es so. Wenn ich mir die Zellen nach dem der Code durchgelaufen ist im Watch angesehn habe, sah ich, dass der einzige Unterschied ist, dass die _Default property hat den Variant Daten Sub-Typ vom Cell-Wert erhalten, aber die Value property hat den Sub-Typ auf Variant/Double konveritert. Das heisst, dass die property _Default anders arbeitet als die property Value, da ist keine andere Eigenschaft im Spiel. Es ist eher eine Frage von impliciten Konversionen ...
cells(1,1) liefert alle Eigenschaften vom Objekt cells(1,1), darunter auch die Referenz, somit ist alles tok.
Besser waere : Cells(1,1) is eine Property und gibt eine Referenze auf ein Range zureck
cells(1,1).value liefert dagegen nur die .Value-Eigenschaft des Objekts Cells(1,1), die benötigte Refernz fehlt, dh. es gibt einen Fehler.
Besser waere : property Value gibt hier den Wert vom Range zurueck, auf welchen die Property Cells(1,1) zeigt.
bei =.cells(1,1).value , ist es eindeutig, welcher Wert überbeben wird, nämlich die Value-Eigenschaft von Cells.
Hier lieber : naemlich der Rueckgabe-Wert von der Property Value
bei =.cells(1,1) : haeng es davon ab, was wir brauchen. Wenn wir eine Referenz auf den Range A1 brauchen, muessen wir dies machen:
Set value1 = cells(1,1)
Wenn wir aber nur den Wert in dem Range A1 lesen wollen, machen wir es so:
value1 = cells(1,1) ... also nur den Set weglassen.
Und noch etwas zum Schluss :-)
Wenn man weiss, das eine Zelle ein Zahl-String enthaelt, kann man es mit der funktion Val auf Zahl konvertieren. Dann wird das Problem vom Anfang nich aufretten:
Cells(a) = VBA.Val(Cells(b))
Cells(a).Value = VBA.Val(Cells(b).Value)
Gruss Dan, cz
Anzeige

16 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige