ZwischenAblageInhalt behalten nach MakroStart

Hallo,
gleich die nächste Frage:
Warum ist der Inhalt der ZwischenAblage nach ( automatischem ) Start eines Makros nicht mehr verfügbar?
Wenn ich in meinem besagten Blatt eine oder mehrere Zellen mit Strg-C kopiere und an anderer Stelle wieder einfügen will, passiert nichts. Die ZwischenAblage ist offenbar leer, weil das AutoMakro angesprungen ist. Kann man das irgendwie umgehen?

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

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
Call formel_oder_wert
End Sub

Sub formel_oder_wert()
Dim zellen As Object
If Selection.Count > 100 Then Exit Sub
Call GetMoreSpeed(True)
Application.EnableEvents = False
For Each zellen In Selection
zellen.Font.Italic = False
'zellen.Font.Underline = xlUnderlineStyleNone
If Left(zellen.Formula, 1) = „=“ Then
zellen.Font.Italic = True
'zellen.Font.Underline = xlUnderlineStyleDouble
End If
Next zellen
Call GetMoreSpeed(False)
End Sub

Vielen Dank für Euer Interesse und
freundliche Grüße
Thomas

Hallo Thomas,

ich würde das so schreiben:

Option Explicit

Private Sub Worksheet\_SelectionChange(ByVal Target As Excel.Range)
Call formel\_oder\_wert
End Sub

Private Sub Worksheet\_Change(ByVal Target As Excel.Range)
Call formel\_oder\_wert
End Sub

Sub formel\_oder\_wert()
Dim Zelle As Range
If Selection.Count \> 100 Then Exit Sub
Call GetMoreSpeed(True)
For Each Zelle In Selection
 Zelle.Font.Italic = Zelle.HasFormula
Next Zelle
Call GetMoreSpeed(False)
End Sub

Zur Zwischenablage schau ich morgen äh heute.

Gruß
Reinhard

Grüezi Thomas

Warum ist der Inhalt der ZwischenAblage nach ( automatischem )
Start eines Makros nicht mehr verfügbar?
Wenn ich in meinem besagten Blatt eine oder mehrere Zellen mit
Strg-C kopiere und an anderer Stelle wieder einfügen will,
passiert nichts. Die ZwischenAblage ist offenbar leer, weil
das AutoMakro angesprungen ist. Kann man das irgendwie
umgehen?

Nein - bei jedem Start eines VBA-Makros wird die Zwischenablage und auch der ‚Zürück‘-Stack gelöscht.
Da mit Makros diverse Manipulationen ohne Kontrolle durch das User-Interface abgearbeitet werden können ist das Zurücksetzen unmöglich.

Du müsstest allenfalls den Inhalt der Zwischenablage in einem Bereich des Tabellenblattes temporär zwischenspeichern und nach dem Ablauf des Codes wieder in die Zwischenablage kopieren lassen.
Das kann aber je nach Inhalt recht aufwändig werden, da ja nie so ganz klar ist, was die Zwischenablage gerade enthält.

Mit freundlichen Grüssen

Thomas Ramel

  • MVP für MS-Excel -

Warum ist der Inhalt der ZwischenAblage nach ( automatischem )
Start eines Makros nicht mehr verfügbar?
Wenn ich in meinem besagten Blatt eine oder mehrere Zellen mit
Strg-C kopiere und an anderer Stelle wieder einfügen will,
passiert nichts. Die ZwischenAblage ist offenbar leer, weil
das AutoMakro angesprungen ist. Kann man das irgendwie
umgehen?

Hallo Thomas,

benutze Strg+k und Strg+w.
in DieseArbeitsmappe:

Option Explicit

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Application.OnKey „^w“
Application.OnKey „^k“
End Sub

Private Sub Workbook_Open()
Application.OnKey „^w“, „Einfuegen“
Application.OnKey „^k“, „Kopieren“
End Sub

in ein Standardmodul:

Option Explicit

Public rngMerker

Sub formel\_oder\_wert()
Dim Zelle As Range
If Selection.Count \> 100 Then Exit Sub
Call GetMoreSpeed(True)
For Each Zelle In Selection
 Zelle.Font.Italic = Zelle.HasFormula
Next Zelle
Call GetMoreSpeed(False)
End Sub

Sub Kopieren()
On Error Resume Next
Set rngMerker = Selection
End Sub

Sub Einfuegen()
If rngMerker Is Nothing Then Exit Sub
rngMerker.Copy ActiveCell
End Sub

Sub GetMoreSpeed(Optional bolWert)
'Code
End Sub

Gruß
Reinhard

Hallo Reinhard,
die beiden oberen kurzen Makros stehen natürlich im CodeFenster einer Tabelle und das längere in einem anderen Modul ( hatte ich vergessen zu erwähnen ).
Was die Dimensionierung als Range statt als Object bewirkt, weiß ich so nicht :-S
Die Verwendung von .hasFormula ist natürlich elegant :smile:
Jedenfalls läuft auch dieses Alles auf Anhieb.
Vielen Dank.
Für das eigentliche Problem scheint es aber lt. Thomas Ramel zunächst keine Lösung zu geben. Habe ich aber noch nicht ganz aufgegeben ( s. o. )
Freundliche Grüße
Thomas

Hallo Thomas,

die beiden oberen kurzen Makros stehen natürlich im
CodeFenster einer Tabelle und das längere in einem anderen
Modul

sehr schön. Die beiden Ereignisprozeduren werden nur dann
wie dafür gewünscht automatisch von Excel gestartet wenn
sie exakt den vorgegebenen Prozedurnamen besitzen und im
richtigen Modul stehen.

Was die Dimensionierung als Range statt als Object bewirkt,
weiß ich so nicht :-S

Zelle soll doch ein Range-Objekt sein, ergo deklariere ich es Range.

Wenn man dann noch den Variablennamen ändert in rngZelle
oder rngZellen dann erkennt man auf einen Blick irgendwo im langen
Code daß mit rngZelle ein Range gemeint ist.

Die Verwendung von .hasFormula ist natürlich elegant :smile:

Ja, so wie ich das liebe, kurz knapp, sehr leicht verständlich.

Für das eigentliche Problem scheint es aber lt. Thomas Ramel
zunächst keine Lösung zu geben. Habe ich aber noch nicht ganz
aufgegeben ( s. o. )

„s.o.“? Ich seh da grad nix neues relevantes von dir?

Gruß
Reinhard

Hallo Reinhard,
bei meiner Antwort unten hatte ich diese Antwort von Dir nicht gesehen ( nach anklicken des Themas wurde nicht aktualisiert … ).
Ich werde das aber erst morgen testen können.

Mein Ansatz wäre gewesen, zu überlegen, ob man application.enableEvents durch Strg-C kurzfristig auf false setzen kann. Aber auch dafür hätte man wohl noch zusätzliche AutoMakros einbauen müssen.
Schon ´mal vielen Dank für Deine Lösung und schönen SonntagAbend
Thomas

Moin Thomas,
dass die ZwischenAblage gelöscht wird finde ich momentan noch eher nachteilig. Auch das Erhalten des Zurück-Stacks kommt mir ( noch ) wünschenswert vor. Da muss ich aber vielleicht nur etwas länger drüber nachdenken, um mir in dem Zusammenhang ein geeignetes HorrorSzenario auszumalen …
Jedenfalls scheint das Umgehen dieser Automatik nicht ohne gewissen Aufwand zu bewerkstelligen sein.
Mit Reinhards Ansatz wäre Kopieren und Einfügen hinzubekommen, wenn auch mit anderen ShortCuts. Ausschneiden müsste man dann ggf. wieder extra ermöglichen.
Am liebsten sind mir Makros, die die StandardFunktionalität von Excel nicht beeinträchtigen. Aber manchmal muss man halt Kompromisse schließen.
Vielen Dank für Deine Hinweise und einen schönen SonntagAbend
Thomas

Hallo Reinhard,

Zelle soll doch ein Range-Objekt sein, ergo deklariere ich es
Range.

Logisch.

Wenn man dann noch den Variablennamen ändert in rngZelle
oder rngZellen dann erkennt man auf einen Blick irgendwo im
langen Code, daß mit rngZelle ein Range gemeint ist.

Die Verwendung von .hasFormula ist natürlich elegant :smile:

Ja, so wie ich das liebe, kurz knapp, sehr leicht
verständlich.

dito :smile:

Für das eigentliche Problem scheint es aber lt. Thomas Ramel
zunächst keine Lösung zu geben. Habe ich aber noch nicht ganz
aufgegeben ( s. o. )

„s.o.“? Ich seh da grad nix neues relevantes von dir?

Habe wieder KinderWE, bin also nur sporadisch am PC.
Dazu noch die verd. Malware :frowning:
Muss wohl demnächst den PC neu aufsetzen.

Freundliche Grüße
Thomas

Hallo Thomas,

dass die ZwischenAblage gelöscht wird finde ich momentan noch
eher nachteilig.

da mußt du dich wohl mit abfinden, alternativ kannst du natürlich
auch dir dein eigenes Tabellenkalkulationsprogramm basteln
und auch alle Vba-Funktionen selbst schreiben.

Was schneller geht, mache es wie Bill Gates. Gestern abend lief im TV
eine längere hochinteressante Dokumentation über den Werdegang von
Steven Jobs (Apple,Mac).
Von Bill Gates wußte ich schon vorher daß er wie Steven Jobs eher
genialer Verkäufer als Programmierer ist/war. Das Betriebssystem Dos
hat er einem Mitstudenten für 1500 Dollar abgekauft. Damit
ging er zu IBM.

Dort schloß er die Mutter aller Verträge, d.h. IBM-Geräte wurden
mit Dos als Betriebssystem ausgeliefert.
Dann arbeitete Bill bei Apple. Klaute da vieles und ließ
Windows „erfinden“.

Mach’s also genauso, fang bei MS an und hol dir Wissen,
dann schreibste das Programm „ThomaCalc“ *gg*

Auch das Erhalten des Zurück-Stacks kommt mir
( noch ) wünschenswert vor.

Na gut, mit SEHR aufwendiger Vba-Programmierung kannst du diesen
Zurück bzw. Wiederholen-Stack befüllen.
Aufwendig u.a. deshalb, stell dir mal vor, du hast eine Riesen
-Tabelle mit zig Werten und Zig Formeln.
Jetzt löschst du die Zellinhalte per Vba. Geht fix.

Jetzt willst du aber weil ein Fehler vorlag mit
Bearbeiten—Rückgängig den alten Zustand wieder herstellen.
Das bedingt sehr zwangsläufig daß du in deinem Code vor dem
Löschen der Zellinhalte deren Werte speicherst.

Ich glaube ohne genaue Ahnung dieser Stack fasst so ca. 100 letzte Befehle. Eine Monsteraufgabe diese normale Bearbeiten-Rückgängig
Funktion mit Vba nachzubauen.

Wenn du wissen willst wie das grundsätzlich geht sag Bescheid,
dann bastle ich dir Beispielcode.

Da muss ich aber vielleicht nur
etwas länger drüber nachdenken, um mir in dem Zusammenhang ein
geeignetes HorrorSzenario auszumalen …

Das geht sehr leicht, stell dir vor du hast eine Mappe mit
unwiederbringbaren Daten. Per Vba löschst du Zellbereiche
und speicherst die Mappe…

Jedenfalls scheint das Umgehen dieser Automatik nicht ohne
gewissen Aufwand zu bewerkstelligen sein.
Mit Reinhards Ansatz wäre Kopieren und Einfügen hinzubekommen,
wenn auch mit anderen ShortCuts. Ausschneiden müsste man dann
ggf. wieder extra ermöglichen.

Ich habe bewußt andere Shortcuts genommen. Natürlich kann man
auch Strg+c, Strg+v neu „belegen“. Ob das Sinn macht weißt nur du.
Was in dem Bereich ggfs. noch geht ist die Umbelegung von Strg+c
nur auf diese eine Mappe zu beschränken.

Grß
Reinhard

Hallo Thomas,

bei meiner Antwort unten hatte ich diese Antwort von Dir nicht
gesehen ( nach anklicken des Themas wurde nicht aktualisiert
… ).

sowas dachte ich mir.

Mein Ansatz wäre gewesen, zu überlegen, ob man
application.enableEvents durch Strg-C kurzfristig auf false
setzen kann. Aber auch dafür hätte man wohl noch zusätzliche
AutoMakros einbauen müssen.

Beschreibe mal bitte was du insgesamt erreichen willst.

Gruß
Reinhard

Hallo Reinhard,
einem Steve Jobs oder Bill Gates nachzueifern fände ich aus verschiedenen Gründen eher unpassend für mich :smile: Trotzdem Danke für die Geschichte und Deine Hoffnungen in mich :open_mouth:

Auch das Erhalten des Zurück-Stacks kommt mir
( noch ) wünschenswert vor.

Na gut, mit SEHR aufwendiger Vba-Programmierung kannst du
diesen Zurück bzw. Wiederholen-Stack befüllen.

Schon schlecht. Wenn ich vba einsetze, versuche ich das in dem Rahmen zu machen, den ich selber vielleicht noch nachvollziehen kann.

Aufwendig u.a. deshalb, stell dir mal vor, du hast eine Riesen
-Tabelle mit zig Werten und Zig Formeln.
Jetzt löschst du die Zellinhalte per Vba. Geht fix.

cells.clearContents oder so

Jetzt willst du aber weil ein Fehler vorlag mit
Bearbeiten—Rückgängig den alten Zustand wieder herstellen.

Dass das nicht geht ist selbst mir klar. Da würde ich eben die Mappe schließen und dabei nicht speichern.

Das bedingt sehr zwangsläufig daß du in deinem Code vor dem
Löschen der Zellinhalte deren Werte speicherst.

Ich meinte eher so folgenlose Makros, die ggf. abgebrochen werden, bevor überhaupt irgendetwas in der Tabelle geändert worden ist - Mein Formel_oder_Wert-Makro wird ja z. B. abgebrochen, wenn ich mehr als 100 Zellen markiert habe. Trotzdem ist die ZwischenAblage und der ZurückStack gelöscht:frowning:

Ich glaube ohne genaue Ahnung dieser Stack fasst so ca. 100
letzte Befehle. Eine Monsteraufgabe diese normale
Bearbeiten-Rückgängig
Funktion mit Vba nachzubauen.

Nein, bloß das nicht. Ich hatte nur auf einen Trick gehofft, die Löschung des Stacks für die reinen Excel-Eingaben zu unterbinden.
Ich denke halt manchmal, Du und Thomas Ramel hättet Excel selber programmiert :wink:

Wenn du wissen willst wie das grundsätzlich geht sag Bescheid,
dann bastle ich dir Beispielcode.

Nur, wenn ich den dann auch in 20 Minuten nachvollziehen kann :wink:

Da muss ich aber vielleicht nur
etwas länger drüber nachdenken, um mir in dem Zusammenhang ein
geeignetes HorrorSzenario auszumalen …

Das geht sehr leicht, stell dir vor du hast eine Mappe mit
unwiederbringbaren Daten. Per Vba löschst du Zellbereiche
und speicherst die Mappe…

Habe natürlich immer eine SicherungsKopie :wink:
Nee, im Ernst: Das kann doch durch das Löschen des Stacks oder der ZwischenAblage auch nicht verhindert werden …( ? )

Jedenfalls scheint das Umgehen dieser Automatik nicht ohne
gewissen Aufwand zu bewerkstelligen sein.
Mit Reinhards Ansatz wäre Kopieren und Einfügen hinzubekommen,
wenn auch mit anderen ShortCuts. Ausschneiden müsste man dann
ggf. wieder extra ermöglichen.

Ich habe bewußt andere Shortcuts genommen. Natürlich kann man
auch Strg+c, Strg+v neu „belegen“.

Aha. Wenn das keine unerwünschten NebenEffekte hat … :smile:

Ob das Sinn macht weißt nur du.

Sorry, momentan noch nicht wirklich.

Was in dem Bereich ggfs. noch geht ist die Umbelegung von Strg+c
nur auf diese eine Mappe zu beschränken.

Aha, dann ist der Code wohl doch etwas anders als der für Strg-k und Strg-w, denn der wirkt sich ja wohl nur im betreffenden Blatt aus …

Grß
Reinhard

Gruß und vielen Dank
Thomas

ZAInhalt und ZurückStack behalten nach CALL
Hallo nochmal,
habe gerade festgestellt, dass ZwischenAblage sowie der ZurückStack nicht durch das reine Starten der AutoMakros gelöscht werden, sondern erst durch den CALL-Befehl.
Leider aber auch durch einen bedingten CALL-Befehl wie hier in der KommentarZeile

Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
'If Selection.Count

Hallo Reinhard,
zu Deiner Frage:

Beschreibe mal bitte was du insgesamt erreichen willst.

Am liebsten sind mir Makros, die die StandardFunktionalität von Excel nicht beeinträchtigen. Aber manchmal muss man halt Kompromisse schließen.

Das finde ich wichtig. Wenn Jemand eine Excel-Datei aufruft und bearbeiten will, soll er keine Nachteile daraus ziehen, dass dort mein Code drinsteht.

Freundliche Grüße
Thomas

Hallo,
habe jetzt die beiden AutoStartMakros etwas angepasst. Jetzt bleibt die ZA erhalten solange ich zum Einfügen nur 1 Zelle anwähle und keinen Bereich.
Ich denke, dass man mit diesem Kompromiss leben kann.
Nochmals Dank an Alle, die sich hiermit beschäftigt haben
und freundliche Grüße
Thomas

Sorry, habe in der Hektik vergessen den Code einzustellen.
Hier nun nachgereicht:

Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
If Target.Count 100 Then Exit Sub ’ Bei Auswahl vieler Zellen nicht formatieren
Call formel_oder_wert
End Sub

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
If Target.Count > 100 Then Exit Sub 'Bei Änderung vieler Zellen nicht formatieren
Call formel_oder_wert
End Sub

Nochmals vielen Dank für Eure MitArbeit und
freundliche Grüße
Thomas