Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1408to1412
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

Sub-Array to Range - möglich?

Sub-Array to Range - möglich?
14.02.2015 20:32:47
Michael

Hallo ans Forum,
weiss jemand, ob es möglich ist, Teil eines Arrays in einen Range zu schreiben? Der Teil des Arrays ist dabei nicht in der oberen linke Ecke angesiedelt...
Man stelle sich ein Array von 5x5 vor. Kann ich auf irgendeine Weise so auf das Array zugreifen, dass ich das "innere Quadrat" von 3x3 Elementen auf einen Schlag in ein Range schreiben kann?
(Quasi "Range(ZelleLinksOben,ZelleRechtsUnten)" fuer Arrays - gibt es sowas?)
Freue mich auf Eure Ideen und Gedanken dazu.
Vielen Dank
Michael

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Sub-Array to Range - möglich?
14.02.2015 20:52:04
Daniel
Hi
ich kenne keine Funktion die sowas direkt macht.
am sinnvollsten ist hier wohl ein leeres 3x3-Array zu erstellen, die Daten per Schleife zu übertragen und dann dieses Array in die Zellen zu schreiben.
Schleifen mit Arrays sind sehr schnell, daher sollte man sich nicht scheuen sowas selbst zu programmieren.
Gruß Daniel

AW: Sub-Array to Range - möglich?
14.02.2015 21:00:05
Michael
Hallo Daniel,
danke erst einmal fuer Deine Antwort. Ich selbst habe auch schon daran gedacht per Schleife das Array in ein anderes umzuschreiben. Dabei nervt aber dass man offenbar jedes Element einzeln uebertragen muss. Bei so einem kleinen Array ist das kein Problem, aber wenn ich eine grosse Tabelle in das Array geladen habe und ich einen Teilbereich daraus woanders hinkopieren will ist das schon eine andere Sache denke ich. Ich frage mich daher ob es am Ende dann vielleicht effizienter ist, die Koordinaten des Sub-Arrays zu verwenden, um auf den Quell-Range zuzugreifen und dann per Copy-PasteSpecial in den Zielbereich zu schreiben. Somit kann man wenigstens viele Zellen auf einen Streich schreiben. Was meinst Du?
Michael

Anzeige
AW: Sub-Array to Range - möglich?
14.02.2015 21:09:24
Daniel
HI
das hängt immer davon ab, was du genau machen willst.
Wenn die Daten in einer Exceltabelle liegen, ist es natürlich sinnvoller auf einen Teilbereich dieser Tabelle zuzugreifen.
Wenn die Daten aber in so einem echten Array vorliegen, dann sollte man solche Schleifen nicht scheuen.
Schleifen über reine Wert-Arrays sind sehr schnell, meisten schneller als bereits vorhandene VBA- oder Excelfunktionen.
so ist beispielsweise:
Arr2 = Worksheetfunction.Transpose(Arr1) 

langsamer als:
Redim Arr2(1 to Uboud(Arr1, 2), 1 To Ubound(Arr1, 1))
For x = 1 to Ubound(Arr1)
For y = 1 to Ubound(Arr1)
Arr2(y, x) = Arr1(x, y)
Next
Next
und hat zudem noch ein Mengenproblem, dh die Schleife verarbeitet wesentlich grössere Arrays problemlos als die Transpose-Funktion.
Gruß Daniel

Anzeige
AW: Sub-Array to Range - möglich?
14.02.2015 21:22:38
Michael
Hmmm, Ok...
In meinem Fall versuche ich gerade VBA-Code zu optimieren, indem ich statt in einem Range nach passenden Daten in einem Array nach passenden Daten suche und somit Zugriffe auf das Objektmodell minimiere. Zuvor habe ich per Schleife im Rangebereich Spaltenkoepfe durchsucht und bei passenden Eintraegen dann die Spalte des Rangebereiches woanders hinkopiert. Nun lese ich den gesamten Range vorab in ein Array ein und suche innerhalb des Arrays, was ja schon mal besser ist. Hatte halt nur die Befuerchtung, dass ich das Plus an Performance wieder verschenke wenn ich nun bei passenem Eintrag per Sub-Routine erst einmal die gesamte Spalte des Ranges Zelle fuer Zelle in ein Sub-Array schreiben muss bevor ich es in es in den Zielbereich schreibe. Laut Deinem letztem Post ist diese Angst aber eher unbegruendet wenn ich das recht verstanden habe ich werde am Ende immernoch schneller sein als vorher, richtig?
Michael

Anzeige
AW: Sub-Array to Range - möglich?
14.02.2015 21:34:21
ransi
HAllo Michael,
  • ...erst einmal die gesamte Spalte des Ranges Zelle fuer Zelle in ein Sub-Array schreiben muss...

  • Genau das mach man bei einem Array ja nicht.
    Da schreibt man ganze Zellbereich auf einmal in ein Array.
    ransi

    AW: Sub-Array to Range - möglich?
    14.02.2015 21:43:34
    Michael
    Hallo Ransi,
    habe mich leider missverstaendlich ausgedrueckt: Ich meinte, wenn ich einen passenden Eintrag im Array-Spaltenkopf gefunden habe, braucht die gesamte Array-Spalte um sie woanders hinzukopieren. Ich muss dann also die gesamte Array-Spalte Zeile per Zeile in ein anderes Array kopieren. Richtig? Wenn wir nun von ca. 300 Zeilen sprechen, die pro passendem Eintrag transferiert werden muessen und durchschnittlich vielleicht 80 passenden Eintraegen insgesamt, bin ich dann immernoch besser dran im Array zu suchen?
    Michael

    Anzeige
    AW: Sub-Array to Range - möglich?
    14.02.2015 22:05:47
    ransi
    Hallo,
    Ich muss dann also die gesamte Array-Spalte Zeile per Zeile in ein anderes Array kopieren.
    Nö, das geht z.B. recht gut mit worksheetfunction.Index()
    Die nimmt die gesamte Spalte.
    Das Umschaufeln in ein anderes Array geht aber trotzdem schneller.
    Schau es dir mal an:
    Ein Array("A1:M100000") wird auf einmal eingelesen.
    Daraus wird der Bereich "B3:L80000" extrahiert und ausgegeben.
    Option Explicit

    Sub machs()
        Dim arr As Variant
        Dim out As Variant
        Dim dblT As Double
        arr = Range("A1:M100000")
        dblT = Timer
        out = extractArray(arr, 3, 80000, 2, 12) 'B3:L80000 Umschaufeln und
        MsgBox Timer - dblT
        'Ausgeben
        Range("P1").Resize(UBound(out) - LBound(out) + 1, UBound(out, 2) - LBound(out, 2) + 1) = out
    End Sub


    Function extractArray(vntArr As Variant, startZeile As Long, endeZeile As Long, startSpalte As Integer, endeSpalte As Integer) As Variant
        Dim L As Long
        Dim I As Integer
        Redim vnttmp(startZeile To endeZeile, startSpalte To endeSpalte)
        For L = startZeile To endeZeile
            For I = startSpalte To endeSpalte
                vnttmp(L, I) = vntArr(L, I)
            Next
        Next
        extractArray = vnttmp
    End Function



    DAs Umschaufeln dauert auf meinem Erbsenzähler noch nicht einmal 0,5 Sekunden.
    ransi

    Anzeige
    AW: Sub-Array to Range - möglich?
    14.02.2015 22:31:16
    Michael
    Super, danke Dir Ransi,
    das war fuer mich eine wichtige Entscheidungshilfe: Umschaufeln in ein anderes Array ist also kein Problem. Werde somit diese Loesung verfolgen und mich morgen gleich an die Programmierung machen. Vielen Dank noch einmal an Ransi und an Daniel! :-)
    Gruss
    Michael

    303 Forumthreads zu ähnlichen Themen

    Anzeige
    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Anzeige