Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[Excel XP SP3] Range.Find - Suche auch in ausgeblendeten Zellen

154 views
Skip to first unread message

Lars P. Wolschner

unread,
Mar 18, 2006, 1:47:06 AM3/18/06
to
Hallo,

hat jemand eine Idee, wie ich die Find-Methode eines Range dazu
bringen kann, auch in ausgeblendeten Zellen zu suchen?

Wenn man sich den Suchen-Dialog der Oberfläche ansieht, kann man die
Suche auch auf Zellen bestimmter Formate eingrenzen und zu den Spezi-
fikationen dieser Formate gehört auch die Sichtbarkeit. Die VBA-Find-
Methode hat zwar einen SearchFormat-Parameter vom Typ Variant; aber
eine Format-Klasse gibt es nicht, deren Objekte ich in diesem Para-
meter übergeben könnte.
Es nützt auch nichts, darin eine verdeckte Zelle als Range zu über-
geben.
Die Online-Hilfe erwähnt diesen Parameter nur, ohne ihn wirklich zu
dokumentieren.

Die Online-Hilfe besagt auch, daß man für die Verwendung "komplexerer
Suchmuster" mit einer For Each ... Next-Schleife die Zellen einzeln
durchsuchen soll, obwohl die Find-Methode zumindestens den Stern *
als Wildcard verarbeiten kann.

Schon jetzt vielen Dank für Eure Hinweise, CU
--
Lars P. Wolschner lars.wo...@nexgo.de
Bernardstraße 11b lars.wo...@gmx.de
D-63067 Offenbach am Main
Fon & Fax: +49 69 80068670 Mobil: +49 163 8122462 (eplus)

Eike Bimczok

unread,
Mar 18, 2006, 5:20:13 AM3/18/06
to
Lars P. Wolschner schrieb:

> Hallo,
>
> hat jemand eine Idee, wie ich die Find-Methode eines Range dazu
> bringen kann, auch in ausgeblendeten Zellen zu suchen?
>
> Wenn man sich den Suchen-Dialog der Oberfläche ansieht, kann man die
> Suche auch auf Zellen bestimmter Formate eingrenzen und zu den Spezi-
> fikationen dieser Formate gehört auch die Sichtbarkeit. Die VBA-Find-
> Methode hat zwar einen SearchFormat-Parameter vom Typ Variant; aber
> eine Format-Klasse gibt es nicht, deren Objekte ich in diesem Para-
> meter übergeben könnte.
> Es nützt auch nichts, darin eine verdeckte Zelle als Range zu über-
> geben.
> Die Online-Hilfe erwähnt diesen Parameter nur, ohne ihn wirklich zu
> dokumentieren.
>
> Die Online-Hilfe besagt auch, daß man für die Verwendung "komplexerer
> Suchmuster" mit einer For Each ... Next-Schleife die Zellen einzeln
> durchsuchen soll, obwohl die Find-Methode zumindestens den Stern *
> als Wildcard verarbeiten kann.
>
> Schon jetzt vielen Dank für Eure Hinweise, CU
Hallo Lars,

meine Excel Version bietet leider nicht die Möglichkeit nach Formaten zu
suchen. Deshalb kann ich zu dem Thema nicht weiterhelfen. Dennoch zwei Tips:
Du könntest alternativ die Zellen vor der Suche einblenden und nach der
Suche wieder ausblenden. Mit Application.ScreenUpdating = False ist das
auch optisch kein Problem.
Du kannst wenn du Schleifen verwendest für die Suche auch den "Like"
Operator nehmen, der erlaubt auch Platzhalter wie * (mehrere Zeichen), ?
(ein Zeichen), # (eine Ziffer), ...
Weiterhin könntest du reguläre Ausdrücke für die Suche verwenden, dann
hast du noch mehr Möglichkeiten dein Suchmuster vorzugeben.

Gruß
Eike

Lars P. Wolschner

unread,
Mar 18, 2006, 3:45:11 PM3/18/06
to
Eike Bimczok <eiken...@gmx.de>:

> Lars P. Wolschner schrieb:

>> hat jemand eine Idee, wie ich die Find-Methode eines Range dazu
>> bringen kann, auch in ausgeblendeten Zellen zu suchen?

> meine Excel Version bietet leider nicht die Möglichkeit nach


> Formaten zu suchen. Deshalb kann ich zu dem Thema nicht
> weiterhelfen. Dennoch zwei Tips: Du könntest alternativ die
> Zellen vor der Suche einblenden und nach der Suche wieder
> ausblenden. Mit Application.ScreenUpdating = False ist das auch
> optisch kein Problem.

Optisch nicht, aber administrativ. Ich muß ein Datenübernahme-AddIn
schaffen, das ich natürlich nicht bei jeder Änderung an den betrof-
fenen Mappen ändern müssen will. Die Pflege der Koordinaten wäre
fehlerträchtig und zeitraubend, vor allem dann, wenn sich aus
Nutzerwünschen oder Fehlbedienungen Unterschiede zwischen den
einzelnen Generationen einstellen. Obendrein lassen sich viele der
zu übernehmenden Bereiche gar nicht an bestimmten Koordinaten fest-
machen.

Ich habe daher eine Zellzeigerklasse entwickelt, die beispielsweise
nach Zellwerten suchen kann. Man weist einer bestimmten Eigenschaft
den gesuchten Zellwert zu und hat dann - sofern der Wert im Bezugs-
Range gefunden wird - die Zeilen- und Spaltenkoordinate oder auch
gleich ein Range-Objekt für die Zelle am Schnittpunkt. Man kann die
Zeilen- und Spaltenkoordinaten auch durch die Suche nach verschie-
denen Werten gewinnen.
Darauf aufsetzend gibt es eine Bereichsklasse, deren Objekte einen
Range liefern können, dessen Ausdehnung beispielsweise durch Zell-
werte festgelegt werden kann. Man weist den Eigenschaften Zeilen-
und Spaltenüberschriften einer Tabelle zu und bekommt einen Range
zurück, der die zugehörigen Zellen aus dem Datenbereich der Tabelle
repräsentiert.
Damit kann ich zuverlässig die einander entsprechenden Bereiche
zweier Arbeitsblätter zusammenbringen, auch wenn sie in ihrer
Koordinatenlage voneinander abweichen. Das Tool wird auch robust
gegen entweder nur im zu lesenden oder nur im zu beschreibenden
Arbeitsblatt fehlende Bereiche. Gerade im letzten Fall würden bei
einer starren Koordinatenbasis Daten in den falschen Zellen landen.

Daß der Suchdialog der Oberfläche dem Nutzer keine verdeckten
Zellen liefert, leuchtet ein - er kann ausgeblendete Zellen nicht
sehen. Aber daß man in der korrespondierenden VBA-Klassenmethode
dann keinen Schalter dazu hat, ist mal wieder erbärmlich.
Naja, ich hoffe schwer, daß ich das Suchen in ausgeblendeten Zellen
umgehen kann. Denn sonst droht mir ja, ausgeblendete Zeilen und
Spalten in VBA-Collections zu merken, sie dann einzublenden und
nach dem Übernahmevorgang wieder auszublenden.

> Du kannst wenn du Schleifen verwendest für die Suche auch den
> "Like" Operator nehmen, der erlaubt auch Platzhalter wie *
> (mehrere Zeichen), ? (ein Zeichen), # (eine Ziffer),

Das steht sogar in der Online-Hilfe, ist auch ganz nett, aber es
wird nur der Stern zur Suche nach nichtleeren Zellen gebraucht.
Eine VBA-Schleife wäre natürlich ungleich langsamer als die Find-
Methode. Und sie unterstützt ja auch zumindestens den Stern * und
das Fragezeichen ? als Wildcard.

> ... Weiterhin könntest du reguläre Ausdrücke für die
> Suche verwenden, dann hast du noch mehr Möglichkeiten dein
> Suchmuster vorzugeben.

Der Like-Operator wertet reguläre Ausdrücke aus?

Eike Bimczok

unread,
Mar 19, 2006, 5:56:16 AM3/19/06
to
Hallo Lars,

Lars P. Wolschner schrieb:

> umgehen kann. Denn sonst droht mir ja, ausgeblendete Zeilen und
> Spalten in VBA-Collections zu merken, sie dann einzublenden und
> nach dem Übernahmevorgang wieder auszublenden.

ich denke ja, aber der Aufwand hält sich ja in Grenzen, hier am Beispiel
von Spalten:

Function hiddenCols() As Boolean()
'03-2006
'E.Bimczok
'returns boolean array of hidden columns

Dim myCol
Dim colHidden() As Boolean

ReDim colHidden(1 To Columns.Count)

For Each myCol In ActiveSheet.Columns
If myCol.Hidden Then
colHidden(myCol.Column) = True
Else
colHidden(myCol.Column) = False
End If
Next myCol

hiddenCols = colHidden

End Function


> Der Like-Operator wertet reguläre Ausdrücke aus?


Ob er das intern tut, kann ich dir nicht sagen. Die Möglichkeiten von
"like" sind ja ansatzweise ähnlich wie die bei regulären Ausdrücken,
aber lange nicht so mächtig.
Nein die Anwendung von regulären Ausdrücken lässt sich durch die
Einbindung des VB-Script-RegExp-Objektes nutzen.

Gruß
Eike

Lars P. Wolschner

unread,
Mar 19, 2006, 4:24:47 PM3/19/06
to
Eike Bimczok <eiken...@gmx.de>:

> Lars P. Wolschner schrieb:

>> umgehen kann. Denn sonst droht mir ja, ausgeblendete Zeilen und
>> Spalten in VBA-Collections zu merken, sie dann einzublenden und
>> nach dem Übernahmevorgang wieder auszublenden.
> ich denke ja, aber der Aufwand hält sich ja in Grenzen, hier am
> Beispiel von Spalten:

Naja, Du weißt wohl, warum Du mit Spalten arbeitest - es gibt
vorläufig nur 255 davon, dafür aber 65.536 (offenbar 2^16) Zeilen.

> For Each myCol In ActiveSheet.Columns
> If myCol.Hidden Then
> colHidden(myCol.Column) = True
> Else
> colHidden(myCol.Column) = False
> End If
> Next myCol

Da würde ich es dann für geschickter halten, Arrays mit den Indices
verdeckter Spalten und Zeilen anzulegen. Deren Größe hängt dann nur
von der Zahl der verdeckten Spalten und Zeilen ab.

>> Der Like-Operator wertet reguläre Ausdrücke aus?
>
> Ob er das intern tut, kann ich dir nicht sagen. Die
> Möglichkeiten von "like" sind ja ansatzweise ähnlich wie die bei
> regulären Ausdrücken, aber lange nicht so mächtig.
> Nein die Anwendung von regulären Ausdrücken lässt sich durch die
> Einbindung des VB-Script-RegExp-Objektes nutzen.

Achso, Danke für den Hinweis.

0 new messages