Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1960to1964
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

neues Worksheet kann nicht an Sub übergeben werden

neues Worksheet kann nicht an Sub übergeben werden
25.01.2024 15:29:34
Arne
Guten Tag zusammen,

ich möchte ein Worksheet einem Sub übergeben, um darin weiter arbeiten zu können. Ist das Worksheet bereits vorhanden, funktioniert der Aufruf des Subs und dieses läuft auch ohne Probleme durch. Muss das Worksheet aber zunächst erstellt werden, kommt es beim Aufruf
Datenbearbeiten zielWorksheet, aktuelleKostenstelle, zielDateiletzteZeile.Row + 3
zur Fehlermeldung: "Objektvariable oder With-blockvariable nicht festgelegt." Das neue Worksheet wird allerdings korrekt angelegt.
Ich habe an verschiedenen Stellen das Workbook gespeichert bzw. auch schon gespeichert und erneut geöffnet. Alles leider ohne Erfolg.
Auch ChatGPT habe ich schon dazu befragt. Ich weiß nicht, ob zu schlecht oder ungenau, aber hier konnte mir leider auch nicht weitergeholfen werden.
Ich kann mir die Problematik leider nicht erklären und bin über jeden Input dankbar. :)

Da das Sub Datenbearbeiten größer wird, möchte ich es ungern direkt im selben Sub lösen.

Sub Datenkopieren(startZeile As Long, letzteZeile As Long, ByVal quellWorkbook As Workbook, quellWorksheetName As String, zielDatei As String)


Dim zielWorksheet As Worksheet
Dim aktuelleKostenstelle As String
Dim zielWorkbook As Workbook
Dim zielDateiletzteZeile As Variant
Dim i As Long

aktuelleKostenstelle = quellWorkbook.Sheets(quellWorksheetName).Cells(startZeile, 2).Value

On Error Resume Next
Set zielWorkbook = Workbooks.Open(zielDatei)
On Error GoTo 0

' Überprüfen, ob das Blatt bereits existiert
If Not BlattExistiert(zielWorkbook, aktuelleKostenstelle) Then
With zielWorkbook
.Sheets.Add after:=.Sheets(.Sheets.Count)
.ActiveSheet.Name = aktuelleKostenstelle
End With
End If
Set zielWorksheet = zielWorkbook.Sheets(aktuelleKostenstelle)
zielWorkbook.Save

' Finde die Position der letzten Zelle mit Beschriftung in Spalte A
On Error Resume Next
Set zielDateiletzteZeile = zielWorksheet.Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious)
On Error GoTo 0

' Daten in zielWorksheet speichern
If Not zielDateiletzteZeile Is Nothing Then
zielWorksheet.Cells(zielDateiletzteZeile.Row + 3, 1).Value = Date
quellWorkbook.Sheets(quellWorksheetName).Range("B1:Z2").Copy Destination:=zielWorksheet.Cells(zielDateiletzteZeile.Row + 3, 1)
quellWorkbook.Sheets(quellWorksheetName).Range("B" & startZeile & ":" & "Z" & letzteZeile).Copy Destination:=zielWorksheet.Cells(zielDateiletzteZeile.Row + 5, 1)
Else
zielWorksheet.Cells(1, 1).Value = Date
quellWorkbook.Sheets(quellWorksheetName).Range("B" & startZeile & ":" & "Z" & letzteZeile).Copy Destination:=zielWorksheet.Range("A2")
End If

Datenbearbeiten ByVal zielWorksheet, aktuelleKostenstelle, zielDateiletzteZeile.Row + 3

zielWorkbook.Save
zielWorkbook.Close

End Sub
Sub Datenbearbeiten(ByVal zielSheet As Worksheet, aktuelleKostenstelle As String, ersteZeile As Long)

Dim letzteZeile As Long

letzteZeile = zielSheet.Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row

zielSheet.Range("Q" & ersteZeile & ":X" & letzteZeile).Delete Shift:=xlToLeft
zielSheet.Range("N" & ersteZeile & ":O" & letzteZeile).Delete Shift:=xlToLeft

End Sub

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: neues Worksheet kann nicht an Sub übergeben werden
25.01.2024 16:26:46
onur
Wenn du in einer Datei in einem Makro ein Worksheet an eine Sub in der selben Datei übergibst, so wie du es machst, wird die Sub in der Datei gesucht (und natürlich nicht gefunden), in der das Makro steht.
AW: neues Worksheet kann nicht an Sub übergeben werden
25.01.2024 21:21:05
Uduuh
Hallo,
das scheitert nicht an der Übergabe des neuen Worksheets, sondern an ZielDateiLetzteZeile.
Im Falle eines neuen Worksheets ist die Variable= Nothing. Somit knallt es bei ZielDateiLetzteZeile.Row+3

Gruß aus'm Pott
Udo
AW: neues Worksheet kann nicht an Sub übergeben werden
26.01.2024 09:09:18
Arne
Moin Uduuh,

vielen Dank! Konnte es entsprechend anpassen, nun läuft alles.
AW: neues Worksheet kann nicht an Sub übergeben werden
25.01.2024 16:38:17
Arne
Danke für deine Antwort. Leider verstehe ich die nicht so recht:

meinst du wirklich [...]wird die Sub in der Datei gesucht[...] oder eher [...]wird das Worksheet in der Datei gesucht[...]

Ich setze ja das Worksheet zu einem definierten Workbook mit:


Set zielWorksheet = zielWorkbook.Sheets(aktuelleKostenstelle)

Meiner Meinung nach Sucht er dann nicht im aktuellen Workbook (das mit dem Makro).
Dadurch ergibt sich mir auch nicht die Erklärung, warum es bei bereits existierenden Worksheets funktioniert.
Anzeige
AW: neues Worksheet kann nicht an Sub übergeben werden
25.01.2024 16:42:06
onur
In deiner Sub steht aber:
Sub Datenbearbeiten(ByVal zielSheet  .........

und NICHT zielWorksheet
AW: neues Worksheet kann nicht an Sub übergeben werden
25.01.2024 16:52:56
Arne
Danke für den Hinweis, das ist im Sub Datenbearbeiten falsch benannt wurden. Das habe ich entsprechend geändert.

Allerdings wird im Sub Datenkopieren folgendes aufgerufen:
Datenbearbeiten zielWorksheet, aktuelleKostenstelle, zielDateiletzteZeile.Row + 3


Der Aufruf und das übergebene Worksheet sind also korrekt und konnten auch vor meiner Änderung richtig weiterverarbeitet werden. Die übergebene Variable muss nicht den identischen Namen haben.
Anzeige
AW: neues Worksheet kann nicht an Sub übergeben werden
25.01.2024 16:50:03
onur
Lass mal das ByVal hier weg:
Datenbearbeiten ByVal zielWorksheet, aktuelleKostenstelle, zielDateiletzteZeile.Row + 3

ggf auch in der Sub selbst.
AW: neues Worksheet kann nicht an Sub übergeben werden
25.01.2024 17:00:47
Yal
Moin!

es ist immer zu überlegen, was in einem Sub ausgelagert werden soll und was nicht.
Das Löschen sehe ich nicht als separate Handlung. Das Öffnen der Datei und Finden bzw Herstellen des Blattes dagegen schon, weil "On Error" nur innerhalb eines Subs wirkt, und somit besseren Fluss im Code darstellt (wobei es hier ein persönliche Meinung ist).

Anstatt mit einen Workbook-Objekt und ein Blatt als Name (String), warum nicht direkt das Blatt als Objekt?
Wenn man genau sieht, welche Behandlungsunterschied es zwischen "erste Zeile im Blatt" und nicht, kann man aus der Prüfung die Justierung der erste Zelle bewirken und dann alles nach dieselben Muster bearbeiten.

Sub Datenkopieren(ByVal quellWorksheet As Worksheet, zielDatei As String, startZeile As Long, letzteZeile As Long)

Dim zielWorksheet As Worksheet
Dim zielWorkbook As Workbook
Dim zielDateiletzteZeile As Range
Dim neueLetzteZeile As Long

' Datei öffnen. Wenn nicht gefunden, aussteigen
Set zielWorkbook = Datei_öffnen(zielDatei)
If zielWorkbook Is Nothing Then
MsgBox "Datei """ & zielDatei & """ wurde nicht gefunden."
Exit Sub
End If

' Überprüfen, ob das Blatt bereits existiert, wenn nicht einbauen
Set zielWorksheet = Blatt_holen(zielWorkbook, quellWorksheet.Cells(startZeile, 2).Value)

' Finde die Position der letzten Zelle mit Beschriftung in Spalte A
Set zielDateiletzteZeile = zielWorksheet.Cells(Rows.Count, 1).End(xlUp)

' Daten in zielWorksheet speichern
If zielDateiletzteZeile.Row > 1 Then Set zielDateiletzteZeile = zielDateiletzteZeile.Offset(3, 0)
zielDateiletzteZeile.Value = Date
quellWorksheet.Range("B1:Z2").Copy Destination:=zielDateiletzteZeile.Offset(1, 0)
quellWorksheet.Range("B" & startZeile & ":" & "Z" & letzteZeile).Copy Destination:=zielDateiletzteZeile.Offset(2, 0)

' Bereinigen
neueLetzteZeile = zielWorksheet.Cells(Rows.Count, 1).End(xlUp).Row
zielWorksheet.Range("Q" & zielDateiletzteZeile.Row & ":X" & neueLetzteZeile).Delete Shift:=xlToLeft
zielWorksheet.Range("N" & zielDateiletzteZeile.Row & ":O" & neueLetzteZeile).Delete Shift:=xlToLeft

' Speichern, schliessen
zielWorkbook.Save
zielWorkbook.Close
End Sub

Public Function Datei_öffnen(DateiName As String) As Workbook
On Error Resume Next
Set Datei_öffnen = Workbooks.Open(DateiName)
End Function

Public Function Blatt_holen(WB As Workbook, BlattName As String) As Worksheet
Dim WS As Worksheet
On Error Resume Next
Set WS = WB.Worksheets(BlattName)
If WS Is Nothing Then
Set WS = WB.Worksheets.Add(after:=WB.Worksheets(WB.Worksheets.Count))
WS.Name = BlattName
End If
Set Blatt_holen = WS
End Function

Nicht getestet, weil keine Datei zum Testen geliefert wurde.

VG
Yal
Anzeige
AW: neues Worksheet kann nicht an Sub übergeben werden
26.01.2024 09:10:46
Arne
Moin Yal,

danke für deinen Input, das werde ich gerne übernehmen.
AW: neues Worksheet kann nicht an Sub übergeben werden
25.01.2024 16:56:11
Arne
Habe ich beides bereits Ausprobiert, mit dem selben Fehler.
AW: neues Worksheet kann nicht an Sub übergeben werden
25.01.2024 19:02:23
onur
Dann poste mal die Datei.

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige