it-swarm.com.de

Auswahl der Methode der Range-Klasse über VBA fehlgeschlagen

Dies ist der Code, mit dem ich gerade arbeite, und ich bekomme dieses Problem. Ich bin ein Anfänger in Excel und kann nicht herausfinden, was los ist.

Private Sub cmdRecord_Click()
Sheets("BxWsn Simulation").Range("Result").Select //This is the line with the problem, as Excel told me.
    Selection.Copy
    Sheets("Reslt Record").Select
    Sheets("Reslt Record").Range("A5000").End(xlUp).Offset(1).Select
    Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
        xlNone, SkipBlanks:=False, Transpose:=False
    Sheets("CuCon Simulator").Select
    Application.CutCopyMode = False
    Range("Improvement").Select
End Sub

Der Fehler lautet Select method of Range class failed via VBA, Error 1004. Irgendwelche Ideen?

Vielen Dank.

Bearbeiten:

Also habe ich einfach den Code in geändert

Sheets("BxWsn Simulation").Select
Range("Result").Select

Ich glaube, das ist es, was Sie damit meinen, es aktiv zu machen? Allerdings erhalte ich immer noch die Methode 'Range' des Objekts '_Worksheet', Fehler 1004

8
guesthouse123

Ich glaube, Sie haben das gleiche Problem hier.
Das Blatt muss aktiv sein, bevor Sie einen Bereich darauf auswählen können.

Lassen Sie auch das Qualifikationsmerkmal für den Blattnamen nicht aus:

Sheets("BxWsn Simulation").Select
Sheets("BxWsn Simulation").Range("Result").Select

Oder,

With Sheets("BxWsn Simulation")
  .Select
  .Range("Result").Select
End WIth

das ist das gleiche.

20
GSerg

Die richtige Antwort auf diese speziellen Fragen lautet "Nicht auswählen". Manchmal müssen Sie auswählen oder aktivieren, aber in 99% der Fälle nicht. Wenn dein Code so aussieht

Select something
Do something to the selection
Select something else
Do something to the selection

Sie müssen wahrscheinlich umgestalten und in Betracht ziehen, keine Auswahl zu treffen.

Der Fehler, Methode 'Range' des Objekts '_Worksheet' ist fehlgeschlagen, Fehler 1004, den Sie erhalten, liegt daran, dass das Blatt mit der Schaltfläche keinen Bereich mit dem Namen "Result" hat. Die meisten (möglicherweise alle) Eigenschaften, die ein Objekt zurückgeben, haben ein standardmäßiges übergeordnetes Objekt. In diesem Fall verwenden Sie die Range-Eigenschaft, um ein Range-Objekt zurückzugeben. Da Sie die Range-Eigenschaft nicht qualifizieren, verwendet Excel die Standardeinstellung.

Das standardmäßige übergeordnete Objekt kann je nach den Umständen unterschiedlich sein. Wenn sich Ihr Code in einem Standardmodul befände, wäre ActiveSheet das standardmäßige übergeordnete Element, und Excel würde versuchen, ActiveSheet.Range ("Ergebnis") aufzulösen. Ihr Code befindet sich im Klassenmodul eines Blatts (das Blatt mit der Schaltfläche darauf). Wenn die unqualifizierte Referenz dort verwendet wird, ist der Standard-Parent das Blatt, das diesem Modul angehängt ist. In diesem Fall sind sie identisch, da das Blatt aktiv sein muss, um auf die Schaltfläche zu klicken. Dies ist jedoch nicht immer der Fall.

Wenn Excel den Fehler ausgibt, der Text wie "_Object" enthält (von Ihnen "_Worksheet"), bezieht sich dieser immer auf das standardmäßige übergeordnete Objekt - der Unterstrich verrät dies. Im Allgemeinen besteht der Weg, dies zu beheben, darin, die Referenz zu qualifizieren, indem explizit über das übergeordnete Element informiert wird. Wenn Sie den Code jedoch auswählen und aktivieren müssen, ist es besser, den Code zu überarbeiten.

Hier ist eine Möglichkeit, Ihren Code zu schreiben, ohne ihn auszuwählen oder zu aktivieren.

Private Sub cmdRecord_Click()

    Dim shSource As Worksheet
    Dim shDest As Worksheet
    Dim rNext As Range

    'Me refers to the sheet whose class module you're in
    'Me.Parent refers to the workbook
    Set shSource = Me.Parent.Worksheets("BxWsn Simulation")
    Set shDest = Me.Parent.Worksheets("Reslt Record")

    Set rNext = shDest.Cells(shDest.Rows.Count, 1).End(xlUp).Offset(1, 0)

    shSource.Range("Result").Copy
    rNext.PasteSpecial xlPasteFormulasAndNumberFormats

    Application.CutCopyMode = False

End Sub

Wenn ich in einem Klassenmodul bin, wie das Klassenmodul des Arbeitsblatts, in dem Sie arbeiten, versuche ich immer, Dinge in Bezug auf diese Klasse zu tun. Also benutze ich Me.Parent anstelle von ActiveWorkbook. Es macht den Code portabler und verhindert unerwartete Probleme, wenn sich die Dinge ändern.

Ich bin mir sicher, dass der Code, den Sie jetzt haben, in Millisekunden ausgeführt wird, sodass es Sie vielleicht nicht interessiert, aber das Vermeiden der Auswahl wird Ihren Code definitiv beschleunigen und Sie müssen ScreenUpdating nicht einstellen. Dies kann wichtig werden, wenn Ihr Code wächst oder wenn sich die Situation ändert.

12
Dick Kusleika

Das hat bei mir funktioniert.

RowCounter = Sheets(3).UsedRange.Rows.Count + 1

Sheets(1).Rows(rowNum).EntireRow.Copy
Sheets(3).Activate
Sheets(3).Cells(RowCounter, 1).Select
Sheets(3).Paste
Sheets(1).Activate
1
yakovmeister