Angenommen, ich habe einen großen nicht zusammenhängenden Bereich definiert, vielleicht . Wie würde ich die Indizierung in den Bereich einbeziehen, um sie so zu behandeln, als wäre sie zusammenhängend?Indizierung in großen nicht zusammenhängenden Bereichen
z. Ich möchte so etwas wie
Set myRange = Range("B:B,E:E,F:F")
v = myRange.ContiguousIndex(5, 3).Value 'retrieves the value in cell F5 (row 5 col 3)
Jede Methode, die ich bin mir dessen bewusst tun, der im Bereich basierend auf der ersten Zelle versetzt wird („B1“) und wird gerne außerhalb der Grenzen dieses Bereichs gehen, Verschütten in den Rest des Inhalts des Arbeitsbuchs. Das heißt, wenn Sie versuchen, auf Zeile 5, Spalte 3 zuzugreifen, erhalten Sie D5, als ob die Spalten C und D in dem Bereich liegen, den ich zu indexieren versuche.
Ich habe versucht Range.Cells, Range.Offset und Range.Range, aber alle scheinen die gleichen Spillover zu zeigen.
Der andere Ansatz, den ich im Sinn hatte, war es, die Werte einer Variante Array und manuell Index von dort zuweisen, aber dies sehr schnell wie
weil ein einfaches SnippetDim v() As Variant
v = myRange
nur den ersten Bereich zuweisen kompliziert wird der nicht zusammenhängenden Bereich in das Array, verlassen Sie mich mit einem (20^20-1) x1 Array und vollständig ignoriert den Rest von myRange. Es ist also wahrscheinlich möglich, die gesamte myRange in ein Array zu bringen, wenn ich alle Bereiche durchlaufe und sie einzeln einem Array zuweiße, das ich immer wieder neu zuweisst. Aber es ist alles andere als einfach und ich benutze ein Array, das viel mehr Speicher verbraucht als ich möchte (es sei denn, ich gebe mehr Aufwand in das Beschneiden ein oder wähle willkürlich eine kleinere Anzahl von zu kopierenden Zeilen).
An diesem Punkt wäre es viel effizienter und einfacher, die Bereiche manuell zu durchlaufen und die Indexierung selbst durchzuführen, ohne die Kosten für das Einfügen von Objekten in ein Array aufzuwenden. Dieser letzte Ansatz ist, was ich gerade mache.
Die Frage
Gibt es eine bestehende Methode oder Trick, den ich myRange behandeln kann, als ob es in der Art und Weise zusammenhängende war ich beschrieben und Index in myRange in eine Weise, dass die Diskontinuitäten ignoriert?
TL; DR Wenn ich
Set myRange = Range("B:B,E:E,F:F")
v = myRange.ContiguousIndex(5, 3).Value
haben möchte ich einige Verfahren ContiguousIndex Bereich zurückzukehren („F5“) Wert, ohne die ganze Arbeit der manuellen Überprüfung Range.Areas zu tun zu haben und die Handhabung der alle Indizierung. .
Bonus-Frage
Say myRange waren Range("E:E,B:B,F:F")
(die verschiedenen Spaltenreihenfolge bemerken). Gibt es eine schöne Möglichkeit, E als erste Spalte, B als zweites und F als die dritten, so dass
Set myRange = Range("E:E,B:B,F:F")
v = myRange.ContiguousIndex(5, 2).Value 'retrieves the value in cell B5
gibt den Wert von B5 zu behandeln? Dies ist eine Eigenschaft der Methode, die ich gerne weiter verwenden würde.
Noch einmal, die Funktion habe ich funktioniert, aber ich vermute, dass es eine Art wunderbare Methode oder Trick versteckt in allen Excels Macken, die noch besser wäre.
Es gibt keine eingebaute Methode dafür. –
Das ist bedauerlich. – Mikegrann
Warum sollte ich jemals den Rest des Blattes indexieren wollen, wenn ich eine Methode für einen bestimmten Bereich verwende? Es scheint, dass das Range-Objekt ein besseres Konzept der enthaltenen Zellen haben sollte, anstatt das Problem scheinbar auf das übergeordnete Blatt zu werfen und nur mit einem relativen Offset zu rechnen. Ich weiß, dass das meistens nur eine Beschwerde ist, aber es scheint wie ein schlechtes Design. – Mikegrann