PDA

Vollständige Version anzeigen : per "Sheet-Array" div. Zellen löschen


WAL5
30.07.2012, 22:59
Hallo Forum,

stehe seit Wochen vor folgendem Problem:

Ich möchte in meiner Datei über ein Makro auf diversen Worksheets von bestimmten Zellen die Inhalte und Kommentare löschen. Von den insgesamt 22 Worksheets sind 11 gleich aufgebaut (Monate 2-12), in einer sind es noch ein paar Zellen mehr (Monat 1) und in Weiteren (mit verschiedenen Namen) sind es ganz andere Zellen.

Meine Vorgehensweise bisher war, das ich per "Application.EnableEvents" andere Funktionen (die z.B. nach Änderungen auf bestimmten Sheets wieder den Blattschutz einsetzten) ausschalte und den Blattschutz per "For Each" dann für alle ausschalte. Soweit...

Application.EnableEvents = False
For Each ws In Worksheets
ws.Unprotect
Next ws

Nun möchte ich die Sheets und Zellen ansprechen um sie zu leeren. Das u.a. ist eine Abwandlung des Makrorekorders. Aber in der "Range"-Zeile bekomme ich eine Fehlermeldung (Laufzeit 1004). Ich habe Bücher gewälzt und Foren durchsucht... Sicher liegt die Lösung auf der Hand, ich sehe sie aber nicht. Kann mir jemand erklären warum, bitte?
Bitte helft mir!

Sheets(Array("2", "3", "4")).Select
Range("F9:P9,F12:P13,F15:P44,F46:P48,S15:S44,S12:S13").Select
With Selection
.ClearContents
.ClearComments
.Interior.Color = xlNone
End With

Ist es evtl einfacher jedes Sheet einzeln abzuarbeiten? Ich kann es mir nicht vorstellen, denn es muss grundsätzlich ja 12x das Gleiche erledigt werden.
Gelingt es besser mit einem Array oder sollte ich es mit einer "For Next" oder "For Each" Schleife anpacken???

Danke für Eure Hilfe schon im Voraus!

Peter9
30.07.2012, 23:23
Hallo WAL5

so in etwa und ohne Selection ungetestet
Sub tt()
Dim MyArray(2 To 4) As Variant
Dim i As Integer
For i = 2 To UBound(MyArray)
With Sheets(i).Range("F9:P9,F12:P13,F15:P44,F46:P48,S15:S44,S12:S13")
.ClearContents
.ClearComments
.Interior.Color = xlNone
End With
Next i
End Sub

Oder

Sub tt2()
Dim Arr As Variant
Dim i As Integer
Arr = Array("Tabelle2", "Tabelle3", "Tabelle4")
For i = LBound(Arr) To UBound(Arr)
With Sheets(Arr(i)).Range("F9:P9,F12:P13,F15:P44,F46:P48,S15:S44,S12:S13")
.ClearContents
.ClearComments
.Interior.Color = xlNone
End With
Next i
End Sub
oder wenn es insgesamt Vier Tabellenblätter sind dann mit dem Vierten Anfangen bis zum Tabellenblatt 2

Sub tt3()
Dim i As Integer
For i = ActiveWorkbook.Sheets.Count To 2 Step -1
With Sheets(i).Range("F9:P9,F12:P13,F15:P44,F46:P48,S15:S44,S12:S13")
.ClearContents
.ClearComments
.Interior.Color = xlNone
End With
Next i
End Sub

WAL5
03.08.2012, 22:36
Hallo Peter9,

die ersten beiden Versionen funktionieren. Die Dritte hab ich nicht mehr getestet. Habe mich für die Zweite entschieden, da dort die Tabellenblattnamen angegeben werden können.

Vielen Dank für Deine schnelle Hilfe!!!

Erich G.
03.08.2012, 23:27
Hi,
das geht auch ohne Schleife:Sub aTest()
Sheets(Array("3", "2", "4")).Select
Range("F9:P9,F12:P13,F15:P44,F46:P48,S15:S44,S12:S13").Select
With Selection
.ClearContents
.ClearComments
.Interior.Color = xlNone
End With
End SubAusnahmsweise wird hier mal "Select"iert...

Schönes Wochenende allerseits!:D

WAL5
05.08.2012, 21:26
Hallo Erich,

der Code ist aus dem Makrorekorder, gell?
Und annähernd gleich mit meinem gepostetem...

...und funktioniert nicht! Warum auch immer... das habe ich noch nicht raus...

Schönen Gruß,
Andreas

Erich G.
06.08.2012, 00:15
Hi Andreas,
mit der hier hochgeladenen Mappe kannst du dich davon überzeugen, dass der Code läuft.
Warum er das bei dir nicht tut, kann ich nicht sagen. Da gibt es viele Möglichkeiten: Blattschutz, verbundene Zellen, ...

Den Makrorekorder brauchte ich hierfür übrigens nicht anzuwerfen. Der Code stammt fast komplett von dir!