Eingabewert in Berechnung einbeziehen?

Hallo,

vielleicht weiss es ja jemand. Ich möchte gern in einer (eigentlich zwei) Zellen den Wert der Eingabe mit in die Formel einbeziehen.

Beispiel:

=(Eingabe())+1

ergiebt wenn ich 10 eingebe = 11

Dumm nur, wenn ich 10 eingebe ist die Formel verschwunden. Meines Wissens gab es mal etwas was auf die Tastatur wartete? und den Wert mit übernahm?

Sinn und Zweck wäre ein Kassenbuch mit Netto bzw. Brutto Eingabe. Die Anwenderin soll den Betrag eingeben und autmatisch den Brutto/Mwst./Netto Wert angezeigt bekommen und zwar abhängig davon in welcher der drei Zellen sie den Betrag eingiebt.

Gibt es eine Lösung?

Gruß aus Hamburg
Knud Schiffmann
http://schiffmann.com

Hi Knud,

vielleicht weiss es ja jemand. Ich möchte gern in einer
(eigentlich zwei) Zellen den Wert der Eingabe mit in die
Formel einbeziehen.

Also geht es um 1-2 Zellen.

Beispiel:

=(Eingabe())+1

ergiebt wenn ich 10 eingebe = 11

Dumm nur, wenn ich 10 eingebe ist die Formel verschwunden.

Jepp, Excel kennt nur Wert oder Formel in einer Zelle.
Mit einer zweiten Zelle kann man begrenzt etwas „tricksen“ in der Hinsicht, aber ich weiß nicht ob das hier etwas hilft.

Meines Wissens gab es mal etwas was auf die Tastatur wartete?
und den Wert mit übernahm?

Ging das mit normalen Zellen, ohne Makro, ohne „Eingabefelder“ aus Ansicht–Symbolleiste–Steuerelementtoolbox bzw. Ansicht–Symbolleiste–Formular ?

Sinn und Zweck wäre ein Kassenbuch mit Netto bzw. Brutto
Eingabe. Die Anwenderin soll den Betrag eingeben und
autmatisch den Brutto/Mwst./Netto Wert angezeigt bekommen und
zwar abhängig davon in welcher der drei Zellen sie den Betrag
eingiebt.

Deshalb mein Hinweis auf die zellenanzahl oben, auf einmal sind es 3 Zellen.

Kommen da noch mehr Zellen? :smile:)

Gibt es eine Lösung?

K.A. bastle mal eine Beispieldatei, lade sie via FAQ:2861 hoch, wo man im Blatt1 sieht wie die Tabelle vor einer Eingabe aussieht, in Blatt2 wie sie danach aussiehen soll und was da wo eingegebn wurde, wenn man das nicht erkennen konnte, vielleicht noch Blatt3,4 wie sie nach weiteren Eingaben aussehen soll.

Gruß
Reinhard

den Wert der Eingabe mit in die Formel einbeziehen.
Beispiel: =(Eingabe())+1

Hallo Reinhard
Ich habe mir zur Frage von Knud folgende Lösung mit einem „Tabellen-Makro“ überlegt:

Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo finis
If Target.Column 1 Then Exit Sub
t = Cells(Target.Row, 1)
If IsEmpty(t) Then Exit Sub
Cells(Target.Row, 1) = t + 1
finis:
End Sub

Ist das vom Ansatz her überhaupt richtig gedacht?

Tatsächlich passiert folgendes: Statt dass die eingegebene Zahl um 1 erhöht wird, wird sie um 222 erhöht. Kannst Du mir erklären warum?

Ich hoffe, ich bringe Dich damit nicht um Deine wohlverdiente Wochenend-Ruhe und grüsse Dich ganz freundlich
Niclaus

OT Variablen namen im Code
Hallo Niclaus,

Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo finis
If Target.Column 1 Then Exit Sub
t = Cells(Target.Row, 1)
If IsEmpty(t) Then Exit Sub
Cells(Target.Row, 1) = t + 1
finis:
End Sub

Ist das vom Ansatz her überhaupt richtig gedacht?

weiß ich nicht, ich weiß weder was Knud da genau will noch was du als Ansatz hast bzw. welches Ziel.
Im Code wird eine Zelle im Wert erhöht, mehr sehe ich da nicht.

Aber ich sehe etwas anderes. Gehe mal im VB-Editor auf Extras-Optionen und hake da an „Variablendeklaration erforderlich“.
Dann hast du in Modulen immer oben stehen „Option Explicit“.

Das zwingt dich zu „Dim“. Bei kurzen Codes ist das nicht so wichtig, aber langfristig zahlt es sich aus dies konsequent immer zu benutzen.

Und, bei Kurzcodes ist „t“ okay. Mache ich auch. Aber bei längerem Code ist das kontraprodutiv. Dann muß die Variable nicht „t“ sondern „lngZellinhalt“ o.ä. heißen, damit du nach 200 Codezeilen noch erahnen kannst was in der Variablen stecken könnte als Wert.
Logischerweise mußt du dann anfangs des Codes schreiben
Dim lngZellihalt as long

Nur in extremsten zeitkritischen Codes spielt die Länge der Variablennamen eine Rolle.
Eine gewaltige Rolle spielt aber, wenn du einen Monat später den Codes lesen willst und in Zeile 300 steht Msgbox t, dann hast du doch Null Plan was t bedeutet.
bei lngZellinhalt schon eher, und genau darum geht es.

Google mal nach ungarischer Notation wenn du magst.

Und wenn du brav Option Explicit genutzt hast, was dich zu Dim zwingt, so kannst du dir die komplette Eingabe der Variablennamen ersparen, gib in dem Beispiel einfach ein
lngz
und drücke Strg+Leertaste…

Tatsächlich passiert folgendes: Statt dass die eingegebene
Zahl um 1 erhöht wird, wird sie um 222 erhöht. Kannst Du mir
erklären warum?

Die 222 kann ich nicht erklären, das Andere schon. Indem du in eine Zelle etwas reinschreibst rufst du diese Ereignis-Prozedur nochmals auf, sie schreibt wieder etwas in eine zelle, dadurch ruft sie sich nochmals auf usw.

Um das zu vermeiden müßtest du die Prozedur so schreiben:

Private Sub Worksheet_Change(ByVal Target As Range)
application.enableevents=false
’ Code
application.enableevents=True
End Sub

Gruß
Reinhard

Hallo Niclaus,
weiß ich nicht, ich weiß weder was Knud da genau will noch was
du als Ansatz hast bzw. welches Ziel.

Hallo Reinhard
Danke für Deine Hinweise.

Im Code wird eine Zelle im Wert erhöht, mehr sehe ich da nicht.

Wenn ich Knud richtig verstanden habe, wollte er gerade das. Und ich habe versucht, das zu machen mit meinem Makro:

Wenn ich in einer Zelle in Spalte A einen Zahl-Wert eintippe, soll er automatisch um 1 erhöht und in der gleichen Zelle zurückgegeben werden. - Bei mir wird er dann aber statt um 1, um 222 erhöht.

Grüsse Niclaus

Greüezi Niclaus,

Im Code wird eine Zelle im Wert erhöht, mehr sehe ich da nicht.

Wenn ich Knud richtig verstanden habe, wollte er gerade das.
Und ich habe versucht, das zu machen mit meinem Makro:

Wenn ich in einer Zelle in Spalte A einen Zahl-Wert eintippe,
soll er automatisch um 1 erhöht und in der gleichen Zelle
zurückgegeben werden. - Bei mir wird er dann aber statt um
1, um 222 erhöht.

Der Wert wird pro Durchlauf des Codes in der Tat um 1 erhöht.
Da das Eintragen des neuen Wertes aber den Code erneut auslöst passiert dies in diesem zweiten Durchlauf nochmal usw usf.

Dies geschieht so lange bis ein interner Stack voll läuft und die Verarbeitung des Codes abgebrochen wird. Bei jedem PC ist das Eintreten dieses Abbruchs ein wenig anders.

Sehr schön kannst Du das prüfen wenn Du deinen Code wie folgt erweiterst:

Dim lngVar As Long

Private Sub Worksheet_Change(ByVal Target As Range)
lngVar = lngVar + 1
On Error GoTo finis
If Target.Column 1 Then Exit Sub
t = Cells(Target.Row, 1)
If IsEmpty(t) Then Exit Sub
Cells(Target.Row, 1) = t + 1
finis:
Stop
End Sub

Beim ersten Verlassen der Sub wird beim Stop-Befehl angehalten und Du kannst den Wert der Variablen ‚lngVar‘ prüfen - er gibt an wie oft die Schleife aufgerufen worden ist.

Baue die von Reinhard genannten Befehle in dein Makro ein, sie stellen sicher, dass der Ereigniscode nicht auch durch das Erhöhen des Wertes in der Zelle aus dem VBA-Coder heraus aufgerufen wird.

Mit freundlichen Grüssen
Thomas Ramel

  • MVP für Microsoft-Excel -
    [Win XP Pro SP-2 / xl2003 SP-3]

Salü Thomas
Ich habe mich zu früh gefreut!
Auch „Application.EnableEvents = False bzw. True“ bringt nichts.
Trotzdem vielen Dank und einen schönen Sonntag.
Niclaus

Hallo Reinhard
Ich habe mich zu früh gefreut!
Auch „Application.EnableEvents = False bzw. True“ bringt nichts.
Je nachdem, wo ich diese Zeile einsetze, macht das Makro das, was es bisher gemacht hat, oder dann halt gar nichts.
Trotzdem vielen Dank und einen schönen Sonntag.
Niclaus

Grüezi Niclaus

Ich habe mich zu früh gefreut!
Auch „Application.EnableEvents = False bzw. True“ bringt
nichts.

Das glaube ich dir nicht… :wink:

Versuchs mal so:

Private Sub Worksheet\_Change(ByVal Target As Range)
On Error GoTo finis
Application.EnableEvents = False
If Target.Column 1 Then GoTo finis
t = Cells(Target.Row, 1)
If IsEmpty(t) Then GoTo finis
Cells(Target.Row, 1) = t + 1
finis:
Application.EnableEvents = True
End Sub

Mit freundlichen Grüssen
Thomas Ramel

  • MVP für Microsoft-Excel -
    [Win XP Pro SP-2 / xl2003 SP-3]

Das glaube ich dir nicht… :wink:

Grüezi Thomas
Es ging tatsächlich nichts mehr!
Ich habe in Spalte A bereits erfasste Werte gelöscht. Und dann war’s aus. Und zwar auch in allen andern Tabellen, in denen ich mit „Targets“ arbeite. - Ich muss Excel neu aufstarten, dann klappts wieder.
Jetzt, wo ich das weiss mit dem Löschen, herrscht Freude :smile:)
Kann man diesen Schönheitsfehler ausmerzen? - Das wäre das Tüpfchen auf dem i.
Grüsse Niclaus

Hallo Reinhard
Ich habe mich zu früh gefreut!

Ich habe folgendes festgestellt und muss präzisieren:
Ich habe in Spalte A einen vorhandenen Wert gelöscht. Seither läuft nichts mehr mit dem Makro.
Ich habe Excel neu gestartet, jetzt klappts wieder. M. a. W.: Man darf keine bereits erfassten Werte löschen.
Nach dieser Erkenntnis freue ich mich wieder :smile:))
Niclaus

Das glaube ich dir nicht… :wink:

Grüezi Thomas
Es ging tatsächlich nichts mehr!
Ich habe in Spalte A bereits erfasste Werte gelöscht. Und dann
war’s aus. Und zwar auch in allen andern Tabellen, in denen
ich mit „Targets“ arbeite. - Ich muss Excel neu aufstarten,
dann klappts wieder.

Hallo Niclaus,

dann ist mutmaßlich das Folgende geschehen,

im Code wurde
application.enableevents=false
ausgeführt, danach wurde der Code durch Exit sub oder einen Fehler verlassen, d.h. application.enableevents=true wurde nicht durchgeführt.

Somit reagiert keine Ereignis-Prozedur mehr. Im neu gestarteten ist Enableevents standardmäßig auf True gesetzt, deshalb gings dann wieder.

Kurzfristige Abbhilfe,

Sub tt()
application.enableevents=true
end sub

laufen lassen. Mittelfristig den anderen Code abändern sodaß das nicht mehr vorkommen kann.

Gruß
Reinhard

Jetzt, wo ich das weiss mit dem Löschen, herrscht Freude :smile:)
Kann man diesen Schönheitsfehler ausmerzen? - Das wäre das
Tüpfchen auf dem i.
Grüsse Niclaus

Kurzfristige Abbhilfe
Sub tt()
application.enableevents=true
end sub

Mittelfristig den anderen Code abändern sodaß
das nicht mehr vorkommen kann.

Vielen Dank für die kurzfristige Abhilfe - Super, elegantissime!!
Für die mittelfristige werde ich mir bei meinen Kapazitäten wohl vergeblich den Kopf zerbrechen.
Weisst Du zufällig: stammt Kapazität von lat. caput (= Kopf) ab? :smile:)
Grüsse Niclaus

Hallo Niclaus,

Für die mittelfristige werde ich mir bei meinen Kapazitäten
wohl vergeblich den Kopf zerbrechen.

Quark, das schaffst du locker.
Du mußt nur dafür sorgen daß der Code im Fehlerfall mittels
On Error goto Ende
und bei If-Abprüfungen auch
If Target.row >1 then goto Ende
auf jeden Fall dies durchlaufen muß:
Ende:
Application.Enableevenst=True

Oder Event=false erst nach den If-Abfragen setzen.

Weisst Du zufällig: stammt Kapazität von lat. caput (= Kopf)
ab? :smile:)

Bestimmt, „Kopf zerbrechen“ und über Officelösungen nachdenken ist ja das Gleiche:smile:

Gruß
Reinhard

Quark, das schaffst du locker.

Reinhard, Du machst mich richtig verwegen.
Ich hab das ganze gleich erweitert: Jede Zahlen-Eingabe in irgendeiner Zelle eines Tabellenblattes soll um 1 erhöht werden:

Private Sub Worksheet\_Change(ByVal Target As Range)
 ze = ActiveCell.Row: sp = ActiveCell.Column
 On Error GoTo finis
 t = Cells(Target.Row, sp)
 If IsEmpty(t) Then Exit Sub
Application.EnableEvents = False
 Cells(Target.Row, sp) = t + 1
finis:
Application.EnableEvents = True
End Sub

Deine Haare werden Dir zu Berge stehen oder ganz ausfallen, weil Du Dir an den Kopf greifen musst wegen meiner SP-Notation. Ich habe mir das mit der Ungarischen hinter die Ohren geschrieben. Wissen täte ich es schon, aber ….

Ganz herzlichen Dank und viele Grüsse
Niclaus

Uebrigens: SP = Suisse primitive = Urschweiz

Private Sub Worksheet_Change(ByVal Target As Range)
ze = ActiveCell.Row: sp = ActiveCell.Column

Hallo Niclaus,

wieso prüfst du da Activecell? Normalerweise überprüft man da das Target, denn die unterscheiden sich ggfs., liegt auch daran was du in den Optionen eingestellt hast was nach Zellverlassen geschehen soll.

Probier dieses mal:

Private Sub Worksheet_Change(ByVal Target As Range)
MsgBox ActiveCell.Address
MsgBox Target.Address
End Sub

und gib in irgendeine Zelle irgendwas ein…

Gruß
Reinhard

Grüezi Niclaus

Ich hab das ganze gleich erweitert: Jede Zahlen-Eingabe in
irgendeiner Zelle eines Tabellenblattes soll um 1 erhöht
werden:

…auch dann wenn gleichzeitig in mehreren Zellen eine Eingabe gemacht wird?

Versuche es dann mal damit:

Private Sub Worksheet\_Change(ByVal Target As Range)
 On Error GoTo finis
 If Not IsEmpty(Target) Then
 Application.EnableEvents = False
 Dim rngZelle As Range
 For Each rngZelle In Targt
 rngZelle.Value = rngZelle.Value + 1
 Next rngZelle
 End If
finis:
 Application.EnableEvents = True
End Sub

Uebrigens: SP = Suisse primitive = Urschweiz

…aha - und dein zweiter Nachname lautet dann ‚von Flueh‘? :wink:

Mit freundlichen Grüssen
Thomas Ramel

  • MVP für Microsoft-Excel -
    [Win XP Pro SP-2 / xl2003 SP-3]

Grüezi Thomas,

*sehr kicher*, weiß denn Excel was die Variable „Targt“ beinhaltet?

Was wichtiger ist, was bedeutet „von Flueh“, hat der auch wie Wilhelm Tell auf Obst geschossen?

Gruß
Reinhard

Grüezi Reinhard

*sehr kicher*, weiß denn Excel was die Variable „Targt“
beinhaltet?

Targt ist latürnich ein Fipptehler - eine kleine Finte wollte ich denn doch legen… :wink:

Was wichtiger ist, was bedeutet „von Flueh“, hat der auch wie
Wilhelm Tell auf Obst geschossen?

Nein, dieser lebte wohl in der gleichen Region wie jener aber ca. 100 Jahre später, ist aber historisch besser verbürgt:

http://de.wikipedia.org/wiki/Niklaus_von_Fl%C3%BCe

Mit freundlichen Grüssen
Thomas Ramel

  • MVP für Microsoft-Excel -
    [Win XP Pro SP-2 / xl2003 SP-3]

Was wichtiger ist, was bedeutet „von Flueh“, hat der auch wie
Wilhelm Tell auf Obst geschossen?

Nein, dieser lebte wohl in der gleichen Region wie jener aber
ca. 100 Jahre später, ist aber historisch besser verbürgt:

Thomas, bitte!!!
Das Stanser Verkommnis war am 22. Dezember 1481. Und der Apfelschuss kurz kurz vor (oder nach??) dem 1. August 1291. Ca. 100 Jahre später??
Ich hoffe, Du denkst im Excel nicht mit solchen Differenzen.
Grüsse
Niclaus - aber nicht von der Flüe - ich bin der von Myra.