Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
884to888
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
884to888
884to888
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Statisch reagieren auf dynamische Werte

Statisch reagieren auf dynamische Werte
17.07.2007 13:40:00
Born
Grüß Gott,
es kann sein, daß ich heute mächtig auf der Leitung stehe oder
einen miesen Tag habe, aber ich komm einfach nicht drauf. Vielleicht
kann mir ja einer(eine) von Euch mit einer unkomplizierten Lösung
für diese (scheinbar) einfache Problemchen helfen. Das wäre schön!
Es geht um folgendes:
Userbild
Problem: Die Zahlen in Spalte B verändern sich mit jeder Eingabe in Spalte A, aber die
Werte in Spalte C sollen bleiben, sobald ein Signal (beispielsweise die Zahl 100 in
spalte B erschienen ist.
Spalte A: Zähler für Spalte B
Spalte B: Dynamische Zahlen, die sich bei jeder Eingabe in Spalte A ändern. Ähnlich wie Zufallszahlen.
Spalte C: Wenn in Spalte B der Wert 100 auftaucht, soll in spalte C untereinaner ein Wert
eingetragen werden, beispielsweise 1. Bis in Spalte D, ein einfacher Zähler, ein Wert, beispiels-
weise 10, erreicht ist.
Spalte D: Irgendein Zähler, abhängig von Spalte C und einer anderen Spalte (nicht so wichtig)
Hier die Tabelle:

Die Datei https://www.herber.de/bbs/user/44164.xls wurde aus Datenschutzgründen gelöscht


Vielen Dank,
Born

19
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Statisch reagieren auf dynamische Werte
17.07.2007 13:56:00
Wolli
Hallo Born, in Rätseln Du sprichst. In Deiner Tabelle ist ja auch nicht mehr zu erkennen als in Deinem Screenshot.
Wer gibt wann welche Zahlen in Sp. A ein? Woher kommen die Zahlen in B? Sind sie sortiert? Warum soll in C eine 1 stehen? Soll überhaupt in C eine 1 stehen? Was bedeutet sie? Wofür das ganze? Was soll das Ergebnis sein?
Mach nochmal 'nen Anlauf, bitte. Gruß, Wolli

AW: Statisch reagieren auf dynamische Werte
17.07.2007 14:44:03
Born
Hallö Wolli,
mir ist zwar bewusst, daß ich heute schwer von Begriff bin, aber daß ich so daneben liege,
das war mir doch nicht klar. Möglich isses. Ich versuche es nochmal.
Wer gibt wann welche Zahlen in Sp. A ein?
- Die gebe ich selber ein. Eine nach der anderen.
Woher kommen die Zahlen in B?
- Das sind Ergebnisse von Werten aus anderen Bereichen der Tabelle, die hier durch eine
hübsche Array-Formel dargestellt werden. Das heißt, sie sind dynamisch und passen sich
immer dem unteren Ende der Tabelle, sprich letzte Zahl in Spalte A, an. Im Grunde wird da
etwas hochgezählt und wenn ein bestimmter Wert erreicht wird, der aber durch die Array-Formel
ständig in einer anderen Zelle steht, soll in spalte C ein Eintrag stattfinden.
Jedenfalls steht die Signalzahl, wenn sie kommt, immer an letzter Stelle in der Spalte.
Sind sie sortiert?
Wie gesagt, durch Array-Formel angelegt
Warum soll in C eine 1 stehen? Soll überhaupt in C eine 1 stehen? Was bedeutet sie?
Ob da eine 1 oder eine 5 steht ist egal. Ich brauche die als Signal für eine andere
Berechnung

Wofür das ganze? Was soll das Ergebnis sein?

Ich stelle damit eine Tabelle für unsere Skat-Runde zusammen und wollte mir
etwas Arbeit sparen.
Danke nochmal,
Born

Anzeige
Lösung mit Ereignisprozedur
18.07.2007 08:37:46
Wolli
Guten Morgen Born,
gestern hatte ich leider keine Zeit mehr, aber jetzt geht's los:
Ich habe dir eine wohlkommentierte Ereignisprozedur gebaut: Hier: https://www.herber.de/bbs/user/44191.xls
Abgefangen wird eine numerische Eingabe in Spalte A. Sofern dann rechts daneben eine 100 auftaucht, wird in Spalte C ab der Folgezeile "1" eingetragen - solange, bis in D eine 10 ist oder D zu Ende geht.
Kannst Du damit arbeiten? Herzlichen Gruß, Wolli

AW: Lösung mit Ereignisprozedur
18.07.2007 10:02:00
Born
Hallo Wolli,
gehe jetzt an einen vorsinnflutlichen Ort, wo es kein Internet gibt. Melde mich,
wenn ich wieder in der Zivilisation zurück bin. Heute Nachmittag.
Danke,
Born

Anzeige
AW: Lösung mit Ereignisprozedur
18.07.2007 16:24:00
Born
Hallo Wolli,
yes, that's it! Funktioniert - solange ich die Zahlen in Spalte A von Hand eingebe,
was normalerweise der Fall ist.
Ist noch eine kleine Zusatzbitte drin?
Für einen gründlichen Ablauftest möchte ich die Zahlen in Spalte A nicht einzeln eintragen, sondern eine Zahl nach der anderen in Spalte A eintragen lassen (mit einem Zähler und =und Verweis auf eine andere Spalte, diese wiederum holt die Zahlen aus einer anderen Tabelle)
Wie müßte der Code denn heißen, wenn das Target
( If Target.Column = 1 And IsNumeric(Target.Value))
immer die letzte, neue Zahl in Spalte A ist?
(die nun nicht von Hand eingetragen, sondern übernommen wird):
Du hast mir bisher nicht nur sehr geholfen, sondern auch was beigebracht. Herzlichen Dank.
Born

Anzeige
AW: Lösung mit Ereignisprozedur
18.07.2007 16:48:00
Wolli
Hallo Born, wenn Du die Zahlen durch ein Makro "hart" eintragen könntest, dürfte die Ereignisprozedur unverändert bleiben, denn es ändert sich ja tatsächlich die Zelle. Steht dort allerdings eine Formel drin und die eigentliche Änderung passiert ganz woanders, ist das Target dort zu suchen. Du könntest z.B. die IsNumeric-Prüfung einfach weglassen und die Target.Column auf 10 oder so stellen.
Alternativ nimmst Du die Prüfung ganz raus:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim i As Long
Application.EnableEvents = False
i = 2
Do
If Cells(i, 2) = 100 Then
i = i + 1
Do
'In jede Zelle der Spalte C "1" eintragen
'und den Zähler erhöhen ...
Cells(i, 3) = 1
i = i + 1
'bis in Sp. D "10" erscheint oder die Reihe in D zu Ende geht.
Loop Until Cells(i - 1, 4) = 10 Or IsEmpty(Cells(i, 4))
Exit Do
End If
i = i + 1
Loop Until IsEmpty(Cells(i, 1))
Application.EnableEvents = True
End Sub


Jetzt wird bei jeder Änderung in dem Tabellenblatt (wo auch immer) das Makro durchlaufen. Es testet JEDESMAL die Spalte B von Zeile 2 bis Ende auf den Wert 100 und schreibt ggf. die Eins hin. Wenn die Einsen fertig geschrieben sind, wird nicht noch nach einer weiteren 100 gesucht, sondern die Schleife abgebrochen und das Makro ist zuende.
Um zu verhindern, dass durch das Schreiben der Eins wiederum ein Ereignis ausgelöst wird, werden "Events" am Anfang deaktiviert.
Viel Spaß, Gruß, Wolli

Anzeige
AW: Lösung mit Ereignisprozedur
18.07.2007 18:00:45
Born
Hallo Wolli,
und danke, daß Du dran bleibst - und mir vielleicht noch etwas Schützenhilfe gibst.
Ich habe jetzt versucht, den VBA-Teil auf das Wenigste zu minimieren und die Bedingung,
die die zweite Spalte abfragt, mit einer EXcel Formel zu lösen.
Ich benutze VBA also nur, um das Signal bei einer bestimmten Zahl (jetzt 20) zu geben.
Sieht so aus:
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
Dim i As Long
If Target.Column = 2 And IsNumeric(Target.Value) Then
If Target.Offset(0, 21) = 20 Then
i = Target.Row
Cells(i, 33) = 1
End If
End If
End Sub


Zu Deinem obigen Makrovorschlag:
Da die Abfrage öfter vorkommt, würde ein einmaliges Abfragen und Beenden
des Makros der Sache nicht dienen.
Die Idee, die Zahlen in Spalte A "hart" einzutragen scheitert genau an der gleichen
Schwieriegkeit, wie die jetzige Situation: Ich müßte auch dann einen Makrobefehl
finden, der aus Spalte GZ, wo mittels Formel Daten aus einem anderen Tabellenblatt
importiert werden, die jeweils letzte Zeile mit Zahl ausliest.
Gibt es keine VBA-Möglichkeit für:
1. Wenn in Spalte A in eine neue Zeile ein neuer Wert eingetragen wird (per Formel, nicht von Hand),
2. und in Spalte XYZ eine bestimmte Zahl (jetzt 20) erscheint
3. dann schreib in gleiche Zeile in bestimmte spalte eine 1.
4. und gaaaanz eigentlich sollte auch noch eine weiter Spalte XYZ geprüft werden und falls dort diese 20 auftaucht, soll in eine ander Spalte die berühmte 1 geschrieben werden.
Well, well, well,
Gruß und Dank,
Born

Anzeige
AW: Lösung mit Ereignisprozedur
18.07.2007 20:30:00
Wolli
Hallo Born,

Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim i As Long
If Target.Column = 2 And IsNumeric(Target.Value) Then
'also in der gleichen Zeile zwanzig Spalten weiter rechts!?
If Target.Offset(0, 21) = 20 Then
' i = Target.Row ... geht auch kürzer ...
' Cells(i, 33) = 1 ... geht auch kürzer ...
Cells(Target.Row,33) = 1 'das ist Spalte AG!
End If
End If
End Sub


Gibt es keine VBA-Möglichkeit für:
1. Wenn in Spalte A in eine neue Zeile ein neuer Wert eingetragen wird (per Formel, nicht von Hand),
... die Formel verändert sich nicht, also kein Change-Ereignis, sorry. Du musst schon das Ereignis finden, dass die Änderung auslöst - und das muss es geben, denn ohne Ursache keine Wirkung, oder?
2. und in Spalte XYZ eine bestimmte Zahl (jetzt 20) erscheint
... kein Problem ...
3. dann schreib in gleiche Zeile in bestimmte spalte eine 1.
... auch kein Problem. Haben wir ja schon fertig ...
4. und gaaaanz eigentlich sollte auch noch eine weiter Spalte XYZ geprüft werden und falls dort diese 20 auftaucht, soll in eine ander Spalte die berühmte 1 geschrieben werden.
... Grundproblem siehe 1. Wenn Du schließlich das Change-Ereignis gefunden hast, kannst Du die Ereignisprozedur anpassen: If Spalte aa then schreibe die 1 in ab, elseif spalte cc then schreibe in cd.
Wenn die Musik eigentlich in der anderen Tabelle (Sheet? Workbook?) spielt, musst Du die Ereignisprozeduren eben dorthin verlagern. Es ist kein Problem, aus diesen heraus auf ein anderes Blatt oder sogar auf ein anderes Workbook zuzugreifen.
Gruß, Wolli

Anzeige
AW: Lösung mit Ereignisprozedur
18.07.2007 23:41:00
Born
Hallo Wolli,
Du hast Recht. Du hast Recht. Und ich lerne dazu. In Zelle GW7 steht die Zeilenzahl, die hochgezählt wird und den Eintrag in Spalte A regelt. Das ist also die target.address.
Und die Zellen, die auf value 20 geprüft werden sollen, sind (target.value+1), in spalte 21 und
dieselbe Zeile in Spalte 29.
Eingetragen werden soll dann - wenn in Spalte 21 eine 20 steht - in Zelle [zeile: target.value (also die
Zahl aus GW7)+1; spalte:33] die Zahl 1 und in die Zelle darunter [target.value+2/spalte 33] die zahl 3, darunter die Zahl 4, darunter
die 5, darunter 6, darunter 7.
Und wenn in Spalte 29 die 20 steht sollen die Zahlen 1 bis 7 untereinander ab Zelle [Zeile target.value+1/
Spalte34] stehen.
Ich habe also was dazugelernt, aberwie ich das genau schreibe, weiß ich nicht. Du schon?
Erstmal, danke für Deine Hilfe und immer noch mit Hoffnung,
wünsche ich eine gute Nacht....
Born

Anzeige
AW: Lösung mit Ereignisprozedur
19.07.2007 10:50:00
Wolli
Hallo Born,
target ist ein Range-Objekt, also ein Bereich an sich, das der Ereignisprozedur bei der Auslösung mitgegeben wird. Es kann verwendet werden oder auch nicht. Beim Ereignis Worksheet_Change ist es der Bereich, der geändert wurde.
target.address ist eine Zeichenkette, die die Adresse des Bereichs darstellt, also etwa "$C$17".
target.row ist die (oberste) Reihe des Bereiches, also etwa 17.
target.column ist die (erste) Spalte des Bereiches, also etwa 3.
target.value ist der Wert, der in dem Bereich steht. Also der Inhalt von Zelle C17, z.B. 100 oder "Horst".
Wenn Du nur target schreibst, kann das z.B. bedeuten:
- target.select wählt den Bereich aus
- x = target bedeutet, x nimmt den Wert von target.value (die Standardeigenschaft!) an. Sofern der Datentyp passt.
- set y = target (wenn dim y as range) heißt allerdings, dass y nun auf den gleichen Bereich wie target verweist, denn hier wird nicht der Wert, sondern der Bereich selbst zugewiesen. Aber das interessiert uns hier nicht.
Denke dich da nochmal rein, denn ich verstehe nicht ganz, was Du machst. target kannst Du nicht verändern, es IST halt der Bereich (i.d.R. die Zelle), die verändert wurde und das Ereignis ausgelöst hat.
Falls Du meinst "Ich gebe in Zelle GW7 eine 5 ein, daraufhin soll in Zelle U6 und AC6 etwas geprüft oder gemacht werden, dann bist Du mit cells(target.value + 1, 20) und cells(target.value + 1, 33) richtig.
Sicher, dass Du nicht target.row meinst?
Um eine Reihe von sieben Zahlen einzutragen, baust Du eine For..next-schleife:

[dim i as long]
For i = 1 to 7
cells(target.value + i,33) = i
Next i


Gruß, Wolli

Anzeige
AW: Lösung mit Ereignisprozedur
19.07.2007 12:24:00
Born
Holy shit, it works!
Danke für Deine Hilfe. Das war mein erstes.
Läuft noch ein bisschen langsam, kann mitzählen,
wenn VBA die 1 to 7 hineinschreibt,
aber tut genau, was es soll.
Ein kleines Wunder ist geschehen.
Danke für die Geduld,
Born

AW: Lösung mit Ereignisprozedur
19.07.2007 12:38:00
Wolli
Na, dann kann ich ja beruhigt in den Urlaub gehen! :-)) Herzlichen Gruß, Wolli

AW: Statisch reagieren auf dynamische Werte
17.07.2007 15:52:26
Born
Hallo Wolli,
ich experimentiere inzwischen mit

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 2 And Target.Value = 100 Then
Target.Offset(1, 7) = 1
End If
End Sub


Aber da bekomme ich immer Laufzeitfehler 13.
Warum wohl?
Gruß,
Born

Anzeige
AW: Statisch reagieren auf dynamische Werte
17.07.2007 14:36:00
Stefan
Hallo Born,
Versuch mal
https://www.herber.de/bbs/user/44166.xls
mit drei verschachtelten wenn-Abfragen.
Schoene Gruesse
Stefan

AW: Statisch reagieren auf dynamische Werte
17.07.2007 15:12:58
Born
Das ist nicht die Lösung aber ich glaube ich bin ein Schrittchen weiter.
Danke.

Ergängzung
17.07.2007 15:25:32
Born
Ich glaube es müßte mit "Formel in Wert umwandeln" gehen?
Ich lasse in Spalte C eine normale Formel.
Ich wandle das Ergebnis, die erste 1 in Spalte C in einen Wert um,
den ich in eine Hilfsspalte kopiere.
IN einer weiteren Spalte wird die erste Hilfsspalte abgefragt und
dort werden die Daten eingetragen.
Hab da was gefunden. Könnte mir vielleicht jemand, der sich mit
VBA besser auskennt, helfen diesen Code anzupassen:

Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 2 Then
Range("$D$1").Select
Selection.Copy
Cells(Target.Row, Target.Column - 1).Select
Selection.PasteSpecial Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
Cells(Target.Row + 1, Target.Column).Select
End If
End Sub


Danke,
Born

AW: Statisch reagieren auf dynamische Werte
17.07.2007 19:25:00
Daniel
Hi
probier mal diese Formel.

=WENN(D1=10;"";WENN(ODER(B1=100;C1=1);1;""))


so wie geschrieben in C2 eintragen und dann soweit wie benötigt nach unten kopieren.
sobald in Spalte B die 100 erscheint werden solange 1er gezeigt, bis in Spalte D die 10 kommt.
Gruß, Daniel
PS leider kann ich keinen Zusammenhang zwischen deiner Problembeschreibung und der angehängten Datei erkennen

AW: Statisch reagieren auf dynamische Werte
18.07.2007 00:06:03
Born
Hallo Daniel,
leider ist es ein bisschen schwieriger, als mit einer wenn-Formel zu lösen.
Durch die Array-Formel ist das Signal für die Bedingung in Spalte B nicht immer
an derselben Stelle.
Trotzdem DAnke,
Born

AW: Statisch reagieren auf dynamische Werte
18.07.2007 19:58:00
Daniel
Hi
du musst die Formel ja auch über den ganzen bereich nach unten kopieren (bis zur letzten Zelle in Spalte D). dann spielt es keine Rolle mehr, wo die 100 aufraucht.
Array-Formeln kann ich in deiner Problemstellung leider nicht erkennen, aber eigentlich ist es ja auch egal, durch was für eine formel die 100 erzeugt wird.
Gruß, Daniel

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige