Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

Flexiblen Maximalwert speichern
#1
Guten Abend,

als Neuling im Forum möchte ich mich kurz vorstellen:
Mechaniker, 30+, MAC (privat) und Windows (Arbeit) User
Grundkenntnisse in der VBA Programmierung mangelhaft, sonstige Formelnutzung in Excel geht so. Ich komme mit Excel zurecht, kann Tabellen erstellen und habe mich an erste VBA Projekte gewagt.

Ich habe Tabellen zur Zeitenübersicht größerer Events erstellt, die soweit auch sehr gut funktionieren. Ziel ist es. zu jeder Zeit eine konkrete Restzeitangabe zu haben.

Ein Teil der Zeiten entsteht durch Beanstandungen, die bei Inspektionen festgehalten werden. Sie werden in der Tabelle mit der geschätzten Arbeitszeit notiert und entsprechend in einer Übersicht als Gesamtzeit angezeigt.
Wurden Teilbereiche oder gewisse Arbeitsschritte erledigt, schrumpft die Restzeit natürlich. Wenn das Event fertig ist, steht in der Übersicht idealerweise eine Null. Grob umschrieben hoffe ich, dass ihr wisst was ich meine.

Mein Ziel ist jetzt noch, die Maximalzeiten in einer Extraspalte festgehalten werden:

Arbeit XY,    Dauer   5:00hrs

Wenn jetzt ein Teil abgearbeitet wurde:

Arbeit XY, Dauer   2:00hrs

Ich möchte gerne die 5:00hrs in einer weiteren Zelle speichern, damit man am Ende die tatsächlich geleistete Arbeitszeit nachweisen kann.

Da die Arbeitszeiten auch nach Fakultät unterschieden werden, lasse ich mir die Autosumme von G10-L10 zusammenrechnen und sie in N10 anzeigen. Und genau diesen  Wert, der variieren kann, möchte ich in M10 speichern. (Zeile 10 ist die oberste und es geht bis 250)

Ich habe ein VBA dazu gefunden, was auch in seiner Weise super funktioniert, allerdings bekomme ich es nicht hin, es auf meine Range umzustellen:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim iRow As Integer
If Intersect(Target, Range("A1:A5")) Is Nothing Then Exit Sub
For iRow = 1 To 5
    Cells(iRow, 5) = WorksheetFunction.Max(Cells(iRow, 1).Range("A1:B1"))
Next
End Sub



Hier werden die größten Werte aus A1-A5 jeweils in B1-B5 gespeichert. War also in A1 erst eine 5, dann ein 4, wird in B1 die 5 dauerhaft gespeichert. Sollte nochmal in A1 eine Zahl >5 eingegeben, wird wieder die größere gespeichert, usw.

Ich hoffe, ihr könnt mir da weiterhelfen. Suche jetzt schon lange nach einer Lösung, bin aber in den letzten zwei Monaten nicht weitergekommen, als bis zu den Beispiel, das ich oben geschrieben habe.

VG
Nils
Antworten Top
#2
Hallo,

ich habe aus den vielen Worten folgendes herausgelesen:


Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("G10:L10")) Is Nothing Then Exit Sub 'im Bereich G10-L10 werden Eintragungen gemacht
Range("M10") = Application.Max(Range("M10"), Range("N10")) 'in Zelle M10 wird immer der Max Wert aus M10 und N1o festgehalten
End Sub
Gruß Atilla
[-] Folgende(r) 1 Nutzer sagt Danke an atilla für diesen Beitrag:
  • Letani
Antworten Top
#3
Vielen Dank für die schnelle Antwort

Der Bereich der zusammen gerechnet wird ist jeweils G-L.
Die Summe davon steht in M (mache ich über Autosumme).
Der jeweilige Max Wert von M soll dann in N gespeichert werden (sorry, da hatte ich einen Dreher drin).
Das habe ich jetzt gedreht und es funktioniert gut. Jetzt fehlt mir noch die Range Angabe für die Zeilen 10-250

Und für den ganz doofen Anfänger:
Wie hänge ich das an ein schon vorhandenes VBA?


Private Sub Worksheet_Change(ByVal Target As Range)

Dim YMax As Long, Y As Long

YMax = WorksheetFunction.Min( _
Range("F" & Rows.Count).End(xlUp).Row)

For Y = 8 To YMax

If Range("F" & Y) = "x" And Range("L" & Y) <> "" Then _
Range("L" & Y).ClearContents
If Range("F" & Y) = "x" And Range("G" & Y) <> "" Then _
Range("G" & Y).ClearContents
If Range("F" & Y) = "x" And Range("H" & Y) <> "" Then _
Range("H" & Y).ClearContents
If Range("F" & Y) = "x" And Range("I" & Y) <> "" Then _
Range("I" & Y).ClearContents
If Range("F" & Y) = "x" And Range("J" & Y) <> "" Then _
Range("J" & Y).ClearContents
If Range("F" & Y) = "x" And Range("K" & Y) <> "" Then _
Range("K" & Y).ClearContents
Next

End Sub
Sub Test()
Dim YMax As Long, Y As Long
'Letzte gefüllte Zeile ermitteln
YMax = WorksheetFunction.Min( _
Range("A" & Rows.Count).End(xlUp).Row, _
Range("B" & Rows.Count).End(xlUp).Row)
'Zeilen durchlaufen
For Y = 1 To YMax
'Lösche Inhalt von A wenn A und B nicht leer
If Range("A" & Y) <> "" And Range("B" & Y) <> "" Then _
Range("A" & Y).ClearContents
Next
End Sub
Antworten Top
#4
Hallöchen,

Die Zeilen bekommst Du z.B. so hin:

Für eine Zeile
Rows(10)

Für mehrere Zeilen
Range(Rows(10), Rows(150))

Oder in einer Schleife
For i = 10 to 150
Rows(i)...
Next


Wenn Du Code in ein vorhandenes Makro setzen willst, dann an passende Stelle zwischen ... Sub ... und End Sub.

Ein neues Makro beginnst Du z.B. mit
Sub NeuesMakro()

End Sub setzt Excel dann alleine.
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Antworten Top
#5
Hallo,

um meinen Vorschlag in Dein bestehendes Makro zu integrieren, muss eine kleine Anpassung gemacht werden
Dann so wie unten in Deinen Code einpflegen:


Code:
Private Sub Worksheet_Change(ByVal Target As Range)

Dim YMax As Long, Y As Long

If Not Intersect(Target, Range("G10:L10")) Is Nothing Then  'im Bereich G10-L10 werden Eintragungen gemacht
  Range("N10") = Application.Max(Range("M10"), Range("N10")) 'in Zelle M10 wird immer der Max Wert aus M10 und N1o festgehalten
End If

'.....Dein weiterer Code

End Sub
Was meinst Du mit den Zeilen?
Kannst Du Dein Problem nicht an einer Beispielmappe erklären?

Edit:
Ich glaube, ich habe es mit den 250 Zeilen jetzt verstanden.
Ersetze im vorigen Code meine Codezeilen mit folgenden:

Code:
If Not Intersect(Target, Range("G10:L250")) Is Nothing Then  'im Bereich G10-L250 werden Eintragungen gemacht
 Cells(Target.Row, 14) = Application.Max(Cells(Target.Row, 13), Cells(Target.Row, 14)) 'in Zelle Spalte N der gleichen Zeile wird immer der Max Wert aus Spalte M und und N der gleichen Zeile festgehalten
End If
Gruß Atilla
Antworten Top
#6
Hi,

danke erst mal für die Antworten und eure Mühe.

Ich habe ein bisschen mit euren Vorschlägen probiert, aber bin leider nicht weiter gekommen.

Ich habe jetzt mal eine Mappe angehängt, damit ihr genau seht, worum es geht.

Im Spaltenbereich G - L werden die Zeiten eingegeben, die geplant sind. Es kann nur in einer Zelle sein, oder wenn verschiedene Qualifikationen gebraucht werden auch mehrere.

Die Zeit kann sich während des Abarbeitens auch nach unten bewegen, weil z.B. ein teil schon fertig ist. Das wird dann händisch korrigiert.

In M habe ich jetzt die Autosumme für die entsprechende Zeile eingebaut.

Der schon bestehende Teil des VBA sorgt dafür, dass man mit einem "x" alle Zeiten löscht und ein weitere Teil Grün gefärbt wird. Das heißt jetzt leider, die Zeiten, die geplant waren, sind jetzt weg und nicht mehr nachvollziehbar.

Deswegen die Autosumme, von der ich in N den höchsten jemals ermittelten Wert aus M speichern möchte.

Das heißt in dem VBA Teil dafür, sollte es nur um die Spalten M und N gehen, allerdings von Zeile 10-250.

Da habe ich mich wohl etwas übermüded ausgedrückt...

Ich hatte das ja alles schonmal probiert, aber wie gesagt, den Code den ich hatte, habe ich einfach nicht auf den Bereich bekommen, den ich benötige.


Angehängte Dateien
.xls   Test Max Werte.xls (Größe: 75 KB / Downloads: 4)
Antworten Top
#7
Habs jetzt mal so probiert:

If Not Intersect(Target, Range("M10:M250")) Is Nothing Then 
  Cells(Target.Row, 14) = Application.Max(Cells(Target.Row, 13))
End If


Ich habe allerdings das Gefühl, dass das VBA ein Problem mit der Autosumme hat....

Wenn ich nämlich die Autosumme aus M rauslösche, erscheint in N auf einmal eine Zahl, wenn ich direkt danach die Autosumme wieder einfüge, dann funktioniert es genauso wie ich möchte.

Aber auch das geht dann nur einmal. Muß da dann eine Schleife rein?
Antworten Top
#8
Hallo,

ich bin davon ausgegangen, dass Du in dem Bereich G10:L250 manuell Eintragungen machst.
Der Code reagiert auf die Veränderungen in diesem Bereich.

Also bau das genauso ein, wie ich es Dir beschrieben habe.
Danach wähl eine Zelle im Bereich G10:L250 aus und gib einbe Zahl ein. Dann müsste in Spalte N das Maximum aus N und M stehen.
Gruß Atilla
Antworten Top
#9
Habs nochmal probiert. Warum auch immer, jetzt geht es.

Super, danke.

Muss es jetzt noch in den Rest der Datei einpacken und ein bisschen hübsch machen.

Vielen Dank für eure Hilfe
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste