VBA-Code für bestimmten Zellbereich
Hallo Exel-Fans,
irgendwo im WWW hab ich eine tolle Formel zur Vereinfachung von Uhrzeiteingaben gefunden. Die Anwendung der Formel war vom Urheber grundsätzlich auf die Spalte A begrenzt. Ich wollte die Formel nun für einen Bereich gültig machen und habe ein wenig rumprobiert. Siehe hier:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim s%, m%
'Soll nur bei einer Eingabe in Spalte A wirksam werden:
'If Target.Column <> 1 Then Exit Sub
If Target.Column > 4 And Target.Column < 10 _
And Target.Row < 7 And Target.Row > 26 Then Exit Sub
With Cells(Target.Row, Target.Column)
If .Value = "" Then Exit Sub
Application.EnableEvents = False
If IsNumeric(.Value) And InStr(.Value, ":") = 0 And InStr(.Value, ",") = 0 Then
'.NumberFormat = "[hh]:mm"
'auskommentiert, weil Sheet geschützt und die Feldeigenschaft deshalb nicht gändert werden kann
If Len(.Value) > 2 Then
s = Left(.Value, Len(.Value) - 2)
m = Right(.Value, 2)
Else
s = .Value
m = 0
End If
.Value = s & ":" & m
End If
End With
Application.EnableEvents = True
End Sub
Nehmen wir an, die Eingabeformatierung soll in der Matrix E8:I25 wirksam sein... wie muß ich den Code verändern? Ich habe mich in Zeile 5 u. 6 des Codings probiert, aber so funzt das nicht. Wer kann helfen?
Danke und Gruß
Torsten
Antwort schreiben
Antwort 1 von aiuto vom 21.12.2019, 23:57 Options
Hi Torsten
versuch es so:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim s%, m%
If Intersect([E8:I45], Target) Is Nothing Then Exit Sub
With Cells(Target.Row, Target.Column)
If .Value = "" Then Exit Sub
Application.EnableEvents = False
If IsNumeric(.Value) And InStr(.Value, ":") = 0 And InStr(.Value, ",") = 0 Then
'.NumberFormat = "[hh]:mm"
'auskommentiert, weil Sheet geschützt und die Feldeigenschaft deshalb nicht gändert werden kann
If Len(.Value) > 2 Then
s = Left(.Value, Len(.Value) - 2)
m = Right(.Value, 2)
Else
s = .Value
m = 0
End If
.Value = s & ":" & m
End If
End With
Application.EnableEvents = True
End Sub
mfg
vom Helfer
Antwort 2 von Tomschi vom 27.12.2019, 11:18 Options
Hi aiuto alias Helfer!
Toll, was Du da gemacht hast.
Eine Frage noch:
Wenn mehrere Bereiche als Eingabfelder definiert sind, wie muss dann der Code aussehen?
z. B. A1:B10 und D1:E10
Ciao
Tom
Antwort 3 von aiuto vom 27.12.2019, 11:43 Options
Hallo Tom,
ersetze:
Zitat:
If Intersect([E8:I45], Target) Is Nothing Then Exit Sub
für den Bereich "E8:i45" durch
If Intersect(Union([A1:B10], [D1:E10]), Target) Is Nothing Then Exit Sub
für die Bereiche A1:B10
UND D1:E10
viel Erfolg
vom Helfer
Antwort 4 von rainberg vom 27.12.2019, 11:45 Options
Hallo Tom,
ich würde diese Zeile ändern
If Intersect([E8:I45], Target) Is Nothing Then Exit Sub
in
If Intersect([Target,Range("A1:B10,D1:E10")) Is Nothing Then Exit Sub
Gruß
Rainer
Antwort 5 von rainberg vom 27.12.2019, 11:50 OptionsLösung
natürlich so
If Intersect(Target,Range("A1:B10,D1:E10")) Is Nothing Then Exit Sub
Gruß
Rainer
Antwort 6 von Tomschi vom 27.12.2019, 13:04 Options
Mahlzeit Ihr beiden!
Ich weiss zwar weder was genau
If Intersect(Union([A1:B10], [D1:E10]), Target) Is Nothing Then Exit Sub
noch
If Intersect(Target,Range("A1:B10,D1:E10")) Is Nothing Then Exit Sub
macht, aber es klingt interessant und ich werde es wahrscheinlich in eine meiner bestehenden Dateien einbauen.
Wo liegt der gravierende Unterschied?
Nur für mich zum Verständnis:
intersect = ?
union = ?
target = ?
Gehe ich recht in der Annahme, dass der Code nur dann (für den entsprechenden Bereich) funktioniert, wenn das Zellenformat "[hh]:mm" ist?
Sorry, für die vielen Fragen, aber dieses Thema interessiert mich schon lange.
LieGrü
Tom
Antwort 7 von rainberg vom 28.12.2019, 09:52 Options
Hallo Tom,
ich stecke auch nicht tief in der VBA-Materie drin und kann Dir deshalb die Union- und die Intersect-Methode nicht besser erklären, wie es in der VBA-Hilfe steht.
Zitat:
Wo liegt der gravierende Unterschied?
..ich weiß nicht ob es da einen gravierenden Unterschied gibt, was mich betrifft, so begenze ich Ranges immer auf die Art, wie ich es oben getan habe, Union setze ich dazu nicht ein.
Und was " Target " betrifft, so übersetze es einfach mit "Ziel"
Target.Address ---> Zieladresse
Target.Row ---> Zielzeile
Target.Value ---> Zielwert
Target.Range ---> Zielbereich usw.
Vielleicht helfen Dir diese Brocken über's Gröbste hinweg.
Gruß
Rainer
Antwort 8 von Tomschi vom 28.12.2019, 15:43 Options
Hi Rainer!
Danke für die Infos.
Die VBA-Hilfe gibt dazu leider auch nicht sehr viel her.
Zumindest nicht so, dass ich es 100%ig verstehe.
Naja, Hauptsache das Makro kann ich einsetzen.
Ciao
Tom
Antwort 9 von aiuto vom 28.12.2019, 16:55 Options
Hallo Tom,
das ist an sich recht einfach:
Intersect liefert einen Bereich von rechtwinkligen Überschneidungen (Schnittmenge) von zwei oder mehr Bereichen, oder ggf. Nichts = Nothing.
Union() vereinigt ebenso wie Range(bereich1,bereich2,bereich3) zu einer Bereichseinheit. Die Angabe [A1] entspricht Range("A1").
Target ist ebenfalls ein Zell-Bereich und wird der Prozedur beim Aufruf (ByVal Target As Range) übergeben; es referenziert (im Falle des 'Worksheet_Change'-Ereignises) de(n)(i) zuletzt veränderte(n) Zelle(n).
Ich hoffe hiermit etwas zum Verständnis beizutragen
mfg
vom Helfer
Antwort 10 von aiuto vom 28.12.2019, 17:29 Options
Ergänzung:
Union() verbindet zwei oder mehr Bereiche zu einer Einheit,
die Range-Methode erlaubt dagegen nur einen oder 2 Bereiche.
Der genannte Ansatz
Zitat:
Range(bereich1,bereich2,bereich3)
schlägt wegen des 3. Argumentes dagegen (bei Excel2000) fehl.
Antwort 11 von Tomschi vom 30.12.2019, 10:35 Options
Hi aiuto!
Herzlichen Dank für die "Aufklärung"
Danke für den Hinweis mit dem Range-Bereich und den maximal definierbaren Bereichen.
Ich muss meinen Code so anpassen, dass er für ca. 25. Bereiche innerhalb eines Tabellenblattes passt.
Verstehe ich richtig
If Intersect(Union([A1:B10], [D1:E10], [G1:H10], [M1:N10]), Target) Is Nothing Then Exit Sub = Beispiel
Ciao
Tom
Antwort 12 von fantalight vom 30.12.2019, 14:26 Options
Tja, die Feiertage...
...waren so anstrengend ;-) dass ich es nicht mal bis hieher ins Forum geschafft habe. Toll was zwischenzeitlich in meinem Thread hier alles geschrieben wurde: Lösungen und gute Erklärungen. VIELEN DANK AN ALLE BETEILIGTEN!
Bewertungen folgen prompt!
Gruß und guten Rutsch!
Torsten
Antwort 13 von Tomschi vom 01.01.2020, 11:02 Options
Wünsche (zum ersten Mal im Jahr 2008) einen wunderschönen guten Morgen!
Zwei Fragen:
a)
Ich habe den Code aus Antwort1 in meine Excel-Datei eingepflegt.
Dabei ist mir folgendes aufgefallen:
Gibt man z. B. 123 ein, so wird daraus 1:23.
Soweit so gut.
Lautet die Eingabe jedoch z. B. nur 1, dann macht der Code daraus 1:00 und nicht 0:01. Ist dies so gewünscht?
b)
Bis dato habe ich einen Gültigkeitsbereich für die "Uhrzeit-Zelle" mit
Minimum 00:00 und
Maximum 24:00 festgelegt.
Diese kann ich jedoch nicht verwenden, wenn der User z. B. 123 eingeben darf.
Da es sich dabei um sehr, sehr viele Zellen (auf verschiedenen Blättern) handelt, die entsprechend geändert werden müssten, möchte ich gerne wissen, ob die Möglichkeit besteht zwei Gültigkeitsbereiche zu definieren.
Ich habe dabei an "Benutzerdefiniert" gedacht.
Die Eingabe soll von 00:00 - 24:00 und 1 2359 möglich sein.
Kann man dies umsetzen?
Ciao
Tom
Antwort 14 von fantalight vom 02.01.2020, 09:10 Options
@Tomschi:
Nachdem noch niemand von den Profis geantwortet hat, mal ein Versuch von mir:
zu a) Ja, es ist offenbar so gewünscht oder anders ausgedrückt.. die Funktion läßt es momentan nicht zu, dass die Eingabe 1 zu 00:01 führt. Man kann halt nicht alles haben! Bei Uhrzeiten unter 1:00 muß man minimal die 0: mit eingeben. Die Funktion soll sicherstellen, dass kein Doppelpunkt und ganze Stunden notfalls auch nur 2stellig eingegeben werden können. Ich sehe hierin den größeren Vorteil, weil die Summe (oder besser die Anzahl) der Zeiten über 1:00 bei meinen Einträgen größer ist, als die Anzahl der Zeiten unter 1:00. Im Grunde geht es um doch eine Zeitersparnis bei der Eingabe.
Hilfreich wäre jedoch, wenn die Eingabe 002 oder auch 0002 zum Ergebnis 00:02 führen würde. Dies ist aber derzeit wohl nicht der Fall, weil die Zeile: If Len(.Value) > 2 Then wohl keine führenden Nullen interpretiert und bei zuvor genannter Eingabe die Länge des Wertes mit 1 annimmt. Ich bin allerdings nicht so VBA-fit, um dies zu ändern.
zu b) Das mit dem Gültigkeitsbereich ist mir schleierhaft. Ich habe in einer Exel-Tabelle in der Arbeit (auf die ich jetzt leider keinen Zugriff habe) genau den gleichen Gültigkeitsbereich wie von Dir angegeben deklariert und die Funktion arbeitet da einwandfrei. Beim Nachstellen hier auf meinem Heimrechner soeben, konnte ich jedoch genau den gleichen Effekt wie von Dir beschrieben nachvollziehen. Vielleicht kann ja zwischenzeitlich jemand anderes bei diesem Problem helfen.
Gruß
torsten
Antwort 15 von Tomschi vom 03.01.2020, 08:41 Options
Hallo Torsten!
Danke für Deine Rückmeldung.
Bei mir kommt es eben oft vor, dass Werte unter einer Stunde anfallen und somit wäre es für mich interessanter, wenn eben die Zeit als Minuten interpretiert würde.
Ich glaube wenn man bei
Else
s = .Value
m = 0
End If
s und m vertauscht, dann ist dies für mich okay.
Ciao
Tom
Antwort 16 von fantalight vom 03.01.2020, 09:33 Options
Hallo Tom!
Stimmt! Dein Ansatz funzt!
VBA kann so einfach sein. ;-)
Nachteil ist dann nur, dass bei ganzen Stunden mindestens 3 Zahlen eingegeben werden müssen (voher reichte 1 Zahl). Das ist IMHO aber vertretbar. Allerdings hätten wir in der Zeit, in der wir uns hier mit dem Problem befassen, auch eine ganze Menge Uhrzeiten mit Doppelpunkt eingeben können ;-))
Hat aber trotzdem hier Spaß gemacht!
Gruß
Torsten
Antwort 17 von Tomschi vom 03.01.2020, 12:24 Options
Mahlzeit!
Danke für Deine Rückmeldung.
Dein Argument ist sicherlich auch nicht von der Hand zu weisen.
Jetzt bleibt nur noch der Punkt b) aus Antwort 13 offen.
Ciao
Tom