Supportnet Computer
Planet of Tech

Supportnet / Forum / Tabellenkalkulation

VBA - PasteSpecial = Laufzeitfehler





Frage

Allseits einen wunderschönen Guten Morgen! Ich benötige (mal wieder) die Hilfe von einem Excel- bzw. VBA-Genie. Grundidee: Ich möchte Werte von einem Blatt auf das andere übertragen. Dazu habe ich mir ein Makro zusammengebastelt. 1 x funktioniert es einwandfrei, aber beim 2. Versuch kommt es immer wieder zu einem Laufzeitfehler. Leider weiss ich nicht warum. Zur Vereinfachung habe ich meine Musterdatei01 unter [url]http://www.file-upload.net/download-1168579/Test01_PasteSpecial.zip.html[/url] abgelegt. Vielleicht kann sich jemand den Code ansehen und mir sagen woran es scheitert. Getestet unter Office2003 SP3 LieGrü Tom

Antwort 1 von Flupo

Überprüfe mal, ob die Befehle zum Schutz und entsperren der Datei alle Sinn machen.
Ich habe die drei Zeilen (2x unprotect und 1x protect) auskommentiert und so läuft das Makro.

Was willst du eigentlich mit der IF-Schleife bezwecken?
Du überprüfst damit, ob eine Zelle leer ist und löscht sie in diesem Fall. Unter dem Strich machst du also garnichts.

Weiter oben die beiden Zeilen
Sheets("Zusammenfassung_Urlaub").Activate
Range("a3").Select

sind Überflüssig und können auch raus.

Gruß Flupo

Antwort 2 von Tomschi

Hallo Flupe!

Danke, dass Du so rasch auf mein Posting reagiert hast!

(2x unprotect und 1x protect) --> Was meinst Du damit?
In meinem Code finde ich nur einmal
ActiveSheet.Unprotect Password:="123abc" bzw.
ActiveSheet.Protect Password:="123abc"

Ich benötige diesen Zeilen jedoch auf jeden Fall, da der Bereich geschützt ist und nur nach dem Aufheben das Einfügen klappen kann. Oder irre ich mich da?
Wie sonst müsste der Code aussehen?

Der Löschvorang wird ebenfalls benötigt.
Im Blatt "Zusammenfassung_Urlaub" wird der neue Urlaubssaldo ermittelt.
Gegebenenfalls ist dieser null und wird trotzdem auf das Blatt "Urlaub" kopiert.
Wenn ich jetzt z. B. auf die Zelle D37 eine Abfrage =wenn(D37="";"";"Fehler") mache, dann erhalte ich als Ergebnis "Fehler".
Dies hat in der Originaldatei dann negative Auswirkungen auf weitere Zellen und daher lösche den Zellbereich.

Sorry, jetzt habe ich meine Fehler gesehen.
Ich kopiere nicht "" sondern 0 und daher ist meien Folgeformel falsch. Vergiss also den letzten Absatz.
Ich werde die Formel entsprechend abänderung und die If-Schleife löschen.

Vielleicht fällt Dir trotzdem noch was zu dem Schutz ein.

Tschau

Tom

Antwort 3 von Flupo

Zitat:
(2x unprotect und 1x protect) --> Was meinst Du damit?
In meinem Code finde ich nur einmal
ActiveSheet.Unprotect Password:="123abc" bzw.
ActiveSheet.Protect Password:="123abc"

Mein Fehler. Sorry.

Aber ich weiß jetzt, wo das Problem liegt.
Es lässt sich auch ganz einfach reproduzieren.
Wenn man einen Bereich kopiert, dann zum Zielbereich wechselt und den Schutz rausnimmt, "vergisst" Excel den kopierten Bereich und das Einfügen scheitert mit der Fehlermeldung.

Du musst den Schutz nur vor dem Kopieren rausnehmen, dann gehts.

Ich hab mal die ganze IF-Anweisung auf das Wesentliche reduziert:
If a = vbYes Then
    Application.ScreenUpdating = False
    Sheets("Urlaub").Activate
    ActiveSheet.Unprotect Password:="123abc"
    Sheets("Zusammenfassung_Urlaub").Range("Urlaubsendsaldo").Copy
    Sheets("Urlaub").Activate
    Range("D4").PasteSpecial Paste:=xlPasteValues
    ActiveSheet.Protect Password:="123abc"
    Application.ScreenUpdating = True
Else...

Das Einschalten der Bildschirmaktualisierung hab ich mit in die Schleife genommen, da dies nur nötig ist, wenn vorher ausgeschaltet wurde.

Gruß Flupo

Antwort 4 von coros

Hallo Ihr beiden,

das was Flupo zu dem Fehler erklärt hat ist richtig.
Was aber nicht ganz stimmt ist das mit der Bildschirmaktualisierung. Diese muss eigentlich gar nicht wieder eingeschaltet werden, da diese sich nach Beenden eines Makros automatisch wieder einschaltet. Notwendig ist das Einschalten nur, wenn es im Makro zwingend erforderlich ist, ansonsten nicht.

Da Flupo bereits Deinen Abfrageteil gekürzt hat, nachfolgend noch eine weitere Kürzung, da auf Sheets("Urlaub").Activate ebenfalls verzichtet werden kann.
Hier also die gekürzte Fassung der Abfrage:

If a = vbYes Then
    Application.ScreenUpdating = False
    With Sheets("Urlaub")
        .Unprotect Password:="123abc"
        Sheets("Zusammenfassung_Urlaub").Range("Urlaubsendsaldo").Copy
        .Range("D4").PasteSpecial Paste:=xlPasteValues
        .Protect Password:="123abc"
    End With
Else


MfG,
Oliver
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du
ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.

Antwort 5 von coros

Hi,

ich nochmal. Ich habe gerade gesehen, dass die Forumsformatierung mal wieder einen Streich gespielt hat. Daher hier nochmal die gekürzte Fassung, die durch Kopieren 1:1 in das bestehende Projekt übernommen werden kann.

If a = vbYes Then
    Application.ScreenUpdating = False
    With Sheets("Urlaub")
        .Unprotect Password:="123abc"
        Sheets("Zusammenfassung_Urlaub").Range("Urlaubsendsaldo").Copy
        .Range("D4").PasteSpecial Paste:=xlPasteValues
        .Protect Password:="123abc"
    End With
Else


MfG,
Oliver
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du
ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.

Antwort 6 von Tomschi

Hallo Flupo!
Hallo Oliver!

Echt, Ihr seid der Wahnsinn!
Ich werde Euch heute in mein Abendgebet einschliessen!

DANKE!

Wieder jede Menge dazugelernt!

Tom

P.S.: Bitte wegen den Bonuspunkten nicht streiten. ;-)

Antwort 7 von Flupo

Zitat:

P.S.: Bitte wegen den Bonuspunkten nicht streiten. ;-)

Ich werd's überleben. ;-)

Mir sind positive Rückmeldungen wichtiger als die Punkte.

Schönen Tag noch
Gruß Flupo

Antwort 8 von nighty

hi all :-)

wobei die bemuehungen eines anfaengers wertvoller als die eines profis sind :-)) und coros hat hervorragend korrigiert :-)))

gruss nighty

Ich möchte kostenlos eine Frage an die Mitglieder stellen:


Ähnliche Themen:


Suche in allen vorhandenen Beiträgen: