Discussion:
[Exc 97] letzten Wert einer Zeile auslesen und kopieren
(zu alt für eine Antwort)
E.Wöger
2014-01-08 16:31:50 UTC
Permalink
Hallo mal wieder,

in einer Zeile 13 stehen von C bis M Formeln "=B78"..."=L78" und übernehmen die dort stehenden Werte.
In Zelle N13 soll nun immer der letzte - von links nach rechts - jeweils aktualisierte Wert der Zeile 13 als WERT erscheinen, ohne Formel.
Schön wäre das als Zusatz in einem Makro in VB der Version Excel 97.
Habe schon viel gegoogelt, aber nichts passendes gefunden.
Hoffe, Ihr könnt mir auch diesmal helfen.

mfg Erich Wöger
Claus Busch
2014-01-08 16:40:04 UTC
Permalink
Hallo Erich,
Post by E.Wöger
in einer Zeile 13 stehen von C bis M Formeln "=B78"..."=L78" und übernehmen die dort stehenden Werte.
In Zelle N13 soll nun immer der letzte - von links nach rechts - jeweils aktualisierte Wert der Zeile 13 als WERT erscheinen, ohne Formel.
Schön wäre das als Zusatz in einem Makro in VB der Version Excel 97.
dann musst du auf Zeile 78 zurgreifen. Rechtsklick auf den
Tabellenblattreiter => Code anzeigen und Code in das Codefenster
einfügen:

Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("B78:L78")) Is _
Nothing Then Exit Sub

Range("M13") = Target.Value
End Sub



Mit freundlichen Grüßen
Claus
--
Win XP Prof SP3 / Vista Ultimate SP2
Office 2003 SP3 /2007 Ultimate SP3
E.Wöger
2014-01-08 18:17:38 UTC
Permalink
Hallo Claus,
Post by Claus Busch
Hallo Erich,
Post by E.Wöger
in einer Zeile 13 stehen von C bis M Formeln "=B78"..."=L78" und übernehmen die dort stehenden Werte.
Ich muß ergänzen : in Zeile 78 stehen auch Formeln, die Zahlen als Differenz zweier anderer Zellen anzeigen.
Kann es sein, daß deshalb in N13 nichts angezeigt wird wegen ..Is Nothing .. im Code?
Da diese Zahlen in Z13 aber um eine Spalte versetzt von Z 78 angezeigt werden, müßte ich die Zeile 13 auswerten.
Post by Claus Busch
Post by E.Wöger
In Zelle N13 soll nun immer der letzte - von links nach rechts - jeweils aktualisierte Wert der Zeile 13 als WERT erscheinen, ohne Formel.
Schön wäre das als Zusatz in einem Makro in VB der Version Excel 97.
dann musst du auf Zeile 78 zurgreifen. Rechtsklick auf den
Tabellenblattreiter => Code anzeigen und Code in das Codefenster
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("B78:L78")) Is _
Nothing Then Exit Sub
Range("M13") = Target.Value
End Sub
Wenn ich den Code in das Code-Fenster einfüge, ergibt das

Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
|
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("B78:L78")) Is _
Nothing Then Exit Sub

Range("M13") = Target.Value
End Sub

Also zwei zusätzliche Zeilen oben
Kopiere ich den Code zwischen Zeile 1 und 2 kommt Fehlermeldung "End Sub erwartet", obwohl jetzt ein zweites End Sub darunter steht.
Kommentiere ich die ersten zwei Zeilen aus, kommen zwar keine Fehlermeldungen, aber in ZN13 wird auch nichts angzeigt.

Kannst Du mein Unwissen da berichtigen?

Gruß Erich
Claus Busch
2014-01-08 18:36:25 UTC
Permalink
Hallo Erich,
Post by E.Wöger
Ich muß ergänzen : in Zeile 78 stehen auch Formeln, die Zahlen als Differenz zweier anderer Zellen anzeigen.
Kann es sein, daß deshalb in N13 nichts angezeigt wird wegen ..Is Nothing .. im Code?
Da diese Zahlen in Z13 aber um eine Spalte versetzt von Z 78 angezeigt werden, müßte ich die Zeile 13 auswerten.
dieses Nothing im Code ist dazu da, dass der Code nicht ausgeführt wird,
wenn keine Zelle im Bereich B78:K78 geändert wird. Zeile 13 könntest du
nur über Worksheet_Calculate auswerten, aber dann kannst du nicht auf
die zuletzt aktualisierte Zelle zugreifen. Es muss also Zeile 78 sein.
Post by E.Wöger
Wenn ich den Code in das Code-Fenster einfüge, ergibt das
Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
|
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("B78:L78")) Is _
Nothing Then Exit Sub
Range("M13") = Target.Value
End Sub
Also zwei zusätzliche Zeilen oben
Kopiere ich den Code zwischen Zeile 1 und 2 kommt Fehlermeldung "End Sub erwartet", obwohl jetzt ein zweites End Sub darunter steht.
Kommentiere ich die ersten zwei Zeilen aus, kommen zwar keine Fehlermeldungen, aber in ZN13 wird auch nichts angzeigt.
Wenn du einen Rechtsklick auf den Tabellenblattreiter machst und Code
anzeigen auswählst, bekommst du ein leeres Codefenster.
Gehst du zuerst in den Editor und wählst dort Worksheet ergänzt sich das
SelectionChange automatisch. Aber dieses Event reagiert auf Anwählen
einer Zelle und nicht auf eine Änderung. Es ist also das falsche Event.
End Sub darf nur am Ende einer Prozedur vorkommen, zweimal untereinander
ergibt auch diesen Fehler. Außerdem dürftest du nur die Zeilen zwischen
Private Sub.... und End Sub einfügen.

Ich habe meine Antwort wie immer getestet und es ist egal, ob in Zeile
78 Werte und Formeln vorkommen. Der Wert, der geändert wird erscheint in
M13.
Oder willst du die geänderten Formel-Ergebnisse im M13? Dann müsste man
wissen, welche Formeln wo stehen und auf welche Zellen sie zugreifen, so
dass man z.B. bei einer Änderung in C78 weiß, dass dann das Ergebnis in
E78 geändert wird.


Mit freundlichen Grüßen
Claus
--
Win XP Prof SP3 / Vista Ultimate SP2
Office 2003 SP3 /2007 Ultimate SP3
E.Wöger
2014-01-09 01:15:02 UTC
Permalink
Hallo Claus,
Post by Claus Busch
Hallo Erich,
Post by E.Wöger
Ich muß ergänzen : in Zeile 78 stehen auch Formeln, die Zahlen als Differenz zweier anderer Zellen anzeigen.
Kann es sein, daß deshalb in N13 nichts angezeigt wird wegen ..Is Nothing .. im Code?
Da diese Zahlen in Z13 aber um eine Spalte versetzt von Z 78 angezeigt werden, müßte ich die Zeile 13 auswerten.
dieses Nothing im Code ist dazu da, dass der Code nicht ausgeführt wird,
wenn keine Zelle im Bereich B78:K78 geändert wird. Zeile 13 könntest du
nur über Worksheet_Calculate auswerten, aber dann kannst du nicht auf
die zuletzt aktualisierte Zelle zugreifen. Es muss also Zeile 78 sein.
Post by E.Wöger
Wenn ich den Code in das Code-Fenster einfüge, ergibt das
Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
|
End Sub
Also zwei zusätzliche Zeilen oben
Kopiere ich den Code zwischen Zeile 1 und 2 kommt Fehlermeldung "End Sub erwartet", obwohl jetzt ein zweites End Sub darunter steht.
Kommentiere ich die ersten zwei Zeilen aus, kommen zwar keine Fehlermeldungen, aber in ZN13 wird auch nichts angzeigt.
Wenn du einen Rechtsklick auf den Tabellenblattreiter machst und Code
anzeigen auswählst, bekommst du ein leeres Codefenster.
Eben nicht. Da bekomme ich das Fenster mit den zwei vorgegebenen Zeilen und dazwischen blinkendem Curser
Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
|
End Sub
Im Declarationsfeld steht : Change. Auswählbar wäre : Activate, BeforeDoppelClick, BeforeRightClick, Calculate, Change, Deactivate, SelectionChange. liegt da ev. das Problem?
Post by Claus Busch
Gehst du zuerst in den Editor und wählst dort Worksheet * in meinem Fall > Tabelle6 EinAus < *
ergänzt sich das > SelectionChange automatisch.
Nein. Dann erhalte ich ein leeres Fenster
Post by Claus Busch
Aber dieses Event reagiert auf Anwählen
einer Zelle und nicht auf eine Änderung. Es ist also das falsche Event.
End Sub darf nur am Ende einer Prozedur vorkommen, zweimal untereinander
ergibt auch diesen Fehler. Außerdem dürftest du nur die Zeilen zwischen
Private Sub.... und End Sub einfügen.
Ich habe meine Antwort wie immer getestet und es ist egal, ob in Zeile
78 Werte und Formeln vorkommen. Der Wert, der geändert wird erscheint in
M13.
Oder willst du die geänderten Formel-Ergebnisse im M13? * es muß N 13 sein *
Ja nur die durch Formelübernahme geänderten Werte der Zeile 13 in N13

Dann müsste man
Post by Claus Busch
wissen, welche Formeln wo stehen und auf welche Zellen sie zugreifen, so
dass man z.B. bei einer Änderung in C78 weiß, dass dann das Ergebnis in
E78 geändert wird.
Ich versuche das nochmal besser zu erläutern :

In Zelle A80 erscheint als Übernahme aus Blatt 1 mit =kap106!L18 der letzte dort manuell eingegebene Stand.
Über mein Makro wird dieser Wert ohne Formel nach A79 und B13 kopiert
In Zeile 79 B bis M wird die Differenz mit =WENN(B79>0;B14-B76;0) alter Stand zu neuem Stand gebildet.
In Zeile 13 erscheint dann in Zelle C13 (nächster Monat) mit =B78 .. bis L78 der reduzierte neue Stand.
Und hier soll jetzt das neue Makro den jeweils letzten Wert (je nach Monat) in die Zelle N13 als Wert ohne Formel kopieren.
Die Zeilen 78 und 13 ändern sich also nicht durch Eingabe, sondern über die Formeln.

In zwei Versuchen hab ich jetzt mal Deinen Code ( geändert auf meine Zellen) einmal in ein Fenster über den Blattreiter "EinAus" mit den vorgegebenen Zeilen,
dann über das Fenster über den Editor "Tabelle6 EinAus" ohne diese Zeilen einkopiert, aber leider wird in Zelle N13 nichts angezeigt. Die Zelle N13 wird aber nicht mehr mit den Koordinaten N13, sondern mit table_3 angezeigt.

Der geänderte Code ist z.Zt. :

Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("B78:M78")) Is _
Nothing Then Exit Sub

Range("N13") = Target.Value
End Sub

Ich hoffe, das hilft etwas weiter.
mfg Erich Wöger
Claus Busch
2014-01-09 07:56:21 UTC
Permalink
Hallo Erich,
Post by E.Wöger
Eben nicht. Da bekomme ich das Fenster mit den zwei vorgegebenen Zeilen und dazwischen blinkendem Curser
Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
|
End Sub
Im Declarationsfeld steht : Change. Auswählbar wäre : Activate, BeforeDoppelClick, BeforeRightClick, Calculate, Change, Deactivate, SelectionChange. liegt da ev. das Problem?
das soll eigentlich eine Arbeitserleichterung sein. Aber für dich ist
das Event SelectionChange nicht brauchbar. Daher kannst du diese beiden
Zeile einfach löschen.
Post by E.Wöger
Ja nur die durch Formelübernahme geänderten Werte der Zeile 13 in N13
Dann hast du für dein Problem Pech. Bei Worksheet_Calculate werden ja
alle Zellen mit Formeln neu berechnet und da ist nicht herauszufinden,
welche Zelle die letzte geänderte ist.
Wenn du die Zellen überwachen könntest, die die Änderung der Formeln
durch Änderung ihrer Werte hervorrufen, wäre es leicht.


Mit freundlichen Grüßen
Claus
--
Win XP Prof SP3 / Vista Ultimate SP2
Office 2003 SP3 /2007 Ultimate SP3
Claus Busch
2014-01-09 09:53:14 UTC
Permalink
Hallo Erich,
Post by Claus Busch
Wenn du die Zellen überwachen könntest, die die Änderung der Formeln
durch Änderung ihrer Werte hervorrufen, wäre es leicht.
es geht auch anders, aber dafür etwas komplizierter.
In ein neues Standardmodul:

Option Explicit
Public arrOld() As Variant
Public arrNew() As Variant

Sub AlteWerte()
Dim rngC As Range
Dim i As Long
ReDim Preserve arrOld(0 To 9)
For Each rngC In Sheets("Tabelle2").Range("C13:L13")
arrOld(i) = rngC
i = i + 1
Next
End Sub

Sub NeueWerte()
Dim rngC As Range
Dim i As Long
ReDim Preserve arrNew(0 To 9)
For Each rngC In Sheets("Tabelle2").Range("C13:L13")
arrNew(i) = rngC
i = i + 1
Next
For i = LBound(arrNew) To UBound(arrNew)
If arrNew(i) <> arrOld(i) Then
Sheets("Tabelle2").Range("N13") = arrNew(i)
Exit For
End If
Next
End Sub

In das Codemodul "DieseArbeitsmappe":

Private Sub Workbook_Open()
Call AlteWerte
End Sub

In das Codemodul des Blattes:

Private Sub Worksheet_Calculate()
Call NeueWerte
End Sub

Du musst nur in den Makros AlteWerte und NeueWerte den Namen des
entsprechenden Tabellenblattes korrigieren.


Mit freundlichen Grüßen
Claus
--
Win XP Prof SP3 / Vista Ultimate SP2
Office 2003 SP3 /2007 Ultimate SP3
E.Wöger
2014-01-09 19:07:53 UTC
Permalink
Hallo Claus,
Post by Claus Busch
Hallo Erich,
es geht auch anders, aber dafür etwas komplizierter.
Habe 1. In ein neues Modul 12 dies kopiert, aber mit geändertem Range("b13:m13") und geänderter Nextzahl (0 to 11), weil ja 12 felder - von B bis M - abgefragt werden sollen
2. Tabellennamen geändert auf "EinAus"
Post by Claus Busch
Option Explicit
Public arrOld() As Variant
Public arrNew() As Variant
Sub AlteWerte()
Dim rngC As Range
Dim i As Long
ReDim Preserve arrOld(0 To 9) *(0 To 11) *
For Each rngC In Sheets("Tabelle2").Range("C13:L13") * Sheets("EinAus").Range("b13:m13")*
arrOld(i) = rngC
i = i + 1
Next
End Sub
Sub NeueWerte()
Dim rngC As Range
Dim i As Long
ReDim Preserve arrNew(0 To 9) * (0 To 11) *
For Each rngC In Sheets("Tabelle2").Range("C13:L13") * Sheets("EinAus").Range("b13:m13")*
arrNew(i) = rngC
i = i + 1
Next
For i = LBound(arrNew) To UBound(arrNew)
If arrNew(i) <> arrOld(i) Then
Sheets("Tabelle2").Range("N13") = arrNew(i) *Sheets("EinAus") *
Exit For
End If
Next
End Sub
3. bei mir "kap14a"
Post by Claus Busch
Private Sub Workbook_Open()
Call AlteWerte
End Sub
4. Blatt "EinAus"
Post by Claus Busch
Private Sub Worksheet_Calculate()
Call NeueWerte
End Sub
Du musst nur in den Makros AlteWerte und NeueWerte den Namen des
entsprechenden Tabellenblattes korrigieren.
Beim ersten Start von Excel, Tabelle kap14a erscheint Fehlermeldung :

[ Laufzeitfehler 9
"Index ausserhalb des gültigen Bereichs" ]

Mit Testen ist die Zeile " If arrNew(i) <> arrOld(i) Then " markiert.

Desgleichen wenn ich versuche, mein Makro zu starten.

Was ich dabei eventuell falsch mache, weiß ich nicht.

