Ich habe ein VBA-Makro eingerichtet, das nacheinander eine VBA-Operation in jeder Tabelle einer bestimmten Excel-Datei ausführt. Da die Datei zahlreiche Blätter enthält, die gelegentlich zu Unterbrechungen des Servers führen, muss ich die Anforderung von Zeit zu Zeit neu starten.

Hier kommt also die Frage: Ich möchte das folgende Codeelement so ändern, dass das VBA-Makro auf dem aktuell ausgewählten Blatt / der aktuell ausgewählten Registerkarte ausgeführt wird. Es muss dann nacheinander alle verbleibenden Blätter / Registerkarten rechts vom aktiven Blatt abdecken, nicht jedoch diejenigen links, die bereits ausgefüllt wurden.

Der folgende Code startet jeden Lauf des Makros mit dem allerersten Blatt / Tab der Datei neu, was nicht erforderlich ist. Gibt es eine clevere Optimierung des Codes?

  Dim xsheet As Worksheet
  For Each xsheet In ThisWorkbook.Worksheets
  xsheet.Select
2
Malte Susen 19 Jän. 2019 im 14:54

3 Antworten

Beste Antwort

Fahren Sie mit den Arbeitsblättern fort

Wenn Sie mit ActiveSheet fortfahren möchten, entfernen Sie einfach '+ 1'.

Warnung : Diese Codes sind gültig, wenn Sie nur die Arbeitsblätter in der Arbeitsmappe haben und keine Diagramme, Dialoge oder was auch immer.
Ich verwende fast immer nur Arbeitsblätter in meinen Arbeitsmappen, daher habe ich nie etwas über das Problem Index erfahren, das JohnyL bezieht sich auf seine Antwort auf diese Frage.

Die Idee

Sub ContinueThroughWorksheets()
    Dim i As Long
    With ThisWorkbook
        For i = .ActiveSheet.Index + 1 To .Worksheets.Count
            Debug.Print .Worksheets(i).Name
        Next
    End With
End Sub

Die Umsetzung

Sub ContinueThroughWorksheets2()
    Dim i As Long
    Dim j As Long
    With ThisWorkbook
       Select Case .ActiveSheet.Index
           Case 1
               j = 1
           Case .Worksheets.Count
               Exit Sub
           Case Else
               j = .ActiveSheet.Index + 1
       End Select
       For i = j To .Worksheets.Count
          Debug.Print .Worksheets(i).Name
       Next
    End With
End Sub
1
VBasic2008 20 Jän. 2019 im 09:35

Es gibt drei blattspezifische Sammlungen: Worksheets, Charts und DialogSheets. Die Eigenschaft Index dieser Sammlungen gibt den Sammlungsindex von Sheets zurück - nicht den tatsächlichen Index in der blattspezifischen Sammlung.

Angenommen, Sie haben vier Blätter:

  1. Arbeitsblatt ("Sheet1")
  2. Arbeitsblatt ("Sheet2")
  3. Diagramm ("Diagramm1")
  4. Arbeitsblatt ("Sheet3").

In diesem Fall gibt Worksheets("Sheet3").Index 4 zurück, wenn der reale Index 3 ist. Unter dem Strich wird bei der Verarbeitung aller Blätter niemals die Eigenschaft Index der blattspezifischen Sammlung verwendet.

Um Ihr Problem zu lösen, müssen Sie nur die Sheets Sammlung verwenden:

Sub FFF()
    Dim x%, sheet As Variant
    For x = ActiveSheet.Index + 1 To Sheets.Count
        Set sheet = Sheets(x)
        '// Do something with sheet
    Next
End Sub
2
JohnyL 20 Jän. 2019 im 19:36

Sie können dies auf diese Weise tun. Beachten Sie jedoch, dass es im Allgemeinen nicht ratsam ist, den Code auf dem aktiven Blatt oder den aktiven Zellen zu basieren, da diese leicht geändert werden können und Ihr Code möglicherweise nicht ordnungsgemäß ausgeführt wird.

Eine bessere Methode wäre, die (Code-) Namen der an anderer Stelle verarbeiteten Blätter zu speichern und Ihre Blätter mit Ausnahme dieser Namen zu durchlaufen.

Sub x()

Dim i As Long

For i = ActiveSheet.Index To Worksheets.Count
    MsgBox Worksheets(i).Name
Next i

End Sub
1
SJR 19 Jän. 2019 im 12:06