Eine häufige Anforderung in den Onlineforen ist Code, um die nicht gesperrten Zellen in einem Blatt zu identifizieren.
Die Standardlösungen verwenden eine Schleife, um jede Zelle im verwendeten Teil des aktiven Arbeitsblatts zu durchlaufen, wobei jede Zelle getestet wird, ob sie gesperrt ist oder nicht. Ein Codebeispiel für diesen Ansatz ist unten aufgeführt.
Angesichts der inhärenten schlechten Leistung beim Durchlaufen von Zellbereichen, welche überlegenen Ansätze sind möglich?
(NB: Ich beabsichtige, meinen eigenen bestehenden Ansatz, der zuvor in einem anderen Forum gehostet wurde, als einen möglichen Ansatz hinzuzufügen - aber ich werde eine andere [geeignete] Methode als Antwort akzeptieren, wenn sie bereitgestellt wird)
Range Approach zum Identifizieren nicht gesperrter Zellen
%Vor% Nun, ich bin zu einer Schleife zurückgekehrt, aber ich denke, diese Methode ist effizient, weil sie nur auf die Zellen verweist, die Unlocked
(ohne Auswahl) mit Weiter :
Wenn das Objekt ein Bereich ist, emuliert diese Eigenschaft den TAB-Schlüssel obwohl Die Eigenschaft gibt die nächste Zelle zurück, ohne sie auszuwählen.
Auf einem geschützten Blatt gibt diese Eigenschaft die nächste nicht gesperrte Zelle zurück. Auf Bei einem ungeschützten Blatt gibt diese Eigenschaft immer die Zelle zurück unmittelbar rechts neben der angegebenen Zelle.
Es speichert das erste (Nächste) Range.Address
, durchläuft die anderen, bis es zu diesem ersten zurückkehrt.
Mit SpecialCells
können Sie schnell gesperrte Zellen identifizieren
Der folgende Code - QuickUnlocked - verwendet eine Problemumgehung, um schnell eine SpecialCells
Sammlung von Fehlerzellen zu generieren, um den nicht gesperrten Zellenbereich zu identifizieren.
Die wichtigsten Schritte sind:
Application
, um Fehler, Code und Screen-Updating zu unterdrücken ActiveWorkbook
und / oder ActiveSheet
zu entsperren, wenn sie geschützt sind. Beenden Sie den Code, falls nicht erfolgreich SpecialCells
Warnung, dass SpecialCells
auf 8192 Bereiche vor Xl2010 beschränkt ist
Gemäß diesem Microsoft KB-Artikel , Excel-2007 und früheren Versionen unterstützt bis zu 8.192 nicht zusammenhängende Zellen über VBA-Makros. Eher überraschend, ein VBA-Makro auf mehr als 8192 SpecialCells Areas in these Excel versions, will not raise an error message, and the entire area under consideration will be treated as being part of the
SpecialCells 'Bereichssammlung anzuwenden.
Schnell entsperrter Code
%Vor%Ich suchte nach einer Möglichkeit, den Inhalt meiner nicht gesperrten Zellen zu löschen. Das Problem bestand darin, dass mein Blatt hunderte, wenn nicht tausende unverriegelte Zellen und doppelt so viele gesperrte Zellen enthielt. Es dauerte ungefähr 5-7 Sekunden, bis ich durch sie hindurchging und ich wollte etwas effizienteres.
Brettdjs Lösung hat mich auf halbem Weg dorthin gebracht, aber so viele Zellen in meiner Reichweite haben den Algorithmus durchbrochen.
Die Zeile
%Vor%Funktioniert nicht, weil die Adresse von rng2 die Grenze von 256 Zeichen überschritten hat, also wurde rng3 zu "nothing".
Ich habe Stunden damit verbracht, das Limit von 256 zu umgehen, aber ich habe nichts erreicht. Nachdem ich fast aufgegeben hatte, stolperte ich über das Objekt "Bereiche" einer Reihe. Lebensretter!
Der unten angegebene angepasste Code funktioniert mit Blättern, die mehrere nicht gesperrte Zellen enthalten. Danke an Brettdj für die ursprüngliche Idee.
%Vor%Ich hoffe, dass das einem anderen hilft. Wenn Sie sie nur auswählen möchten, statt sie zu löschen, ändern Sie die vorletzte Zeile von .ClearContents in .Wählen Sie.
Ich habe das erkundet, aber ich bin mehr oder weniger mit Bretts Ansatz in Kontakt gekommen. Der kleine Unterschied ist, dass ich das aktuelle Arbeitsblatt verwende, anstatt ein neues zu erstellen. Ich gehe auch zunächst davon aus, dass das Arbeitsblatt keine Fehler enthält. (Code könnte ähnlich zu Brett hinzugefügt werden, um diese zu berücksichtigen.)
Ich wollte die UsedRange
mit "# N / A" überfluten, Fehler ignorieren und Application.Undo
verwenden, um schnell zurück zu kommen. Leider konnte ich Undo
nicht verwenden (anders als in Word). Also habe ich einen Variant verwendet, um die Daten des gesamten Gebiets zu erfassen und dann wieder einzufügen.
Also, leider bin ich nicht viel weiter gegangen als Bretts cooler Code. Vielleicht wird es jemand anderen inspirieren, oder jemand könnte einen Weg finden, Rückgängig zu verwenden;)
Ich verliere auch Formeln (konvertiert in Werte), also sind einige Arbeiten erforderlich!
Wenn es viele Formeln gibt, ist der allgemeine Ansatz
%Vor%Dieses Muster eignet sich für viele Eigenschaften wie HasArray. Aber nur für Locked ist es grob (100 mal) langsamer. Ich weiß nicht warum so ineffizient.
Goto Special wäre ein netter Trick, aber es gibt keinen für blockierte Zellen.
Eine gute Lösung wäre wunderbar, aber ich vermute, unmöglich.