Schnelle Methode zum Ermitteln des freigegebenen Zellenbereichs

8

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%     
brettdj 30.06.2013, 05:24
quelle

6 Antworten

4

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 :

sind
  

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.

%Vor%     
Andy G 30.06.2013, 21:29
quelle
8

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:

  • Ändern Sie Application , um Fehler, Code und Screen-Updating zu unterdrücken
  • Es wurde versucht, die ActiveWorkbook und / oder ActiveSheet zu entsperren, wenn sie geschützt sind. Beenden Sie den Code, falls nicht erfolgreich
  • Erstellen Sie eine Replik des aktuellen Arbeitsblatts
  • Löschen Sie alle vorhandenen Formelfehler im Replikat mit SpecialCells
  • Schützen Sie das Replikatarbeitsblatt, und fügen Sie bei der Behandlung der Fehlerbehandlung einen absichtlichen Formelfehler hinzu, der nur die nicht gesperrten Zellen
  • auffüllt
  • Bereinigen und die Ergebnisse melden Setzen Sie die Anwendungseinstellungen zurück

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%     
brettdj 30.06.2013 05:46
quelle
3

Verwenden Sie die bedingte Formatierung mit: - Verwenden Sie eine Formel, um zu formatierende Zellen zu bestimmen, formatieren Sie die Werte, für die diese Formel wahr ist: =CELL("protect",A1)=0 und das Format der Auswahl auf den belegten Bereich?

    
pnuts 30.06.2013 06:20
quelle
1

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.

    
Zo_ 27.01.2015 20:57
quelle
0

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.

%Vor%

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!

    
Andy G 30.06.2013 20:05
quelle
0

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.

    
Tuntable 18.12.2017 04:43
quelle

Tags und Links