Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema MsgBox
BildScreenshot zu MsgBox MsgBox-Seite mit Beispielarbeitsmappe aufrufen

komischer Fehler | Herbers Excel-Forum


Betrifft: komischer Fehler von: Peter
Geschrieben am: 11.02.2012 14:47:09

Ein Hallo ins Forum,

ich habe unten stehenden Code zusammengabaut, der beim Debuggen in Einzelschritten wunschgemäß funktioniert, wenn ich ihn aber durchlaufen lasse bleiben die Zellen leer. Irgendwie scheint es mit dem Eintrag "LetztesBlatt = ActiveWorkbook.Sheets.Count" zusammenzuhängen. Wenn ich dieses deaktiviere und Daten aus irgendwelchen anderen sheets übernehme, klappts.
Ein anderes Phänomen ist auch noch aufgetaucht: Eine Zeit lang hat die Speichern-Abfrage beim Schließen der Arbeitsmappe nicht funktioniert. So lange dies auftrat hatte es auch mit "LetztesBlatt = ActiveWorkbook.Sheets.Count" beim automatischen Durchlauf des Codes funktioniert.
Keine Ahnung warum und wie ich weiter komme.
Vielleicht bzw. hoffentlich hat von Euch jemand eine Idee. Vielen Dank fürs Anschauen.

Sub Zusammenfassen_Resttage()

Dim Datei As String
Dim Arbeitsmappe As String
Dim Pfad As String
Dim i As Integer
Dim LetztesBlatt As Variant

Pfad = "C:\Users\Test\"
Datei = Dir(Pfad & "*.xls")

Application.ScreenUpdating = False

Do While Datei <> ""
    i = i + 1
    ChDir Pfad
    Workbooks.Open Filename:=Datei
       LetztesBlatt = ActiveWorkbook.Sheets.Count
       Sheets(LetztesBlatt).Activate
       ActiveSheet.Unprotect
    ActiveSheet.Cells(1, 4).Select
    Selection.Copy
    Windows("Planung_graphisch_neu_2.xls").Activate
    Worksheets("Wochenstatistik").Activate
    ActiveSheet.Cells(1 + i, 1).Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Workbooks(Datei).Activate
    ActiveSheet.Cells(5, 12).Select
    Selection.Copy
    Windows("Planung_graphisch_neu_2.xls").Activate
    Worksheets("Wochenstatistik").Activate
    ActiveSheet.Cells(1 + i, 2).Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Workbooks(Datei).Activate
    ActiveSheet.Protect
    Application.DisplayAlerts = False
    
    ActiveWorkbook.Close False
    Datei = Dir()
    'Application.Columns.AutoFit
    Loop
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub

  

Betrifft: AW: komischer Fehler von: Peter
Geschrieben am: 11.02.2012 15:16:24

Nachtrag zur Verdeutlichung:
Es geht in meinem Code einfach darum, aus einer unbestimmten Anzahl von Dateien 2 voneinander unabhängige Zellen auf dem jeweils letzten Arbeitsblatt, das in jeder Datei anders heißt, in eine andere, vorhandene Datei zu kopieren. Die Ergebnisse sollen sich zumindest bei jedem Start der Datei oder wenn möglich, bei jeder Änderung der Quell-Datei aktualisieren.


  

Betrifft: AW: komischer Fehler von: fcs
Geschrieben am: 11.02.2012 16:33:07

Hallo Peter,

es ist schon etwas merkwürdig, dass der Ablauf gestört ist.

Generell ist es aber günstiger mit Objektvariablen für Mappen und Tabellenblätter zu arbeiten, wenn mehrere Arbeitesmappen in Makroaktionen involviert sind, statt permanent zwischen den Mappen hin- und herzuschalten. Außerdem wird das Makro übersichtlicher und leichter lesbar.

Da in den Mappen, die geöffnet/ausgelesen werden, keine Daten geändert werden, sollten diese schreibgeschützt geöffnet werden. Beim Filename der zu öffnenden Dateien sollte der Pfad+Dateiname angegeben werden - ist etwas sicherer.

Gruß
Franz

Sub Zusammenfassen_Resttage()
  Dim wbZiel As Workbook, wksZiel As Worksheet
  Dim wbQuelle As Workbook, wksQuelle As Worksheet
  Dim Datei As String
  Dim Arbeitsmappe As String
  Dim Pfad As String
  Dim i As Long
  Dim LetztesBlatt As Variant

  Set wbZiel = Workbooks("Planung_graphisch_neu_2.xls")
  Set wksZiel = wbZiel.Worksheets("Wochenstatistik")
  
  Pfad = "C:\Users\Test\"
  Datei = Dir(Pfad & "*.xls")
  
  Application.ScreenUpdating = False
  
  ChDir Pfad
  
  Do While Datei <> ""
    If LCase(wbZiel.Name) <> LCase(Datei) Then
      i = i + 1
      Set wbQuelle = Workbooks.Open(Filename:=Pfad & Datei, ReadOnly:=True)
      LetztesBlatt = wbQuelle.Sheets.Count
      Set wksQuelle = wbQuelle.Sheets(LetztesBlatt)
      wksQuelle.Unprotect  'erforderlich ?????
         
      wksQuelle.Cells(1, 4).Copy
      wksZiel.Cells(1 + i, 1).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks  _
_
          :=False, Transpose:=False
          
      wksQuelle.Cells(5, 12).Copy
      wksZiel.Cells(1 + i, 2).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks  _
_
          :=False, Transpose:=False
          
      Application.CutCopyMode = False
      
      wbQuelle.Close savechanges:=False
    End If
    Datei = Dir()
    Set wbQuelle = Nothing: Set wksQuelle = Nothing
  Loop
  wbZiel.Activate
  wksZiel.Activate
  'wksZiel.Columns.AutoFit
  Application.ScreenUpdating = True
End Sub



  

Betrifft: AW: komischer Fehler von: Peter
Geschrieben am: 11.02.2012 18:02:40

Hallo Franz,
vielen Dank für die hilfreichen Verbesserungsvorschläge. So weit gut nachvollziehbar.
Funktionieren tut es leider nicht.
Die workbooks werden angesprochen und auch die Zielzellen werden nach und nach aktiviert, bleiben aber leer (egal ob Einzelschritte oder autom. Durchlauf.
Beim Debuggen wird das Quell-Workbook korrekt angesprochen aber -zumindest nicht sichtbar- das letzte worksheet aktiviert und auch die Quellzellen werden nicht sichtbar angesprungen (blinkender Rahmen um die kopierte Zelle). Vielleicht läuft das ja im Hintergrund !?
(Ich hatte zuvor schon einmal eine verkürzte Form ansatzweise angewandt, bin dann aber wieder zur Select-copy-Weise zurück, weil es nur so funktionierte.
Hast Du eine Idee woran es liegen könnte? Kann eine falsche Excel-Konfiguration die Ursache sein?
Gruß
Peter


  

Betrifft: AW: komischer Fehler von: fcs
Geschrieben am: 11.02.2012 20:08:06

Hallo Peter,

wenn das Makro ohne Fehler-Durchläuft, dann werden zumindest gültige Objekte gefunden. Warum die ohne Daten sind?

Beim Debuggen wird das Quell-Workbook korrekt angesprochen
ok

aber -zumindest nicht sichtbar- das letzte worksheet aktiviert
Aktivieren und selektieren ist bei korrekter Programmierung eigentlich nicht erforderlich.

und auch die Quellzellen werden nicht sichtbar angesprungen (blinkender Rahmen um die kopierte Zelle).
Der blinkende Rahmen wird mit Zeile
Application.CutCopyMode = False
deaktiviert.

Vielleicht läuft das ja im Hintergrund !?
Die Kopiervorgänge laufen ab, ohne dass ständig sichtbar zwischen den Arbeitsmappen hin- und hergeschaltet wird.

Kann es sein, dass in den Quelldateien ausgeblendete Tabellenblätter vorhanden sind?

Falls ja, dann müsste man nach dem Öffnen der Datei nicht das letzte Tabellenblatt, sondern das letzte sichtbare Tabellenblatt ermitteln. Zusätzlich kannst du ja mal zusätzlich eine Testzeile einfügen, die die zukopierenden Daten anzeigt.

'Letztes sichtbares Blatt ermitteln
      Do
        Set wksQuelle = wbQuelle.Sheets(LetztesBlatt)
        If wksQuelle.Visible = xlSheetVisible Then Exit Do
        LetztesBlatt = LetztesBlatt - 1
      Loop
      wksQuelle.Unprotect  'erforderlich ?????
         
'Test-Zeile
      MsgBox "Name Quelldatei: " & wbQuelle.Name & vbLf _
        & "Name Tabelle: " & wksQuelle.Name & vbLf _
        & "Zelladresse1: " & wksQuelle.Cells(1, 4).Address & vbLf _
        & "ZellWert: " & wksQuelle.Cells(1, 4).Value & vbLf _
        & "Zelladresse2: " & wksQuelle.Cells(5, 12).Address & vbLf _
        & "ZellWert: " & wksQuelle.Cells(5, 12).Value, vbOKOnly, "Informationen Quelle"
        
      wksQuelle.Cells(1, 4).Copy
Darüber hinaus könnte ich nur noch was vermuten, wenn ich ich die Quelldateien sehen könnte.
Gruß
Franz


  

Betrifft: AW: komischer Fehler von: Peter
Geschrieben am: 11.02.2012 22:43:18

Hallo Franz,

Du vermutest richtig. Er griff bisher auf ein ausgeblendetes sheet zu, indem in den Zellen natürlich nichts drin steht.
Die Quelldatei ist die Datei für die Du dankenswerter Weise im Januar schon einen Code geschrieben hast zur Erfassung der Statistik (16.01.2012).

Beim neuen Code zur Ermittlung des letzten sichtbaren sheets kommt die Fehlermeldung

Laufzeitfehler: 9 Index außerhalb des gültigen Bereichs in der Zeile:
Set wksQuelle = wbQuelle.Sheets(LetztesBlatt) und bricht ab.

Ich hoffe ich habe den Code richtig eingefügt, wie Du geschrieben hast, nach dem Öffnen der Quelldatei.
War die Stelle richtig?
Gruß
Peter


  

Betrifft: AW: komischer Fehler von: Peter
Geschrieben am: 12.02.2012 02:09:24

Nochmal hallo Franz,

vielen Dank für Deine Hilfe. Ich habe nach einigem Probieren selbst meinen Fehler gefunden. Ich hatte den von Dir erstellten code doch falsch eingefügt. Nach Korrektur läuft alles bestens.
Das schöne ist, dass man von Euch auch viel lernen kann.
Besten Dank nochmal.
Gruß
Peter


Beiträge aus den Excel-Beispielen zum Thema "komischer Fehler"