So kam ich nicht weiter und habe die beiden Code-Einträge wieder gelöscht, damit ich wenigstens meine Tabelle wieder bearbeiten konnte.
Wenn ich nur das Modul 12 manuell starte und mit schrittweise-testen die Variablen arrOld(i) und rngC überwache, erscheinen da nacheinander die Werte aus Zeile 13, aber am Ende der For-Next-Schleife sind die dann auf 0.

Dann hab ich mich mal mit der rechten Hand am linken Ohr gekratzt und es wie zu DOS-Zeiten mit Tabellenformeln probiert mit einer Abfrage von rückwärts :

1. in Zelle O13 : =WENN(M13<>0;M13;WENN(L13<>0;L13;WENN(K13<>0;K13;WENN(J13<>0;J13;WENN(I13<>0;I13;WENN(H13<>0;H13;WENN(G13<>0;G13;WENN(F13<>0;F13;0))))))))

(Weil diese Art bei Exc 97 anscheinend nur max 7 Verschachtelungen zuläßt ),
daher den Rest

2. in Zelle P13 : =WENN(F13<>0;F13;WENN(E13<>0;E13;WENN(D13<>0;D13;WENN(C13<>0;C13;WENN(B13<>0;B13;)))))

und jetzt in der von mir gewünschten Zelle N13 : =WENN(O13<>0;O13;WENN(P13<>0;P13;"KONTO ?"))

Zu meiner Verblüffung haut das so hin. ich bekomme in N13 immer den letzten Wert von Zeile 13.
Weils halt in meinem Fall nur eine Zeile mit zwölf Zellen sind !

Jetzt bedanke ich mich nochmal für Deine Mühe, die Du Dir mit meinem Problem gemacht hast.
Wenn Du dennoch das noch auf Deine Weise lösen willst, bin ich gerne bereit, das in einer Parallel-Tabelle weiter zu testen um noch dazu zu lernen. Befürchte nur, mit 86 ist man für programmieren lernen einfach zu alt ;-).
Ansonsten können wir den Thread beenden.
Mit freundlichem Gruß

Erich Wöger
Claus Busch
2014-01-09 19:14:50 UTC
Permalink
Hallo Erich,
Post by E.Wöger
Habe 1. In ein neues Modul 12 dies kopiert, aber mit geändertem Range("b13:m13") und geänderter Nextzahl (0 to 11), weil ja 12 felder - von B bis M - abgefragt werden sollen
2. Tabellennamen geändert auf "EinAus"
ich habe deine Mappe nicht und kann deswegen zu dem Fehler nichts sagen.
Bei mir ist alles getestet und läuft einwandfrei. Die beiden Makros
werden beim Öffnen der Mappe und dann beim Berechnen der Mappe
ausgeführt. Du hättest also nach dem Einfügen des Codes zuerst einmal
die Mappe wieder schließen und speichern sollen.
Post by E.Wöger
1. in Zelle O13 : =WENN(M13<>0;M13;WENN(L13<>0;L13;WENN(K13<>0;K13;WENN(J13<>0;J13;WENN(I13<>0;I13;WENN(H13<>0;H13;WENN(G13<>0;G13;WENN(F13<>0;F13;0))))))))
das ist aber kompliziert.
Probiers doch einfach so:
=VERWEIS(2;1/(B13:M13);B13:M13)


Mit freundlichen Grüßen
Claus
--
Win XP Prof SP3 / Vista Ultimate SP2
Office 2003 SP3 /2007 Ultimate SP3
E.Wöger
2014-01-09 23:05:33 UTC
Permalink
Post by Claus Busch
Hallo Erich,
Post by E.Wöger
Habe 1. In ein neues Modul 12 dies kopiert, aber mit geändertem Range("b13:m13") und geänderter Nextzahl (0 to 11), weil ja 12 felder - von B bis M - abgefragt werden sollen
2. Tabellennamen geändert auf "EinAus"
Du hättest also nach dem Einfügen des Codes zuerst einmal
die Mappe wieder schließen und speichern sollen.
Das hab ich natürlich sogar mehrmals gemacht, aber immer das gleiche Ergebnis
Post by Claus Busch
Post by E.Wöger
1. in Zelle O13 : =WENN(M13<>0;M13;WENN(L13<>0;L13;WENN(K13<>0;K13;WENN(J13<>0;J13;WENN(I13<>0;I13;WENN(H13<>0;H13;WENN(G13<>0;G13;WENN(F13<>0;F13;0))))))))
das ist aber kompliziert.
Natürlich, stammt ja auch aus der Multiplanzeit, aber auch da mußte man sich zu helfen wissen.
Post by Claus Busch
=VERWEIS(2;1/(B13:M13);B13:M13)
Ja, das wäre die Lösung gewesen.

Meine Anfrage lautete ja schon immer (Betreff) : "Letzten Wert einer Zeile auslesen und kopieren"
Kopieren ist bei Deiner Formel aber gar nicht nötig, da das Ergebnis ja in der Zelle N13 steht, in der die Formel steht.
So einfach kann eine Lösung sein, wenn man weiss wie und in der Jugend mehr gelernt hätte.

Also nochmal Danke
mfg Erich Wöger
Claus Busch
2014-01-09 19:39:31 UTC
Permalink
Hallo Erich,
Post by E.Wöger
1. in Zelle O13 : =WENN(M13<>0;M13;WENN(L13<>0;L13;WENN(K13<>0;K13;WENN(J13<>0;J13;WENN(I13<>0;I13;WENN(H13<>0;H13;WENN(G13<>0;G13;WENN(F13<>0;F13;0))))))))
ich dachte, dass du die zeitlich zuletzt geänderte Zelle suchst. Hättest
du gleich gesagt, dass du die letzte Zelle <>0 in dieser Zeile suchst,
wären wir schon lange fertig.
Probiere es so im Codemodul des Tabellenblattes:

Private Sub Worksheet_Calculate()
Dim i As Long

For i = 13 To 2 Step -1
If Cells(13, i) <> 0 Then
Range("N13") = Cells(13, i)
Exit For
End If
Next
End Sub


Mit freundlichen Grüßen
Claus
--
Win XP Prof SP3 / Vista Ultimate SP2
Office 2003 SP3 /2007 Ultimate SP3
E.Wöger
2014-01-09 23:38:31 UTC
Permalink
Hallo Claus,
Post by Claus Busch
Hallo Erich,
Post by E.Wöger
1. in Zelle O13 : =WENN(M13<>0;M13;WENN(L13<>0;L13;WENN(K13<>0;K13;WENN(J13<>0;J13;WENN(I13<>0;I13;WENN(H13<>0;H13;WENN(G13<>0;G13;WENN(F13<>0;F13;0))))))))
ich dachte, dass du die zeitlich zuletzt geänderte Zelle suchst. Hättest
du gleich gesagt, dass du die letzte Zelle <>0 in dieser Zeile suchst,
wären wir schon lange fertig.
Na dann schau mal in die Betreffzeile :
Meine Anfrage lautete ja schon immer : "Letzten Wert einer Zeile auslesen und kopieren"

Am 8.1.14 schrieb ich in einem Re.
"In Zelle N13 soll nun immer der letzte - von links nach rechts - jeweils aktualisierte Wert der Zeile 13 als WERT erscheinen, ohne Formel."

Und in einem Re. vom 9.1.14 erläuterte ich nochmal:
"Und hier soll jetzt das neue Makro den jeweils letzten Wert (je nach Monat) in die Zelle N13 als Wert ohne Formel kopieren."
Post by Claus Busch
Private Sub Worksheet_Calculate()
Dim i As Long
For i = 13 To 2 Step -1 '* diese Zeile von 13 nach 2 rückwärts ist vermutlich des Pudels Kern *
If Cells(13, i) <> 0 Then
Range("N13") = Cells(13, i)
Exit For
End If
Next
End Sub
Jawohl, das ist sogar noch besser, weil dann in N13 nur der Wert ohne Formel steht.
Das werde ich jetzt verwenden.

Es tut mir leid, wenn meine erste Anfrage mißverständlich war.
Aber damit können wir den Thread jetzt auch beenden.

Nochmals vielen Dank für Deine Mühe.
Mit freundlichem Gruß

Erich Wöger

Loading...