Excel: Mehrfach-Auswahl per VBA richtig finden

Dieser Thread ist Teil einer Diskussion zu einem Artikel:  Zum News-Artikel gehen

nochEinAndreas

Stammgast
Hallo Wissende,
heute habe ich mal wieder eine Frage:
Auf einem Tabellenblatt wähle ich die Zellen A1 bis E1 aus, und dann mit gedrückter STRG-Taste zusätzlich die Zellen A4 bis E4.
Jetzt möchte ich mit einem Makro herausfinden, welche Zellen ausgewählt sind. Mit der Schleife

Code:
For Each zelle In Selection
        MsgBox zelle.Address
Next zelle

funktioniert das auch.

Auch eine Zeile wie

Code:
MsgBox Selection.Count
liefert mir 10 als richtiges Ergebnis.

Aber jetzt kommt's:
Ich hätte erwartet, dass der Ausdruck
Code:
Selection(6).Address
oder
Code:
Selection.Cells(6).Address
mir die 6. Zelle der Auswahl, also A4 liefert.
Statt dessen kommt A2. Was ist da los? Wie komme ich an die richtige Zelle A4?

Und es geht noch besser:! Obwohl die Auswahl nur aus 10 Zellen besteht, kann ich ohne Fehlermeldung schreiben
Code:
MsgBox Selection(222).Address
und erhalte B45.

Wo ist mein Denkfehler? Wie kann ich per Code an die richtige Zelle A4 kommen?

Ich bin gespannt auf Antworten.
Danke in Voraus und Gruß,

Andreas
 

Nebuk

PCtipp-Moderation
Teammitglied
Hallo @nochEinAndreas

Es scheint so zu sein, dass Excel bzw. VBA intern sämtliche Adressen zwischen den Bereichen ebenfalls innerhalb der "Selection" speichert.
In dem Fall ist der erste zusammenhängende Auswahl relevant. Je nachdem, wie lange die erste bzw. oberste Auswahl ist, rechnet Excel die nicht selektierten Zwischenbereiche bis zur nächsten Selektion auch mit. Ich stell mir das so vor wie ein zweidimensionales Array.

A1B1C1D1E1
A2B2C2D2E2
A3B3C3D3E3
A4B4C4D4E4

Rufst du jetzt
Code:
Selection.Cells(6).Address
auf, gehst du jetzt die in der Selektion bzw. das 2D-Array die 6 Elemente durch. Das 6. Element ist in dem Beispiel eben die Zelle A2.

Warum das so ist, oder warum man das so handhabt? Keine Ahnung.
Interessant ist es aber trotzdem irgendwie.
 

nochEinAndreas

Stammgast
Guten Abend Nebuk,

danke für deine Ideen. So ähnlich hatte ich mir das auch zusammengereimt. Ein Rätsel bleibt für mich, wie weit das geht.
Ich habe eben noch ein paar Tests gemacht:
Wenn ich die Zellen A1 bis E1 auswähle und dann im VBA Editor eingebe
Code:
Selection(5242880).Select
Dann springt die Markierung nach E1048576. Das ist die letzt möglich Zeile, Spalte E.
Das selbe passiert, wenn ich A1 bis E1 und zusätzlich A4 bis N4 oder A7 bis AB7 auswähle.
Es scheint also zu stimmen. Die Breite des ersten Auswahl-Teils ist maßgeblich für alles Weitere.

Ich habe mir jetzt so beholfen und eine Function geschrieben:

Code:
Option Explicit

Function auswahl(nr As Long) As Range
    Dim zelle As Range
    Dim i As Long
    
    If nr > Selection.Count Then
        Set auswahl = Nothing
        Exit Function
    End If
    i = 1
    For Each zelle In Selection
        If i = nr Then Exit For
        i = i + 1
    Next zelle
    Set auswahl = zelle
End Function

Sub testAuswahl()
    Dim rückgabe As Range
    
    Set rückgabe = auswahl(7)
    If rückgabe Is Nothing Then
        MsgBox "Die auswahl enthält nur " & Selection.Count & " Zellen."
    Else
        MsgBox rückgabe.Address
    End If
End Sub

Damit wird mir die richtige Zelle zurückgegeben, bzw. wenn ich eine Zelle aufrufen will die größer ist als die Auswahl, "Nothing".

Ich denke mal, so komme ich klar.
Es bleibt aber die Frage, was sich die Excel-Programmierer dabei gedacht haben. Für mich macht das keinen Sinn.

Gruß und schönen Abend,

Andreas
 
Oben