Live-Forum - Die aktuellen Beiträge
Datum
Titel
03.05.2024 10:49:02
03.05.2024 10:43:56
03.05.2024 07:38:32
Anzeige
Archiv - Navigation
1928to1932
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Selection + sichtbar + bestimmte Spalte

Selection + sichtbar + bestimmte Spalte
25.05.2023 13:51:16
Martin D.

Ausgangslage: Ein User markiert innerhalb eines gefilterten Bereiches entweder einzelne Zellen - idealerweise direkt die aus Spalte 1, denn nur darin stehen die relevanten Daten. Es soll aber auch erlaubt sein, dass der User ganze Zeilen selektiert. Die selektierten Zellen bzw. Zeilen sind dabei nicht zwangsläufig zusammenhängende Bereiche - entweder schon aufgrund der Filterung, oder weil der User bei der Selektierung Zellen/Zeilen auslässt.

Aus diesem selektierten Bereich soll dann mit jedem einzelnen Wert aus der ersten Spalte ein Code ausgeführt werden. Aber eben halt nur aus dem sichtbaren Bereich, und immer nur der Wert aus der ersten Spalte ist relevant.

Wenn ich es so mache


Dim r As Range

For Each r In Selection

    If r.EntireRow.Hidden = False And IsNumeric(r.Value) And Len(r.Value) = 7 Then
    
        If Empfaenger = "" Then
            Empfaenger = GetEmailAddress(GetUserId(r.Cells.Value))
        Else
            Empfaenger = Empfaenger + ";" + GetEmailAddress(GetUserId(r.Cells.Value))
        End If
    End If
Next
MsgBox Empfaenger
End Sub

funktioniert es zwar grundsätzlich, denn der gesuchte 7-stellige Wert steht nur in Spalte A. Es dauert aber ewig, wenn ganze Zeilen selektiert sind, weil die Prüfung dann offenbar in jeder Zeile bis zur letzten der 16.384 Spalten angewandt wird. Das geht doch bestimmt eleganter?

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
was auf jeden fall eleganter geht
25.05.2023 14:13:55
Daniel
wäre die formulierung deiner Anfrage.
ohne Gruß, ohne Anrede hier so einfach reinplatzen wirkt unhöflich.
Gruß Daniel


AW: was auf jeden fall eleganter geht
25.05.2023 14:20:14
Martin D.
Hallo Daniel,
Entschuldigung, das war wirklich nicht meine Absicht. Ich habe versucht, das Problem so kurz wie möglich zu beschreiben, damit kein Roman entsteht. Tut mir leid, das dann nun unhöglich wirkte. Ich würde mich über Hilfe wirklich freuen, denn ich brüte über dem Problem schon seit Stunden.
Gruß
Martin


AW: was auf jeden fall eleganter geht
25.05.2023 14:25:05
Daniel
Hi Martin
so sieht das doch gleich viel freundlicher aus und viel länger ist es auch nicht ;-)

 For each r in intersect(Columns(1), Selection.EntireRow).SpecialCells(xlcelltypevisible)
ob man das mit den SpecialCells wirklich braucht, musst du mal testen.
man sollte ja sowieso nur sichtbare Zellen selektieren können.

Gruß Daniel


Anzeige
AW: was auf jeden fall eleganter geht
25.05.2023 14:37:40
Martin D.
Hi Daniel,
ich danke Dir ganz herzlich! Ich habe es auch noch ohne SpecialCells(xlCellTypeVisible) getestet, aber dann werden tatsächlich auch die nicht sichtbaren (weil rausgefilterten) Zeilen mit berücksichtigt. Warum auch immer.

Der Vollständigkeit halber hier nochmal der nun sehr schnell funktionierende Code komplett:


Dim r As Range

For Each r In Intersect(Columns(1), Selection.EntireRow).SpecialCells(xlCellTypeVisible)
        If Empfaenger = "" Then
            Empfaenger = GetEmailAddress(GetUserId(r.Cells.Value))
        Else
            Empfaenger = Empfaenger + ";" + GetEmailAddress(GetUserId(r.Cells.Value))
        End If
Next

MsgBox Empfaenger
Gruß
Martin


Anzeige
AW: was auf jeden fall eleganter geht
25.05.2023 14:44:09
Daniel
wenn du es elegant magst, sollte dich der IF-Block in der Schleife stören. den Braucht man nicht, das ";" kann man nacher einfach abschneiden.

Dim r As Range

For Each r In Intersect(Columns(1), Selection.EntireRow).SpecialCells(xlCellTypeVisible)
    Empfaenger = Empfaenger & ";" & GetEmailAddress(GetUserId(r.Cells.Value))
Next
Empfaenger = Mid(Empfaenger, 2)
MsgBox Empfaenger
Gruß Daniel


AW: was auf jeden fall eleganter geht
25.05.2023 15:14:05
Martin D.
Danke, das übernehme ich!


AW: was auf jeden fall eleganter geht
25.05.2023 19:23:09
Martin D.
Hi Daniel,
jetzt habe ich doch noch ein Problem gefunden. Wenn der selektierte Bereich aus nur einer einzigen Zeile besteht, hängt sich Excel auf. Das liegt wahrscheinlich an dem Intersect?
Vielleicht fällt Dir dafür noch eine Lösung ein?
Gruß
Martin


Anzeige
AW: was auf jeden fall eleganter geht
25.05.2023 20:02:34
Daniel
ich kann den Fehler nicht nachstellen.
wo genau passiert denn der Fehler?
schon im for each oder erst in der nächsten Zeile?
das r.Cells.value ist nicht sinnvoll. das .cells kannst du weglassen.
Gruß Daniel


AW: was auf jeden fall eleganter geht
25.05.2023 20:23:25
Martin D.
Ich konnte es nicht debuggen, weil Excel unbedienbar wurde und gekillt werden musste. Egal, so läuft es nun:


    For Each r In Selection.Columns(1).Cells
        If r.EntireRow.Hidden = False Then
            BCC = BCC & ";" & GetEmailAddress(GetUserId(r.Cells.Value))
        End If
    Next
    BCC = Mid(BCC, 2) 
Mehr als 100 Zeilen hat die Tabelle in der Regel nicht, deshalb ist das Prüfen jeder Zeile kein Problem. Hauptsache, es wird nicht jede Zelle in jeder Zeile geprüft, und das ist ja durch die Eingrezung auf Columns(1) schon gut gelöst. Und hier ist nun schon SpecialCells(xlCellTypeVisible) auch nicht notwendig, es werden auch so nur die sichtbaren Zellen berücksichtigt.
Wir können hier jetzt zu machen, vielen Dank für Deine Hilfe!


Anzeige
hab grad getesete
25.05.2023 14:39:32
Daniel
du brauchst das SpeicalCells(xlcelltypevisible)
Gruß Daniel

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige