it-swarm.com.de

Excel VBA: Bereich zu String Array in einem Schritt

Ich weiß, dass Sie einen Bereich von Zellen problemlos in ein Variant-Array aufnehmen können, aber ich möchte mit einem String-Array arbeiten (weil es eindimensional ist und weniger Speicher benötigt als ein Variant-Array).

Gibt es eine Möglichkeit, einen Bereich automatisch in ein String-Array zu konvertieren?

Im Moment verwende ich eine Funktion, die den Bereich übernimmt und die Werte in einem Variantenarray speichert und dann das Variantarray in ein String-Array konvertiert. Es funktioniert gut, aber ich suche einen Weg, um direkt vom Bereich zum String-Array zu gelangen. Jede Hilfe wäre sehr dankbar.

Function RangeToArray(ByVal my_range As Range) As String()

Dim vArray As Variant
Dim sArray() As String
Dim i As Long

vArray = my_range.Value
ReDim sArray(1 To UBound(vArray))

For i = 1 To UBound(vArray)
    sArray(i) = vArray(i, 1)
Next

RangeToArray = sArray()

End Function 

UPDATE: Es scheint, dass es keine Möglichkeit gibt, den Schritt des Auswerfens der Daten in ein variables Array zuerst zu überspringen, bevor sie in ein eindimensionales String-Array konvertiert werden. Eine Schande, wenn es wahr ist (auch wenn es nicht viel Mühe kostet, mag ich es, Ultra-Optimierung durchzuführen, also hoffte ich, dass es einen Weg gibt, diesen Schritt zu überspringen). Ich werde die Frage in einigen Tagen schließen, wenn sich keine Lösung ergibt. Danke für die hilfreichen Kommentare, Jungs!

UPDATE2: Die Antwort geht an Simon, der sich sehr bemühte (wie alle anderen auch) und tatsächlich darauf hinwies, dass es tatsächlich unmöglich ist, mit einem Schuss vom Range zum String-Array zu wechseln. Danke euch allen.

20
aevanko

Wie wäre es mit...

Public Function RangeToStringArray(theRange As Excel.Range) As String()

    ' Get values into a variant array
    Dim variantValues As Variant
    variantValues = theRange.Value

    ' Set up a string array for them
    Dim stringValues() As String
    ReDim stringValues(1 To UBound(variantValues, 1), 1 To UBound(variantValues, 2))

    ' Put them in there!
    Dim columnCounter As Long, rowCounter As Long
    For rowCounter = UBound(variantValues, 1) To 1 Step -1
       For columnCounter = UBound(variantValues, 2) To 1 Step -1
           stringValues(rowCounter, columnCounter) = CStr(variantValues(rowCounter, columnCounter))
       Next columnCounter
    Next rowCounter

    ' Return the string array
    RangeToStringArray = stringValues

End Function
10
Simon Cowen

Sie können tatsächlich direkt von einem Bereich zu einem Array wechseln, indem Sie die Funktionen Teilen, Verbinden und ein Trennzeichen verwenden, das nicht im Text steht.

Angenommen, Sie haben bereits einen 1D-Wertebereich als SrcRange zugewiesen

Dim Array() As String: Array = Split(Join(Application.Transpose(SrcRange), "#"), "#")
5
Tragamor
Function RangeToStringArray(myRange as range) as String()

    ReDim strArray(myRange.Cells.Count - 1) As String
    Dim idx As Long
    Dim c As Range
    For Each c In myRange
        strArray(idx) = c.Text
        idx = idx + 1
    Next c

    RangeToStringArray = strArray
End Function
2
J.A. Daling

Wenn Sie nichts dagegen haben, den Inhalt der Zwischenablage zu ändern, gilt Folgendes:

  1. KOPIEREN Sie den Bereich mit der Copy-Methode in die Zwischenablage:

    MyTargetRange.Copy
    
  2. Kopieren Sie den Inhalt aus der Zwischenablage in eine Zeichenfolgenvariable (durchsuchen Sie diese Site oder an anderer Stelle nach Funktionen, um Zeichenfolgen in die Zwischenablage zu übertragen).

  3. SPLIT den String in ein variantes Array:

    MyStringArray = Split(MyClipboardText, vbCrLf)
    
  4. OPTIONAL: Das Array enthält ein zusätzliches leeres Element, da am Ende des soeben in die Zwischenablage kopierten Textes immer ein zusätzlicher Return (vbCrLf) steht. Entfernen Sie einfach die Größe des Arrays:

    Redim Preserve MyStringArray(Ubound(MyStringArray) - 1)
    

Sehr einfach und schnell !!!

Nachteile bestehen darin, dass sich die Zwischenablage möglicherweise ändert, wenn Sie am wenigsten damit rechnen (während einer Neuberechnung), und dass sie nur Arrays von Zeichenfolgen (nicht Doubles oder andere numerische Werttypen) erzeugt.

Dies wäre extrem hilfreich, wenn Sie mit vielen sich wiederholenden Funktionen (Tausenden) arbeiten, die die gleichen Daten verwenden (Tausende von Datenpunkten). Wenn Sie Ihre Funktion zum ersten Mal aufrufen, führen Sie alle Zwischenberechnungen für die benötigten Datenbereiche aus, speichern Sie jedoch die Ergebnisse in statischen Variablen. Speichern Sie auch eine String-Kopie Ihrer Eingabebereiche über die Zwischenablage. Konvertieren Sie die Eingabebereiche bei jedem nachfolgenden Aufruf Ihrer Funktion erneut über die Zwischenablage in Text und vergleichen Sie sie mit der gespeicherten Kopie. Wenn sie gleich sind, können Sie möglicherweise die Zuteilung Ihrer vorläufigen Berechnungen umgehen.

1
Shawn Pauliszyn

In VBA verwendete benannte Bereiche sind bereits Arrays. Machen Sie also zunächst den Bereich in einen benannten Bereich, verweisen Sie darauf und löschen Sie den benannten Bereich. Zum Beispiel:

ThisWorkbook.Names.Add Name:="test_array", RefersTo:=Sheet1.Range("A4:B10")
a = Sheet1.Range("test_array")
ThisWorkbook.Names("test_array").Delete
0
tim goodwin