Sehr viele Zellen auswählen mit VBA

Informationen und Beispiele zu den hier genannten Dialog-Elementen:
Bild

Betrifft: Sehr viele Zellen auswählen mit VBA
von: Paul
Geschrieben am: 17.06.2015 15:44:05

Hallo,
ich möchte für meine Dienstplantabelle einen Resetbutton schaffen. Dieser soll sehr viele unterschiedlich positionierte Zellen auswählen und die Werte darin löschen. Ich schaffe es jedoch nicht VBA meine elend lange Liste unterzujubeln. Könnt ihr mir helfen?
Vielen Dank, Paul.
P.S.: Um einen Eindruck zu bekommen um was für eine Menge es sich handelt:
A5:BT8;BU6:DV8;BU5;DN5;M11:P12;Q12;AE11:AH12;AI12;AW11:AZ12;BA12;BO11:BR12;BS12;CG11:CJ12;CK12;CY11:DB12;DC12;DQ11:DT12;DU12;A25:DV25;D38:E42;H42;I38:I41;M42:P43;Q43;V38:W42;Z42;AA38:AA41;AE42:AH43;AI43;AN38:AO42;AR42;AS38:AS41;AW42:AZ43;BA43;BF38:BG42;BK38:BK41;BJ42;BO42:BR43;BS43;BX38:BY42;CB42;CC38:CC41;CG42:CJ43;CK43;CP38:CQ42;CU38:CU41;CT42;CY42:DB43;DC43;DH38:DI42;DM38:DM41;DL42;DQ42:DT43;DU43;A57:DV57;D70:E74;H74;I70:I73;M74:P75;Q75;V70:W74;Z74;AA70:AA73;AE74:AH75;AI75;AN70:AO74;AR74;AS70:AS73;AW74:AZ75;BA75;BF70:BG74;BJ74;BK70:BK73;BO74:BR75;BS75;BX70:BY74;CB74;CC70:CC73;CG74:CJ75;CK75;CP70:CQ74;CU70:CU73;CT74;CY74:DB75;DC75;DH70:DI74;DL74;DM70:DM73;DQ74:DT75;DU75;A89:DV89;D102:E106;H106;I102:I105;M106:P107;Q107;V102:W106;AA102:AA105;Z106;AE106:AH107;AI107;AN102:AO106;AR106;AS102:AS105;AW106:AZ107;BA107;BF102:BG106;BJ106;BK102:BK105;BO106:BR107;BS107;BX102:BY106;CC102:CC105;CB106;CG106:CJ107;CK107;CP102:CQ106;CU102:CU105;CT106;CY106:DB107;DC107;DH102:DI106;DM102:DM105;DL106;DQ106:DT107;DU107;A121:DV121;D134:E138;H138;I134:I137;M138:P139;Q139;V134:W138;AA134:AA137;Z138;AE138:AH139;AI139;AN134:AO138;AR138;AS134:AS137;AW138:AZ139;BA139;BF134:BG138;BK134:BK137;BJ138;BO138:BR139;BS139;BX134:BY138;CC134:CC137;CB138;CG138:CJ139;CK139;CP134:CQ138;CT138;CU134:CU137;CY138:DB139;DC139;DH134:DI138;DM134:DM137;DL138;DQ138:DT139;DU139;A153:DV153;D166:E170;I166:I169;H170;M170:P171;Q171;V166:W170;AA166:AA169;Z170;AE170:AH171;AI171;AN166:AO170;AS166:AS169;AR170;AW170:AZ171;BA171;BF166:BG170;BJ170;BK166:BK169;BO170:BR171;BS171;BX166:BY170;CB170;CC166:CC169;CG170:CJ171;CK171;CP166:CQ170;CT170;CU166:CU169;CY170:DB171;DC171;DH166:DI170;DL170;DM166:DM169;DQ170:DR171;DS170:DT171;DU171;A185:DV185;D198:E202;H202;I198:I201;M202:P203;Q203;V198:W202;AA198:AA201;Z202;AE202:AH203;AI203;AN198:AO202;AS198:AS201;AR202;AW202:AZ203;BA203;BF198:BG202;BK198:BK201;BJ202;BO202:BR203;BS203;BX198:BY202;CC198:CC201;CB202;CG202:CJ203;CK203;CP198:CQ202;CU198:CU201;CT202;CY202:DB203;DC203;DH198:DI202;DM198:DM201;DL202;DQ202:DT203;DU203;A217:DV217;D230:E234;H234;I230:I233;M234:P235;Q235;V230:W234;AA230:AA233;Z234;AE234:AH235;AI235;AN230:AO234;AS230:AS233;AR234;AW234:AZ235;BA235;BF230:BG234;BK230:BK233;BJ234;BO234:BR235;BS235;BX230:BY234;CC230:CC233;CB234;CG234:CJ235;CK235;CP230:CQ234;CU230:CU233;CT234;CY234:DB235;DC235;DH230:DI234;DM230:DM233;DL234;DQ234:DT235;DU235;A249:DV249;D262:E266;H266;I262:I265;M266:P267;Q267;V262:W266;AA262:AA265;Z266;AE266:AH267;AI267;AN262:AO266;AS262:AS265;AR266;AW266:AZ267;BA267;BF262:BG266;BK262:BK265;BJ266;BO266:BR267;BS267;BX262:BY266;CC262:CC265;CB266;CG266:CJ267;CK267;CP262:CQ266;CU262:CU265;CT266;CY266:DB267;DC267;DH262:DI266;DM262:DM265;DL266;DQ266:DT267;DU267;A281:DV281;D294:E298;I294:I297;H298;M298:P299;V294:W298;Z298;AA294:AA297;AE298:AH299;AI299;AN294:AO298;AS294:AS297;AR298;AW298:AZ299;BA299;BF294:BG298;BK294:BK297;BJ298;BO298:BR299;BS299;BX294:BY298;CB298;CC294:CC297;CG298:CJ299;CK299;CP294:CQ298;CT298;CU294:CU297;CY298:DB299;DC299;DH294:DI298;DL298;DM294:DM297;DQ298:DT299;DU299;A313:DV313;D326:E330;H330;I326:I329;M330:P331;Q331;V326:W330;AA326:AA329;Z330;AE330:AH331;AI331;AN326:AO330;AS326:AS329;AR330;AW330:AZ331;BA331;BF326:BG330;BK326:BK329;BJ330;BO330:BR331;BS331;BX326:BY330;CC326:CC329;CB330;CG330:CJ331;CK331;CP326:CQ330;CU326:CU329;CT330;CY330:DB331;DC331;DH326:DI330;DL330;DM326:DM329;DQ330:DT331;DU331;A345:DV345;D358:E362;H362;I358:I361;V358:W362;Z362;AA358:AA361;AN358:AO362;AR362;AS358:AS361;BF358:BG362;BJ362;BK358:BK361;BX358:BY362;CB362;CC358:CC361;CP358:CQ362;CT362;CU358:CU361;DH358:DI362;DL362;DM358:DM361

Bild

Betrifft: AW: Sehr viele Zellen auswählen mit VBA
von: Daniel
Geschrieben am: 17.06.2015 16:09:59
Hi
prinzipell kannst du jeden Zellbereich über die Range-Funktion beschreiben:
Range("A5:BT8,BU6:DV8,BU5,DN5")
allerdings darf der Textstring mit den Zelladressen maximal 256 Zeichen lang sein.
bei dir sinds über 3000.
was du machen kannst ist foldendes:
1. beschreibe den Zellbereich Stücklesweise (maximal 256 Zeichen pro Adressstring) und setze mit der UNION-funktioin zusammen:

dim rngReset as Range
set rngReset = Range("A5:BT8;BU6:DV8;BU5;DN5")
set rngReset = Union(rngReset, Range("M11:P12;Q12;AE11:AH12;AI12")
set rngReset = Union(rngReset, Range("AW11:AZ12;BA12;BO11:BR12;BS12")
usw...
rngReset.Clearcontents
ausserdem solltest du dir auch mal die INTERSECT-Funktion anschauen, damit kann man Schnittmengen aus Zellbereichen bilden:
Intersect(Range("A:A,C:C,E:E"), Range("1:1,3:3,5:5")).Select
und auch die offset-Funktion könnte hilfreich sein, wenn sich Muster wiederholen:
dim rngX as range
set rngX = Intersect(Range("A:A,C:C,E:E"), Range("1:1,3:3,5:5"))
set rngX = Union(rngX, rngX.offset(1, 1))
rngX.select
gruß Daniel

Bild

Betrifft: AW: Sehr viele Zellen auswählen mit VBA
von: Michael
Geschrieben am: 17.06.2015 16:39:01
Hi Paul,
ich habe Deinen "irren" String in A1 kopiert und folgendes Makro getestet:

Sub splitten()
Dim a As Variant
Dim z As Long
a = Split(Range("A1").Value, ";")
For z = LBound(a) To UBound(a)
  Range(a(z)).Interior.Color = 3
  ' Range(a(z)).ClearContents
Next
End Sub
Anstatt der Farbzuweisung verwendest Du eben .clear oder .clearcontents.
Den Rattenschwanz kannst Du ja auf einem getrennten Blatt unterbringen, das Du dann versteckst.
X2000 gibt für =Länge(A1) 3586 zurück. Mir wäre wohler, den String in Teilstrings zu zerlegen...
Sub zerlegen()
Dim a As Variant
Dim z As Long
a = Split(Range("A1").Value, ";")
For z = LBound(a) To UBound(a)
  Range("A" & z + 4).Value = a(z)
Next
End Sub
... die kann man dann nämlich sortieren, vielleicht läßt sich noch was zusammenfassen, und außerdem funzt das dann analog mit dem Löschen - mit einem Array geht das fix.
Hm, X2000 zickt mit dem Array, denn eben so:
Sub loeschen()
' in Modul
Dim a As Range
Dim c As Range
Set a = Sheets("verstecken").Range("A4:A403")
For Each c In a
  Sheets(2).Range(c.Value).Clear
Next
End Sub
Schöne Grüße,
Michael

Bild

Betrifft: AW: Sehr viele Zellen auswählen mit VBA
von: Daniel
Geschrieben am: 17.06.2015 17:01:17
Dank der Vorarbeit von Michael erkennt man, dass du ab Zeile 25 ein wiederholendes Kachelmuster von 32*18 Zellen hast, welches sich 11x nach unten und 7x nach rechts wiederholt.
somit reicht es, wenn du zuerst mal die erste Kachel definierst, und dann die weitern Kacheln per Schleife mit Union und Offset dazunimmst:

Sub test()
Dim rng1 As Range
Dim rngGesamt As Range
Dim i As Long
'obere linke Kachel definieren
Set rng1 = Range("A25:R25,D38:E42,I38:I41,H42,M42:P43,Q43")
'--- ober linke Kachel in erster Spalte nach unten duplizieren
Set rngGesamt = rng1
For i = 1 To 10
    Set rngGesamt = Union(rngGesamt, rng1.Offset(32 * i, 0))
Next
'--- erste Spalte nach rechts duplizieren
Set rng1 = rngGesamt
For i = 1 To 6
    Set rngGesamt = Union(rngGesamt, rng1.Offset(0, 18 * i))
Next
rngGesamt.Interior.Color = vbYellow
End Sub
hat auch den Vorteil, dass du bei Korrekturen nur die erste Kachel überarbeiten musst und dass du bei Erweiterungen einfach nur den entsprechenden Schleifenendwert anpassen musst (natürlich nur, solange sich das Muster regelmässig wiederholt)
Gruß Daniel

Bild

Betrifft: AW: Sehr viele Zellen auswählen mit VBA
von: Paul
Geschrieben am: 17.06.2015 17:55:16
Jetzt habe ich mich, für mein Gefühl, schon soweit reingefuchst in Excel und bin immer noch erstaunt was für Möglichkeiten es gibt. Ganz große klasse ihr drei!
Ich habe nun zwei eurer Vorschläge kombiniert, leider zeigt mir Excel dann einen Syntaxfehler an. Ich habe erst die Offset-Methode eingesetzt, um alle regelmäßigen Zellen zu erfassen und dann die UNION-Methode um die restlichen Zeilen zu erfassen. Bei der UNION-Funktion zeigt Excel nun leider den Fehler an. Könnt ihr mir helfen? Was hab ich falsch gemacht?

Private Sub CommandButton1_Click()
Dim rng1 As Range
Dim rngGesamt As Range
Dim i As Long
'obere linke Kachel definieren
Set rng1 = Range("A25:R25,D38:E42,I38:I41,H42,M42:P43,Q43")
'--- ober linke Kachel in erster Spalte nach unten duplizieren
Set rngGesamt = rng1
For i = 1 To 9
    Set rngGesamt = Union(rngGesamt, rng1.Offset(32 * i, 0))
Next
'--- erste Spalte nach rechts duplizieren
Set rng1 = rngGesamt
For i = 1 To 6
    Set rngGesamt = Union(rngGesamt, rng1.Offset(0, 18 * i))
Next
rngGesamt.Value = ""
Dim rngReset As Range
Set rngReset = Range("A5:BT8;BU7:DV8;DN5;BU5;M11:P12;Q12;AE11:AH12;AI12;AW11:AZ12;BA12;BO11: _
BR12;BS12;CG11:CJ12;CK12;CY11:DB12;DC12;DQ11:DT12;DU12;A345:DV345;D358:E362;H362;I358:I361;V358:W362;Z362")
set rngReset = Union(rngReset, Range("AA358:AA361;AN358:AO362;AR362;AS358:AS361;BF358:BG362; _
BJ362;BK358:BK361;BX358:BY362;CB362;CC358:CC361;CP358:CQ362;CT362;CU358:CU361;DH358:DI362;DL362;DM358:DM361")
rngReset.ClearContents
End Sub
Vielen Dank! Paul.

Bild

Betrifft: AW: Sehr viele Zellen auswählen mit VBA
von: Daniel
Geschrieben am: 17.06.2015 18:25:57
Hi
da VBA "englisch" spricht, musst du im Addressstring für die Range-Funktion das KOMMA als Trennzeichen für die einzelnen Bereiche verwenden und nicht das Semikolon.
ich geh mal davon aus, dass der Zeilenumbruch in dieser Programmzeile von der Forumssoftware automatsich erzeugt wurde und das bei dir eine durchgehende Programmzeile ist.
Gruß Daniel

Bild

Betrifft: AW: Sehr viele Zellen auswählen mit VBA
von: Michael
Geschrieben am: 19.06.2015 13:39:10
Hi zusammen,
es ist halt eine Frage der Philosophie, wie man es angehen möchte...
Bei sehr umfangreichen Geschichten *kann* es vorteilhaft sein, ein verstecktes oder "sehr verstecktes" Blatt mit "internen" Daten anzulegen.
Wenn mein allererster Code mit .clear anstatt .interior.color tut (und er tat in meinen Tests), dann ist doch alles in Butter, ohne aufwendige(re)n Code.
Bei der Trennung von Code und Daten sehe ich *in diesem Fall* folgende Vorteile:
1. Die paar Zeilen Code (1. oder 3. Schnipsel) sind absolut simpel und wartungsfreundlich
2. Die Daten können übersichtlich in einer, aber auch mehreren nebeneinanderstehenden Spalten (z.B. A: Kacheln, B:Einzelne) angeordnet werden, was sich bei Bedarf viel leichter ändern läßt, als wenn man im VBA-Code in längeren Strings nach Werten sucht.
Zur Ansicht Datei: https://www.herber.de/bbs/user/98310.xls
Falls Ihr das testen wollt: bitte Werte in Tabelle2 schreiben und Loeschen in Modul1 aufrufen. Ich habe noch einen Timer reingesteckt, um die Geschwindigkeit zu testen.
Schöne Grüße,
Michael
P.S.: habe Pauls Code noch eingebaut (; durch , ersetzt *und* Strings beim Zeilenende geschlossen), er läuft mit "4", mein Vorschlag mit "5", benötigt also rund 25% mehr Zeit.

 Bild

Beiträge aus den Excel-Beispielen zum Thema "Sehr viele Zellen auswählen mit VBA"