Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1224to1228
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

Codefehler

Codefehler
WalterK
Hallo,
Im untenstehen Code scheint ein Fehler zu sein, es wird die Fehlermeldung
"Laufzeitfehler 1004: Anwendungs- oder objektdefinierter Fehler" ausgegeben.
Mit dem Code kopiere ich einen Bereich von einem bestimmten Blatt in das aktive Blatt.
Option Explicit
Sub DN_Zeitgraphik()
Dim objSh As Worksheet
Dim LzAct As Long, LzAlt As Long
With Sheets("DN_Zeitgraphik")
If SheetExist(.Range("U1").Text) Then
.Unprotect
Set objSh = Sheets(.Range("U1").Text)
LzAct = Application.Max(3, .Cells(.Rows.Count, 2).End(xlUp).Row) 'letzte Zeile der Spalte  _
B im aktiven Blatt
LzAlt = objSh.Application.Max(3, Cells(Rows.Count, 2).End(xlUp).Row) 'letzte Zeile der  _
Spalte B laut dem in DN_Zeitgraphik Zelle U1 angegebenen Blattnamen
Application.ScreenUpdating = False
ActiveSheet.Range(.Cells(3, 1), .Cells(LzAct, 19)).ClearContents
objSh.Range(.Cells(3, 1), Cells(LzAlt, 19)).Copy ActiveSheet.Range(.Cells(3, 1), Cells( _
LzAlt, 19))
ActiveSheet.Range("U2").Select
Application.ScreenUpdating = True
.Protect
Else
MsgBox "Das erforderliche Tabellenblatt existiert in dieser Mappe nicht, der Code wird  _
daher abgebrochen! "
End If
End With
End Sub
Private Function SheetExist(ByVal sheetName As String, Optional Wb As Workbook) As Boolean
Dim wks As Worksheet
On Error GoTo ERRORHANDLER
If Wb Is Nothing Then Set Wb = ThisWorkbook
For Each wks In Wb.Worksheets
If LCase(wks.Name) = LCase(sheetName) Then SheetExist = True: Exit Function
Next
ERRORHANDLER:
SheetExist = False
End Function 
Kann mit jemand bei der Fehlersuche behilflich sein?
Besten Dank und Servus, Walter
AW: Codefehler
15.08.2011 15:56:19
Tino
Hallo,
mit Deinem Tabellenbezug stimmt was nicht.
Mal beziehst Du dich auf ActiveSheet mal auf die mit With festgelegte Tabelle und
ein anderes Mal auf die Tabelle objSh.
Du solltest versuchen in einem Range die Zellen mit ein und der selben Tabelle anzusprechen.
Gruß Tino
AW: Codefehler
15.08.2011 16:11:13
WalterK
Hallo Tino,
ich habe das mit den Tabellenbezügen soweit richtig gestellt, der Fehler bleibt allerdings.
Ich kann mir nicht erklären, was sonst noch falsch sein kann.
So sieht der Code jetzt aus:
Option Explicit
Sub DN_Zeitgraphik()
Dim objSh As Worksheet
Dim LzAct As Long, LzAlt As Long
With Sheets("DN_Zeitgraphik")
If SheetExist(.Range("U1").Text) Then
.Unprotect
Set objSh = Sheets(.Range("U1").Text)
LzAct = Application.Max(3, .Cells(.Rows.Count, 2).End(xlUp).Row) 'letzte Zeile der Spalte  _
B im aktiven Blatt DN_Zeitgraphik
LzAlt = objSh.Application.Max(3, Cells(Rows.Count, 2).End(xlUp).Row) 'letzte Zeile der  _
Spalte B laut dem in DN_Zeitgraphik Zelle U1 angegebenen Blattnamen
Application.ScreenUpdating = False
.Range(.Cells(3, 1), .Cells(LzAct, 19)).ClearContents
objSh.Range(Cells(3, 1), Cells(LzAlt, 19)).Copy .Range(.Cells(3, 1), .Cells(LzAlt, 19))
.Range("U2").Select
Application.ScreenUpdating = True
.Protect
Else
MsgBox "Das erforderliche Tabellenblatt existiert in dieser Mappe nicht, der Code wird  _
daher abgebrochen! "
End If
End With
End Sub
Private Function SheetExist(ByVal sheetName As String, Optional Wb As Workbook) As Boolean
Dim wks As Worksheet
On Error GoTo ERRORHANDLER
If Wb Is Nothing Then Set Wb = ThisWorkbook
For Each wks In Wb.Worksheets
If LCase(wks.Name) = LCase(sheetName) Then SheetExist = True: Exit Function
Next
ERRORHANDLER:
SheetExist = False
End Function
Servus, Walter
Anzeige
AW: Wo bleibt der Code denn hängen?
15.08.2011 16:25:28
jowe
AW: Wo bleibt der Code denn hängen?
15.08.2011 16:34:29
WalterK
Hallo,
es kommt zwar die angeführte Fehlermeldung, sonst wird aber nichts angezeigt oder markiert.
Jedenfalls wir die Codezeile
.Range(.Cells(3, 1), .Cells(LzAct, 19)).ClearContents
noch ausgeführt und auch die MSG-Box erscheint, wenn das Blatt nicht vorhanden ist.
Es muss also vermutlich an der Kopierzeile liegen.
Servus, Walter
AW: Wo bleibt der Code denn hängen?
15.08.2011 16:52:33
jowe
hmm, da stimmt was nicht:
objSh.Range(Cells(3, 1), Cells(LzAlt, 19)).Copy .Range(.Cells(3, 1), .Cells(LzAlt, 19))
ist das kursiv geschriebene Absichtlich so?
Wenn ja, fehlt da ein "Detination:=" ansonsten kann das doch wohl weg?
Gruß
Jochen
Anzeige
AW: Wo bleibt der Code denn hängen?
15.08.2011 16:58:29
Josef

Hallo Walter,
damit
objSh.Range(Cells(3, 1), Cells(LzAlt, 19)).Copy .Range(.Cells(3, 1), .Cells(LzAlt, 19))

stimmt die Referenz nicht.
Es mus so lauten.
Range(objSh.Cells(3, 1), objSh.Cells(LzAlt, 19)).Copy .Range(.Cells(3, 1), .Cells(LzAlt, 19))


« Gruß Sepp »

Anzeige
AW: Wo bleibt der Code denn hängen?
15.08.2011 17:26:18
WalterK
Hallo,
es kommt nach wie vor die gleiche Fehlermeldung!
Nochmals zur Erklärung:
Ich starte den Code mittels Schaltfläche aus dem Blatt DN_Zeitgraphik, das ist auch die Zieltabelle.
In der Zieltabelle in der Zelle U1 steht der Name des Quellblattes: Zeiten
Mit dem Code möchte ich den Bereich A3:S(bis letzte Zeile) des Quellblattes in den gleichen Bereich des Zielblattes kopieren.
So sieht der Code jetzt aus:
Option Explicit
Sub DN_Zeitgraphik()
Dim objSh As Worksheet
Dim LzAct As Long, LzAlt As Long
With Sheets("DN_Zeitgraphik")
If SheetExist(.Range("U1").Text) Then
.Unprotect
Set objSh = Sheets(.Range("U1").Text)
LzAct = Application.Max(3, .Cells(.Rows.Count, 2).End(xlUp).Row) 'letzte Zeile der Spalte  _
B im aktiven Blatt DN_Zeitgraphik
LzAlt = objSh.Application.Max(3, Cells(Rows.Count, 2).End(xlUp).Row) 'letzte Zeile der  _
Spalte B laut dem in DN_Zeitgraphik Zelle U1 angegebenen Blattnamen
Application.ScreenUpdating = False
.Range(.Cells(3, 1), .Cells(LzAct, 19)).ClearContents
Range(objSh.Cells(3, 1), objSh.Cells(LzAlt, 19)).Copy .Range(.Cells(3, 1), .Cells(LzAlt,  _
19))
.Range("U2").Select
Application.ScreenUpdating = True
.Protect
Else
MsgBox "Das erforderliche Tabellenblatt existiert in dieser Mappe nicht, der Code wird  _
daher abgebrochen! "
End If
End With
End Sub
Private Function SheetExist(ByVal sheetName As String, Optional Wb As Workbook) As Boolean
Dim wks As Worksheet
On Error GoTo ERRORHANDLER
If Wb Is Nothing Then Set Wb = ThisWorkbook
For Each wks In Wb.Worksheets
If LCase(wks.Name) = LCase(sheetName) Then SheetExist = True: Exit Function
Next
ERRORHANDLER:
SheetExist = False
End Function

Servus, Walter
Anzeige
AW: Wo bleibt der Code denn hängen?
15.08.2011 17:33:05
Josef

Hallo Walter,
so muss es laufen.
Sub DN_Zeitgraphik()
  Dim objSh As Worksheet
  Dim LzAct As Long, LzAlt As Long
  With Sheets("DN_Zeitgraphik")
    If SheetExist(.Range("U1").Text) Then
      .Unprotect
      Set objSh = Sheets(.Range("U1").Text)
      
      LzAct = Application.Max(3, .Cells(.Rows.Count, 2).End(xlUp).Row) 'letzte Zeile der Spalte B im aktiven Blatt DN_Zeitgraphik
      LzAlt = Application.Max(3, objSh.Cells(objSh.Rows.Count, 2).End(xlUp).Row) 'letzte Zeile der Spalte B laut dem in DN_Zeitgraphik Zelle U1 angegebenen Blattnamen
      
      Application.ScreenUpdating = False
      
      .Range(.Cells(3, 1), .Cells(LzAct, 19)).ClearContents
      
      objSh.Range(objSh.Cells(3, 1), objSh.Cells(LzAlt, 19)).Copy .Range(.Cells(3, 1), .Cells(LzAlt, 19))
      
      .Range("U2").Select
      
      Application.ScreenUpdating = True
      .Protect
    Else
      MsgBox "Das erforderliche Tabellenblatt existiert in dieser Mappe nicht, der Code wird daher abgebrochen! "
    End If
  End With
End Sub


Private Function SheetExist(ByVal sheetName As String, Optional Wb As Workbook) As Boolean
  Dim wks As Worksheet
  On Error GoTo ERRORHANDLER
  If Wb Is Nothing Then Set Wb = ThisWorkbook
  For Each wks In Wb.Worksheets
    If LCase(wks.Name) = LCase(sheetName) Then SheetExist = True: Exit Function
  Next
  ERRORHANDLER:
  SheetExist = False
End Function



« Gruß Sepp »

Anzeige
Jetzt läuft's. Besten Dank an alle! Servus, Walter
15.08.2011 18:00:08
WalterK
AW: Wo bleibt der Code denn hängen?
15.08.2011 17:06:10
Tino
Hallo,
setze dich in einem Range auf eine Tabelle fest.
Beispiel diese Codezeile
objSh.Range(.Cells(3, 1), Cells(LzAlt, 19)).Copy ActiveSheet.Range(.Cells(3, 1), Cells(LzAlt, 19))
Cells(LzAlt, 19)
hier ist die Zelle auf der aktiven Tabelle angesprochen (ohne Punkt davor),
wenn sich der Code in einem normalen Modul nicht in einer Tabelle befindet.
.Cells(3, 1)
hier ist die in With festgelegte Tabelle
objSh.Range…
wieder eine andere Tabelle.
Also in einem Range verwendest Du unter umständen
(weiß nicht welche Tabelle aktiv ist) drei verschiedene Tabellenbezüge.
Gruß Tino
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige