Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1748to1752
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
Inhaltsverzeichnis

VBA Code zulangsam

VBA Code zulangsam
09.04.2020 11:50:28
Sven
Hallo zusammen,
Ich habe folgenden VBA Code der aber sehr langsam ist.

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim Zelle As Range
Dim a As Variant
Dim b As Variant
For Each Zelle In ActiveSheet.Range("Stunden")
a = Zelle.Offset(0, 1).Value
b = Zelle.Offset(0, 2).Value
'If a = "" Or IsNumeric(a) = False and b = "" Or IsNumeric(b) = False Then
If a = "" Or b = "" Then
Zelle.Value = ""
Else
If Zelle.Value = "" Then Zelle.Formula = "=(RC[2]-RC[1])*24"
End If
Next Zelle
End Sub

Es soll eine Formel in die Zelle geschrieben werden wenn die beiden Zellen Rechts daneben nicht leer sind.
Beispiel: auf dem "Januar" Tabellenblatt W4 = (Y4-X4)*24
So das wenn ich dort Stunden eingaben mache mir in der Ziel Zelle das Ergebnis angezeigt wird. Ich aber auch eine manuelle Eingabe machen kann. Ohne das mir die Formel durch die Eingabe verloren geht.
"Stunden" ist eine Range von W4:W26 also eine Range von 23 Zellen.
Diese Range soll aber auch ca 1000 Zellen wachsen.
Jetzt habe ich folgendes Problem das die Schleife bei den 23 Zeilen schon ziemlich langsam ist.
Ich denke das eventuell hier das Problem liegt da bei jedem klick der Code duurchlaufen wird.

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Kann mir da vielleicht jemand einen Tip geben das ich den Code nutzten kann.
mfg
Sven
https://www.herber.de/bbs/user/136560.xlsm

25
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA Code zulangsam
09.04.2020 12:08:48
Daniel
Hi
Da würde ich ohne VBA arbeiten, sondern mit insgesamt 3 Spalten.
1. Spalte W:
die Berechnungsformel eingetragen für alle Zellen
2. Spalte X:
zunächst Leer, hier trägst du deine manuellen Werte ein
3. Spalte Y:
hier übernimmst du per Formel den Wert aus der ersten Spalte, wenn die zweite Spalte leer ist und ansonsten den aus der zweiten Spalte: =Wenn(X2="";W2;X2)
Für die weitere Berechnung nimmt du dann die dritte Spalte.
Gruß Daniel
AW: VBA Code zulangsam
09.04.2020 12:27:15
Sven
Hallo Daniel,
erstmal Danke für die Antwort die ich aber noch nicht ganz verstehe.
in Zelle W2 soll ja das Ergebnis von (Y2-X2)*24 rein.
in Y2 steht z.B. 10:00
in X2 steht z.B. 08:00
Diese beiden werte werden händisch eingetragen und in W2 soll dann das Ergebnis stehen oder aber man gibt in W2 gleich den Stundenwert ein.
Da X2 und Y2 nicht immer ausgefüllt werden müssen.
Ich habe leider keinen Platz für Hilfsspalten.
Gruß
Sven
Anzeige
AW: VBA Code zulangsam
09.04.2020 13:08:02
Daniel
Zähl mal, wieviele Spalten in Excel vorhanden sind und überdenke dann nochmal deine letzte Aussage
AW: VBA Code zulangsam
09.04.2020 14:01:01
Sven
Mit den Hilfsspalten ist gemeint das ich keine Hilfsspalten vor hinter oder zwischen wxy hinzufügen kann.
AW: VBA Code zulangsam
09.04.2020 16:55:56
Daniel
Kannst du schon, du willst nur nicht.
AW: VBA Code zulangsam
09.04.2020 18:21:24
Sven
Die Spalten A:AQ sind belegt und die Stuktur kann ich nicht mit Hilfsspalten auftrennen.
AW: VBA Code zulangsam
09.04.2020 13:25:57
Barbara
Daniel,
wieviele Spalten hat Deine Tabelle:
Wenn ich meine Tabelle mit
ActiveSheet.columns.Count
frage, erhalte ich für die Anzahl der Spalten: 16384
Wenn ich mir so die Makros in Deiner Datei anschaue, glaube ich, dass ich Dir aber sicher nichts Neues erzähle.
Übrigens: Dein Event-Makro arbeitet bei jedem Lufthauch in diesem Blatt die ganze Liste durch.
Da würde ich erstens empfehlen, erst zu prüfen, ob wirklich die 23 betroffenen Zellen angehaucht wurden, um dann die Aktion auf die betreffende Zelle zu beschränken statt 23 Mal durchzuführen.
Die betreffenden Zellen sind die beiden Spaltenbereiche neben "Stunden" und lassen sich so beschreiben:
Range("Stunden").Offset(, 1).Resize(, 2)
LGB
Anzeige
AW: VBA Code zulangsam
09.04.2020 13:58:03
Sven
Hallo Barbara,
danke für die Antwort.
Könntest du mir bitte noch verraten wie ich deine Range Definition in den Code einbauen muss?
Gibt es eventuell auch ein anderes Event was ich nutzen kann damit der Code ausgeführt wird?
Gruß
Sven
AW: VBA Code zulangsam
09.04.2020 15:02:54
KrisM
Geht es nicht auch so?
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Bereich As Range
Dim LZ As Long
LZ = ActiveSheet.Cells(Rows.Count, 24).End(xlUp).Row + 10 'zur Sicherheit 10 Zeilen mehr seit  _
letztem Eintrag
Set Bereich = Range(Cells(1, 24), Cells(LZ, 25))
If Not Application.Intersect(Target, Bereich) Is Nothing Then
If Cells(Target.Row, 24)  "" Or Cells(Target.Row, 25)  "" Then
Cells(Target.Row, 23).Formula = "=(RC[2]-RC[1])*24"
End If
End If
End Sub

Ich lasse die Spalten Y & X auf den letzten Eintrag prüfen, erhöhe das Ergebnis um 10 um eventuelle Leereinträge mitzunehmen.
Diesen Bereich lasse ich auch nur durchlaufen. Wenn ein Eintrag da ist, wird die Formel geschrieben. Wenn kein Eintrag da ist, wird die Formel nicht geschrieben...
Wieso lässt du den Wert nicht direkt auch durch VBA berechnen?
Anzeige
AW: VBA Code zulangsam
09.04.2020 15:41:48
Barbara
Chris, Range("Stunden") ist etwas weniger als die ganze beschriebene Spalte.
Allerdings, "Worksheet_Change" statt "Worksheet_SelectionChange" sollte schon genügend Beschleunigung liefern.
AW: VBA Code zulangsam
09.04.2020 15:48:58
KrisM
Naja ;) ich bin davon ausgegangen, dass die Tabelle von oben nach unten befüllt wird.
So wird ja immer nur aus Spalte X die letzte Zeile + 10 als Range betrachtet, oder lieg ich da falsch?
AW: VBA Code zulangsam
09.04.2020 15:59:33
Barbara
"dass die Tabelle von oben nach unten befüllt wird."
aber nur eine Zeile berechent werden muss, und zwar die, die gerade geändert wurde, oder?
AW: VBA Code zulangsam
09.04.2020 16:05:25
KrisM
ah ok, jetzt hab ich verstanden was du meinst. klar - nur die aktive zelle abfragen, würde noch mehr sinn machen und das System noch weniger belasten. Danke für den Hinweis :)
Anzeige
AW: VBA Code zulangsam
09.04.2020 16:13:15
Barbara
Nein, das meine ich nicht. Es geht weninger um die geschwindigkeit, sondern um die Festlegung der auslösenden Zellen.
Der Code soll dann ausgeführt werden, wenn die beiden Zellen rechts von Range("Stunden") geleert werden.
Und das sind nicht alle Zellen der Spalten daneben (derzeit X und Y), auf die reagiert werden soll.
Und wenn mal Spalten davor eingefügt oder entfernt werden, verschiebt sich Range("Stunden"), aber nicht Dein Makro.
AW: VBA Code zulangsam
09.04.2020 18:14:45
Sven
Die Range("Stunden")
Sieht für einen Monat so aus und das ganze dann noch 11 weitere male.
=Januar!$Q$4:$Q$26;Januar!$T$4:$T$26;Januar!$W$4:$W$26;Januar!$Z$4:$Z$26;Januar!$AC$4:$AC$26;Januar!$AF$4:$AF$26;Januar!$AI$4:$AI$26;Januar!$Q$54:$Q$76;Januar!$T$54:$T$76;Januar!$W$54:$W$76;Januar!$Z$54:$Z$76;Januar!$AC$54:$AC$76;Januar!$AF$54:$AF$76;Januar!$AI$54:$AI$76;Januar!$Q$104:$Q$126;Januar!$T$104:$T$126;Januar!$W$104:$W$126;Januar!$Z$104:$Z$126;Januar!$AC$104:$AC$126;Januar!$AF$104:$AF$126;Januar!$AI$104:$AI$126;Januar!$Q$154:$Q$176;Januar!$T$154:$T$176;Januar!$W$154:$W$176;Januar!$Z$154:$Z$176;Januar!$AC$154:$AC$176;Januar!$AF$154:$AF$176;Januar!$AI$154:$AI$176;Januar!$Q$204:$Q$226;Januar!$T$204:$T$226;Januar!$W$204:$W$226;Januar!$Z$204:$Z$226;Januar!$AC$204:$AC$226;Januar!$AF$204:$AF$226;Januar!$AI$204:$AI$226;Januar!$Q$254:$Q$276;Januar!$T$254:$T$276;Januar!$W$254:$W$276;Januar!$Z$254:$Z$276;Januar!$AC$254:$AC$276;Januar!$AF$254:$AF$276;Januar!$AI$254:$AI$276
Die Spalten sind halt nicht durchgängig.
Wie Barbara schon richtig erkannt hat das ganze am Besten nur durchlaufen wenn die beiden Zellen neben meiner Ziel Zelle nicht leer sind.
Wenn ich das auf
Private Sub Worksheet_Change(ByVal Target As Range)

dann passiert nichts mehr.
Habt ihr da noch ideen
Gruß
Sven
Anzeige
AW: VBA Code zulangsam
09.04.2020 18:29:10
Sven

Wieso lässt du den Wert nicht direkt auch durch VBA berechnen?
Da ich nicht weiß wie.
Habe den Code im Internet gefunden und der macht ja erstmal genau das was ich gern hätte.
Mir wäre es egal ob die Formel in die Zelle geschrieben wird und dann excel das ausrechnet oder ich das Ergebniss mit VBA Eintragen würde.
Nur für zweitens wüsste ich nicht wie.
AW: probiere mal das
09.04.2020 20:16:14
Robert

Private Sub Worksheet_Change(ByVal Target As Range)
Dim zelle As Range
Dim myRange As Range
Set myRange = ActiveSheet.Range("Stunden")
If Intersect(Target, myRange) Is Nothing Then
Application.EnableEvents = False
'Von der Änderung betroffene Zelle ermitteln
Set zelle = ActiveSheet.Cells(Target.Row, myRange.Item(1).Column)
If Not (IsEmpty(zelle.Offset(0, 1).Value) Or IsEmpty(zelle.Offset(0, 2).Value))  _
Then
zelle.Formula = "=(RC[2]-RC[1])*24"
Else
zelle.Formula = ""
End If
Application.EnableEvents = True
End If
End Sub

Anzeige
AW: probiere mal das
09.04.2020 20:51:00
Robert
Der Code funktioniert auch, wenn die Eingabe über mehrere Zellen gleichzeitig erfolgt.
Private Sub Worksheet_Change(ByVal Target As Range)
Dim zelle As Range
Dim myRange As Range
Set myRange = ActiveSheet.Range("Stunden")
If Intersect(Target, myRange) Is Nothing Then
Application.EnableEvents = False
For Each T_Cell In Target.Cells
'Von der Änderung betroffene Zelle ermitteln
Set zelle = ActiveSheet.Cells(T_Cell.Row, myRange.Item(1).Column)
If Not (IsEmpty(zelle.Offset(0, 1).Value) Or IsEmpty(zelle.Offset(0, 2).Value))  _
Then
zelle.Formula = "=(RC[2]-RC[1])*24"
Else
zelle.Formula = ""
End If
Next
Application.EnableEvents = True
End If
End Sub

Anzeige
AW: probiere mal das
10.04.2020 18:46:31
Sven
Hallo Robert,
danke für die Hilfe.
Ich hätte da jetzt noch eine Frage. Wann ist denn der Worksheet.Change aktiv?
Habe deinen Code ins Worksheet eingefügt es wird aber keine Formel in die Zelle eingetragen.
Gruß
Sven
AW: probiere mal das
12.04.2020 15:54:29
Robert
Hi,
Worksheet_Change reagiert, wenn eine Zelle in diesem Arbeitsblatt, wo der Code eingetragen ist, geändert wird (der Code steht in keinem Modul, sondern beim Arbeitsblatt unter MicrosoftExcelObjekte - ein Doppelklick auf ein Tabellenblatt öffnet das Codefenster)
https://docs.microsoft.com/en-us/office/vba/api/excel.worksheet.change
Die Formel wird eingetragen, wenn die 2 rechts an "Stunden" angrenzenden Zellen geändert werden (Offset(0, 1),Offset(0, 2)).
Es ist darauf zu achten, dass Application.EnableEvents = True vor der Nutzung des Makros aktiv ist, sonst gibt es keine Events.
Anzeige
AW: probiere mal das
13.04.2020 18:00:54
Sven
Hallo,
habe es eben noch mal in meine Liste eingefügt die ich hier hochgeladen habe da hat dein Code Funktioniert.
Jetzt habe ich die Range "Stunden" um zwei Spalten Blöcke erweitert.
=Januar!$W$4:$W$26;Januar!$Z$4:$Z$26;Januar!$AC$4:$AC$26
jetzt funktioniert der Code immer noch aber nur in der ersten Spalte Januar!$W$4:$W$26 in allen anderen Spalten wird der Code nicht ausgeführt.
https://www.herber.de/bbs/user/136680.xlsm
Gruß
Sven
AW: VBA Code zulangsam
10.04.2020 00:05:03
Daniel
hI
Einiges wurde ja schon erwähnt.
1. gehört dieser Code nicht ins SelectionChange- und auch nicht ins Change-Event, sondern sollte einem Button zugewiesen werden, damit er nur auf Anforderung ausgeführt wird und nicht permanent.
2. sollte man zellen möglichst nicht einzeln in Schleifen befüllen, sondern immer als Block, wenn sie die gleiche Formel oder Inhalt bekommen sollen.
wenn du dabei bereits gefüllte Zellen ausschließen willst, kannst du .SpeciaCells benutzen.
auch die Abfrage, ob die quellzellen schon befüllt sind, kann man in die Formel einbauen.
das wäre sowiso sinnvoll, denn dann kann die Formel schon in den Zellen stehen, bevor die Quellzellen mit Zeiten gefüllt werden (vielleicht brauchst du den Code dann ja auch nicht mehr) .
der Code würde dann so aussehen:
with range("Stunden")
if worksheefunction.countblank(.cells) > 0 then
.specialcells(xlcelltypeblanks).formular1c1 = _
"=if(Count(rc[1]:rc[2])=2,(rc[2]-rc[1])*24,"""")"
end if
end with
gruß Daniel
Anzeige
AW: VBA Code zulangsam
10.04.2020 19:55:28
Sven
Hallo Daniel,
danke für die Hilfe.
Deinen Code müsste ich jetzt in ein Modul und dann einen Button zugewiesen werden ?
Private Sub CommandButton1_Click()
With Range("Stunden")
If WorksheetFunction.CountBlank(.Cells) > 0 Then
.SpecialCells(xlCellTypeBlanks).FormulaR1C1 = _
"=if(Count(rc[1]:rc[2])=2,(rc[2]-rc[1])*24,"""")"
End If
End With
End Sub
Habs ausprobiert bekomme aber dann folgende Fehlermeldung.
Die CountBlank-Eigenschaften des WorksheetFunction-Objektes kann nicht zugewiesen werden

Gruß
Sven
AW: VBA Code zulangsam
10.04.2020 21:26:27
Daniel
dann ist mit deiner Datei was komisch.
ich habe den Code in deine Beispieldatei eingefügt und es funktioniert ohne Fehler.
du solltest aber das """"" in der Formel durch 0 ersetzen, sonst funktionieren deine Nachfolgeberechungen nicht., oder du müsstest in den Nachfolgeauswertungen statt mit + mit der Funktion Summe arbeiten.
frohe Ostern Daniel

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige