PDA

Vollständige Version anzeigen : Zellen prüfen und dann Makro ausführen


Mikrofon
22.08.2017, 23:53
Hi,

für mein Aktuelles Projekt benötige ich ein Makro, welches 4 Zellen auf Inhalt überprüft.
Sind ALLE 4 Zellen gefüllt soll ein Makro ausgeführt werden. (Makro1)

Mein Versuch ist leider kläglich gescheitert.

Private Sub Worksheet_Change(ByVal Target As Range)
If Range("A1, B1, C1, D1").Value <> "" Then Makro1

End Sub



Kann mir einer sagen, wo mein Fehler liegt ?
Edit: Ich nutze Excel 2016

Grüße

Oge
23.08.2017, 01:58
Hallo M...

folgendes Makro ruft ein zweites auf wenn eine Zelle des Bereiches geändert wird (nicht gelöscht) und in allen anderen Zellen auch ein Eintrag ist.
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Zelle As Range
Dim blnTuwat As Boolean
If Intersect(Target, Range("A1:D1")) Is Nothing Or Target.Cells.Count > 1 Then Exit Sub
blnTuwat = True
For Each Zelle In Range("A1:D1")
If Zelle.Value = "" Then
blnTuwat = False
End If
Next Zelle
If blnTuwat Then
'Application.EnableEvents = False
Call Tuwat
'Application.EnableEvents = True
End If

End Sub
Sub Tuwat()
MsgBox "vollständig"
End Sub


zu Intersect
Das sollte man nutzen, damit die Prüfung nicht auch erfolgt wenn eine der anderen tausenden Zellen geändert wird.

zu Events
Falls das Unterprogramm auf irgendeiner Ebene Änderungen im Arbeitsblatt durchführt, sollte man die Events vor dem Aufruf des Unterprogramms ausschalten und anschliessend wieder einschalten.

EarlFred
23.08.2017, 06:24
Hallo,

CountA() wäre mein Favorit.

@Helmut
Target.Cells.Count > 1 Then Exit Sub
warum erfüllt es die Bedingung nicht, wenn man mehrere Zellen gleichzeitig füllt und beendet das Makro unverrichteter Dinge? Ich sehe das so häufig und verstehe es doch nie. Kannst Du mir das erklären?

Grüße
EarlFred

Mikrofon
23.08.2017, 06:27
Hi,

Danke für deine Antwort.
Also das Mkro führt in der Tat eine Veränderung im Arbeitsblatt durch.

Folgendes soll geschehen:

Im Uhrzustand sind A1:D1 leer
Wenn Zellen A1:D1 Alle gefüllt sind soll ein Makro ausgeführt werden.
Das Makro nimmt A1:D1, kopiert den Bereich. Fügt es weiter unten ein und löscht dem Inhalt A1:D1 wieder.
Das Makro habe ich schon. Ich bekomme nur die Abfrage der Zellen A1:D1 nicht hin und das dann das Makro ausgeführt wird.

Danke für die Hilfe

Grüße

RPP63neu
23.08.2017, 07:12
Moin!
@EarlFred:
Folgendes wirft ausschließlich 1 ins Direktfenster:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Cells.CountLarge > 1 Then Exit Sub
Debug.Print Target.Cells.CountLarge
End Sub
.CountLarge nehme ich grundsätzlich, um einen evtl. Überlauf zu verhindern.

@Mic:
<span style='font-style:italic; margin-left:36px; color:#008000; font-weight:bold;'>Microsoft Excel Objekt Tabelle1</span><pre style='border:thin solid #000000; padding:12px 24px; margin-left:12px; color:#000000'><span style='color:#0000EE'>Option</span> <span style='color:#0000EE'>Explicit</span> <span style='color:#0000EE'>Private</span> <span style='color:#0000EE'>Sub</span> Worksheet_Change(<span style='color:#0000EE'>ByVal</span> Target <span style='color:#0000EE'>As</span> Range) <span style='color:#0000EE'>On</span> <span style='color:#0000EE'>Error</span> <span style='color:#0000EE'>GoTo</span> ErrExit <span style='color:#0000EE'>If</span> <span style='color:#0000EE'>Not</span> Intersect(Range(<span style='color:#FF0000'>&quot;A1:D1&quot;</span>), Target) <span style='color:#0000EE'>Is</span> <span style='color:#0000EE'>Nothing</span> <span style='color:#0000EE'>Then</span> <span style='color:#0000EE'>If</span> <span style='color:#0000EE'>WorksheetFunction</span>.CountBlank(Range(<span style='color:#FF0000'>&quot;A1:D1&quot;</span>)) = <span style='color:#DDAA00'>0</span> <span style='color:#0000EE'>Then</span> Application.EnableEvents = <span style='color:#0000EE'>False</span> <span style='color:#0000EE'>Call</span> Hab_Ich_Schon <span style='color:#0000EE'>End</span> <span style='color:#0000EE'>If</span> <span style='color:#0000EE'>End</span> <span style='color:#0000EE'>If</span> ErrExit: Application.EnableEvents = <span style='color:#0000EE'>True</span> <span style='color:#0000EE'>End</span> <span style='color:#0000EE'>Sub</span> <span style='color:#0000EE'>Sub</span> Hab_Ich_Schon() Range(<span style='color:#FF0000'>&quot;A1:D1&quot;</span>).ClearContents MsgBox <span style='color:#FF0000'>&quot;Done!&quot;</span> <span style='color:#0000EE'>End</span> <span style='color:#0000EE'>Sub</span> </pre><br>
(.CountA() = 4 ginge natürlich auch)

Gruß Ralf

EarlFred
23.08.2017, 07:39
@Ralf,
mit CountLarge hast Du sicher recht.

Meine Frage war etwas wirr, so früh am morgen (es herrschte sozusagen ein früher "Uhrzustand" :D). Bei meiner Arbeitsweise bearbeite ich regelmäßig mehr als eine Zelle gleichzeitig und ich nutze oft Change (oder andere)-Ereignisse. Wenn die Makros dann immer aussteigen würden (weil Target.Count/.CountLarge>1), würden die beabsichtigten Schritte also oft nicht ausgeführt. Je nachdem, was die Makros machen sollen, fehlen dann ggf. wesentliche Bearbeitungsschritte - das könnte fatal sein. Daher bin ich immer wieder verwundert über diesen "Rausschmiss" und ich frage mich, ob ich der einzige bin, der damit seine Sorgen hätte oder ob meine Arbeitsweise einfach nur ungewöhnlich ist.

Grüße
EarlFred

RPP63neu
23.08.2017, 07:53
Willkommen im Klub der Früh-Nicht-Versteher! ;)
Ich gebe Dir Recht, dass die Prüfung auf .Count(Large) hier sinnbefreit ist!
(auch deshalb kommt sie bei mir oben nicht vor; ich nutze es auch eher selten)

Ergänzend:
Es macht ja sogar manchmal Sinn, die Areas abzuklappern, um unzulässige Mehrfachoperationen auszuschließen.
Mein "Favorit" ist da der Tausch Formelergebnis/Wert, den ich per Strg+Umschalt+W in meiner Personal.xlsb aufrufe, da sehr häufig genutzt:
<pre style='border:thin solid #000000; padding:12px 24px; margin-left:12px; color:#000000'><span style='color:#0000EE'>Sub</span> FormelInWert() <span style='color:#008000'>'Shortcut Strg+Umschalt+W </span> <span style='color:#0000EE'>Dim</span> x <span style='color:#0000EE'>As</span> Range <span style='color:#0000EE'>With</span> Application .ScreenUpdating = <span style='color:#0000EE'>False</span> <span style='color:#0000EE'>For</span> <span style='color:#0000EE'>Each</span> x <span style='color:#0000EE'>In</span> .Selection.Areas x.Copy: x.PasteSpecial xlValues <span style='color:#0000EE'>Next</span> .CutCopyMode = <span style='color:#0000EE'>False</span> <span style='color:#0000EE'>End</span> <span style='color:#0000EE'>With</span> <span style='color:#0000EE'>End</span> <span style='color:#0000EE'>Sub</span></pre>

Gruß Ralf

Mikrofon
24.08.2017, 21:51
Es funktioniert, vielen Dank dafür :)