Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1408to1412
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
Inhaltsverzeichnis

Differenz aus Spalten mit 'value'

Differenz aus Spalten mit 'value'
11.02.2015 01:59:51
Dietmar
Hallo in die Runde,
ich möchte die die Differenz aus den Werten von 2 Spalten bilden und das Ergebnis in eine andere Spalte als Wert eintragen.
Warum funktioniert folgender Code nicht? Was mache ich falsch?
Range("D2:D10").Value = Range("A2:A10").Value - Range("B2:B10").Value
Vielen Dank für einen Tipp!
Dietmar

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Das geht so nicht, ...
11.02.2015 03:18:05
Luc:-?
…Dietmar;
VBA ist nicht Xl, hier musst du so etwas selbst datentypgerecht pgmieren oder eine xl/vbFkt benutzen, die das macht. Einfache Operatoren können das definitiv nicht leisten, weil man nunmal keinen Vektor von einem anderen subtrahieren kann. In Xl realisiert das die XlSteuerung, auf die du mit VBA idR keinen Zugriff hast, es sei denn du benutzt die vbFkt Evaluate, die aber TextFmln auswertet, weshalb du hierbei einen ZellBereich als Adresse angeben musst und kannst (aus einem Datenfeld ohne ZellBezug aber erst eine MatrixKonstante seiner Werte in TextForm machen müsstest).
Eine weitere Methode, in VBA einen Zyklus über die beiden VektorBereiche zu vermeiden, wäre die Benutzung einer XlFkt als WorksheetFunction. Da käme hier nur ~.Sum infrage, aber dafür müssten die Werte des 2.Bereichs negativiert wdn, was das gleiche Problem aufwirft, und außerdem würde so nur eine GesamtSumme gebildet wdn. Also führt normalerweise nichts an zyklischer Verarbeitung, Zelle für Zelle, vorbei, es sei denn, du trägst in den ganzen D-Vektor eine R1C1-basierte Fml ein, was du vermutlich nicht willst (allerdings könnte man die anschließend mit ihrem Ergebnis überschreiben) und sich bei der geringen ZellAnzahl auch nicht lohnt. Also entweder klassisch so …
Dim xZelle As Range
…
For Each xZelle In Range("D2:D10")
xZelle = xZelle.Offset(0, -3) - xZelle.Offset(0, -2)
Next xZelle
…oder mit vbFkt Evaluate so: Range("D2:D10") = Evaluate("A2:A10-B2:B10")
Morrn, Luc :-?
Besser informiert mit …

Anzeige
AW: Vielen Dank ...
11.02.2015 08:33:33
Dietmar
Hallo Luc,
super, vielen Dank! Ich nehme dann die klassische Variante :-)
Da ich den Werte in der zu bedienenden Spalte noch hinzuaddieren will, habe ich Deinen Code wie folgt umgeschrieben, indem ich '.value' angehängt habe. Auch habe ich die zu bedienenden Spalten auch umgestellt, da es so in meine Originaltabelle passt.
So geht's. Hoffe es spricht nichts fachliches dagegegen.
Dim xZelle As Range
For Each xZelle In Range("B2:B10")
xZelle.Value = xZelle.Offset(0, -1) - xZelle.Offset(0, 2) + xZelle.Value
Next xZelle

Danke für kurzes Feedback :-)
LG
Dietmar

Anzeige
AW: ... und noch etwas ...
11.02.2015 08:37:17
Dietmar
Übrigens Luc,
ganz herzlichen Dank für die Super-Erläuterung! Das hilft mir für die Zukunft, die Zusammenhänge besser zu vestehen !
LG
Dietmar

Umweg über Formel
11.02.2015 06:31:16
RPP63
Hallo!
Warum nicht einfach?
Sub SumRange()
With Range("D2:D10")
.FormulaR1C1 = "=RC[-3]-RC[-2]"
.Value = .Value
End With
Gruß Ralf

AW: besten Dank ...
11.02.2015 08:35:58
Dietmar
Hallo Ralf,
vielen Dank für Deinen Beitrag.
So hatte ich es auch schon im Visier :-)
Werde aber für meine aktuelle Tabelle, in der ich es umsetzen möchte, den Vorschlag von Luc verwenden.
LG
Dietmar

Anzeige
Das würde hier aber zu einem ZirkelBezug ...
11.02.2015 11:18:15
Luc:-?
…führen und auch nicht fktionieren, da du ja den anscheinend schon vorhandenen Wert des Zieles hinzuaddieren willst, Dietmar,
aber das konnte Ralf (seine Variante hatte ich aber bereits genannt!) ebensowenig wie ich wissen, weil du das bei deiner Frage weder erwähnt noch in deinem Versuch angedeutet hattest… :-|
Bei Evaluate-Einsatz könnte man den aber voran- bzw nachstellen.
Bei großen Datenmengen wäre der Klassiker aber wohl am schnellsten und Ralfs Variante nur unnötig aufwendig (abgesehen mal davon, dass sie hier nicht einsetzbar wäre). Allerdings könnte auch .Sum verwendet wdn, dass Texte (nicht aber FehlerWerte!) und echte Wahrheitswerte (nicht bei Negation) ignoriert. Der Klassiker würde ebenso wie die Evaluate-Variante bei jedem Text oder Fehlerwert im DatenMaterial in einen Fehler laufen. Das müsste in diesem Fall noch abgefangen wdn.
Übrigens ist die Angabe von .Value hier zwar nicht falsch, aber überflüssig, da das die StandardEigenschaft eines Range (das gilt auch für einen mit .Offset verschobenen!) ist.
Luc :-?

Anzeige
AW: ... funzt es denn nur zufällig? ...
11.02.2015 15:09:41
Dietmar
Hallo Luc,
ich lade die Entwicklungsdatei mal hoch.
Darin funktioniert es aber, ohne, dass ein Zirkelfehler auftritt. Ist das zufällig so und nicht sicher?
Lass Dich nicht von der Spalte 'D' irritieren, die brauche ich in meiner O-Datei für andere Zwecke.
https://www.herber.de/bbs/user/95687.xls
Wenn ich Dich richtig verstanden habe, müsste noch eine Fehlerabfangroutine rein; wie wäre die denn sinnvoll. Den Bedarf erkenne ich nicht so recht, weil ich keinen Fehler produzieren konnte; weder mit 0-Eintrag noch mit ""-Eintrag; nur wenn keine Zahlen in 'C' eingetragen werden hakt es; das kann ich aber über Gültigkeitsregeln vermeiden.
Mit Möglichkeit mit Evaluate habe ich schlicht nicht verstanden :-/
DANKE! ... und: bin gespannt.
LG
Dietmar

Anzeige
Wenn sichergestellt ist, dass alle einbezogenen...
11.02.2015 15:50:33
Luc:-?
…Spalten stets nur Zahlen enthalten oder leer sind, Dietmar,
kann nichts schief gehen, denn eine wirklich völlig leere Zelle wird bei darauf zugreifenden mathematischen Operationen als vom Wert 0 interpretiert. Anders sieht es natürlich bei enthaltenen Texten, ein Leer-String ist auch einer (!) → er entspräche einem einzelnen TextPräfix (idR das Zeichen '), aus. Diese führen zu einer FehlerMeldung. Das könnte man bei diesem einfachen Pgm mit On Error Resume Next als erstem Befehl nach der Variablen­Deklaration abfangen. Die Operation wird dann in der betroffenen Zeile einfach übergangen.
Allerdings musst du hier ohnehin KlickDisziplin einhalten, denn die Operation wird bei jedem Schaltflächen-Klick ausgeführt, so dass sich die Werte in B ständig erhöhen.
Luc :-?

Anzeige
AW: Danke ... dann weiß ich bescheid ...
11.02.2015 17:39:41
Dietmar
Luc,
1.
erstens habe ich mal wieder was dazu gelernt. DANKE! und ...
2.
ist die Klickdisziplin gegeben, das der hier nur im Kleinen erörterte Prozess in ein Großes-Ganzes gehören soll, wo niemand nur mal so zum Spass auf den Befehl klickt.
On Error Resume Next ist insgesamt schon vorgeschaltet.
LG
Dietmar

Na denn iss ja hoffentlich jut! ;-] owT
11.02.2015 19:16:41
Luc:-?
:-?

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige