it-swarm.com.de

VBA - Laufzeitfehler 1004 "Anwendungsdefinierter oder Objektdefinierter Fehler"

Ich habe ein Excel-Dokument, das bei der ersten Ausführung ein Vorlagenblatt in ein neues Blatt kopiert. Weitere Blätter, die dieser Vorlage folgen, werden an das neu erstellte Blatt angehängt.

Ich erhalte den Fehler im Titel in diesem Codeabschnitt:

If Worksheets("User Configuration").Cells(9, 15).Value = 1 Then
  Worksheets("Cable Cards Template").Range("A1:J33").Copy

  With Worksheets("Cable Cards")
  **.Range(Cells(RangeStartRow, RangeStartColumn), Cells(RangeEndRow, RangeEndColumn)).PasteSpecial xlValues**
    .Range(Cells(RangeStartRow, RangeStartColumn), Cells(RangeEndRow, RangeEndColumn)).PasteSpecial xlFormats
  End With

  Worksheets("Cable Cards Template").Shapes("Picture 1").Copy
  Worksheets("Cable Cards").Paste Cells(RangeStartRow, RangeStartColumn)

  Call Sheets.FormatCableCardRows      
End If

Wenn die Anweisung If wahr ist (die Zelle = 1), sollte ein Bereich auf einem bestimmten Blatt kopiert und in dem neuen Blatt in dem Bereich eingefügt werden, der mit PasteSpecial für Werte und Formatierung angegeben wurde. Anschließend sollte auf dem "neu erstellten" Blatt ein Bild in die obere linke Zelle der Vorlage kopiert werden. Anschließend wird eine Subroutine aufgerufen, um die Zeilen des neuen Blatts zu formatieren.

Ich erhalte den Fehler beim ersten .Range-Aufruf nach der With Worksheets("Cable Cards")-Anweisung. Ich habe versucht, die With-Anweisung nicht zu verwenden, Werte direkt anstelle von Einfügen-Spezial usw. zu kopieren. Die seltsame Sache ist, dass dies auf Anhieb ausgeführt wird, wenn das neue Blatt erstellt wird mit:

If (RangeStartRow = 1) Then
  Worksheets.Add().Name = "Cable Cards" ' Create new sheet with given name only on first cable card
  Columns(1).ColumnWidth = 9.43
  Columns(6).ColumnWidth = 11
  Columns(10).ColumnWidth = 9
  Call FormatForA5Printing("Cable Cards", 71)
End If

aber beim zweiten Durchgang scheitert es komplett mit dem Run Time Error 1004 'Application Defined or Object Defined Error'. Ich würde mich über jede Hilfe freuen.

4
user3105671

Ihr Zellenobjekt ist nicht vollständig qualifiziert. Sie müssen vor dem Zellenobjekt eine DOT hinzufügen. Zum Beispiel

With Worksheets("Cable Cards")
    .Range(.Cells(RangeStartRow, RangeStartColumn), _
           .Cells(RangeEndRow, RangeEndColumn)).PasteSpecial xlValues

Qualifizieren Sie auf ähnliche Weise alle Ihre Cells-Objekte.

14
Siddharth Rout

Lösung 1 : Ihre Aussage

.Range(Cells(RangeStartRow, RangeStartColumn), Cells(RangeEndRow, RangeEndColumn)).PasteSpecial xlValues

bezieht sich nicht auf ein geeignetes Range, auf das reagiert werden kann. Stattdessen,

.Range(.Cells(RangeStartRow, RangeStartColumn), .Cells(RangeEndRow, RangeEndColumn)).PasteSpecial xlValues

tut (und ähnlich in einigen anderen Fällen).

Lösung 2 : Aktivieren Sie Worksheets("Cable Cards"), bevor Sie die Zellen verwenden.

Erklärung: Cells(RangeStartRow, RangeStartColumn) (zB) gibt Ihnen eine Range, die wäre in Ordnung, und deshalb sehen Sie oft Cells verwendet auf diese Weise. Da es jedoch nicht auf ein bestimmtes Objekt angewendet wird, gilt es für ActiveSheet. Ihr Code versucht daher, .Range(rng1, rng2) zu verwenden, wobei .Range eine Methode eines Worksheet-Objekts ist und rng1 und rng2 sich in einem anderen Worksheet befinden.

Es gibt zwei Überprüfungen, die Sie durchführen können, um dies deutlich zu machen:

  1. Aktivieren Sie Ihre Worksheets("Cable Cards"), bevor Sie Ihre Sub ausführen, und sie wird funktionieren (jetzt haben Sie wohlgeformte Verweise auf Ranges). Für den Code, den Sie gepostet haben, wäre das Hinzufügen von .Activate direkt nach With... in der Tat eine Lösung, obwohl Sie möglicherweise ein ähnliches Problem an einer anderen Stelle in Ihrem Code haben, wenn Sie auf Range in einem anderen Worksheet verweisen.

  2. Setzen Sie mit einem anderen Blatt als Worksheets("Cable Cards") einen Haltepunkt in der Zeile, die den Fehler auslöst, starten Sie Sub, und schreiben Sie im unmittelbaren Fenster, wenn die Ausführung unterbrochen wird

    Debug.Print Cells(RangeStartRow, RangeStartColumn).Address(external:=True)

    Debug.Print .Cells(RangeStartRow, RangeStartColumn).Address(external:=True)

    und sehen Sie die verschiedenen Ergebnisse.

Schlussfolgerung: Die Verwendung von Cells oder Range ohne ein angegebenes Objekt (z. B. Worksheet oder Range) kann gefährlich sein, insbesondere wenn mit mehr als einem Sheet gearbeitet wird, sofern nicht genau bekannt ist, welches Sheet aktiv ist.

5
sancho.s

Wenn Sie einen Wert vergeben, der mit einem "=" beginnt, wird die Formel ausgewertet und in meinem Fall der oben genannte Fehler 1004 ausgegeben. Es war das Ticket für mich, es mit einem Leerzeichen zu versehen. 

1
Mosca Pt