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

Zeilen in Array löschen

Zeilen in Array löschen
16.02.2016 16:41:39
SteffenS
Hallo Zusammen,
ich arbeite mich gerade in das Thema Array ein und stehe vor einem Problem, wo ich aus den diversen Foreneinträgen für mich einfach keine Lösung ableiten kann.
Ich lese in ein (zweidimensionales) Array einen Tabellenbereich ein und möchte nun anhand einiger Kriterien einige Zeilen im Array wieder löschen.
Wie stelle ich dies am Einfachsten an:
Sub test123()
Dim WSQ As Worksheet
Set WSQ = Workbooks("xyz").Sheets("xyz")
Dim qArray As Variant, zArray As Variant
qArray = WSQ.Range("K15:Z300")
Dim azeile As Long, aspalte As Long
For azeile = LBound(qArray, 1) To UBound(qArray, 1)
'Abfrage leere Werte
If qArray(azeile, 1) = "" Then
'Zeile in Array löschen
MsgBox (qArray(azeile, 1))
Else
'Spalten durchlaufen
For aspalte = LBound(qArray, 2) To UBound(qArray, 2)
'weitermachen
Next aspalte
End If
Next azeile
End Sub
Danke Euch schon mal.
VG SteffenS

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

Betreff
Datum
Anwender
Anzeige
AW: Zeilen in Array löschen
16.02.2016 17:04:28
Daniel
Hi
in dem Fall ist wahrscheinlich am einfachsten, wenn du den Quellbereich an eine freie Stelle der Tabelle kopierst, dort die nicht benötigten Zeilen löschst und dann die Werte ins Array einliest
wenn du im Array selbst die Zeilen löschen wolltest müsstest du per Schleife alle Werte, die unterhalb einer zu löschenden Zeile stehen, um eine Zeile nach oben verschieben und dann die letzte Zeile mit leerwerten füllen.
die Grösse des Arrays kannst du dabei aber nicht neu bestimmen, dh die "gelöschten Zeilen" bleiben im Array am unteren Ende als leere Zeilen erhalten.
Gruß Daniel

Anzeige
AW: Zeilen in Array löschen
16.02.2016 17:14:47
Rudi
Hallo,
Schema:
Sub aaa()
Dim vArr
Dim i As Long, j As Long, k As Long
vArr = Range("A1:F30")
vArr = WorksheetFunction.Transpose(vArr)
For i = UBound(vArr, 2) To 1 Step -1
If vArr(1, i) = "" Then
For j = i + 1 To UBound(vArr, 2)
For k = 1 To UBound(vArr)
vArr(k, j - 1) = vArr(k, j)
Next
Next
ReDim Preserve vArr(1 To UBound(vArr), 1 To UBound(vArr, 2) - 1)
End If
Next i
vArr = WorksheetFunction.Transpose(vArr)
End Sub
Gruß
Rudi

AW: Zeilen in Array löschen
17.02.2016 16:30:29
SteffenS
Hallo,
mal noch eine Frage, aus welchen Grund ist ein notwendig Zeilen und Spalten im Array zu tauschen
und was wird der Schleife gemacht sofern die Bedingung erfüllt ist.
Sorry für die blöden Fragen
VG SteffenS

Anzeige
Der HptGrund besteht, wie unten beschrieben, ...
17.02.2016 20:05:49
Luc:-?
…darin, Steffen,
die ungenutzten Positionen aus dem Array entfernen zu können. Ansonsten kann man damit auch aus ZellBezügen reine Werte machen bzw ein kompatibles irreguläres (1)-(1)-dimensionales Array in ein reguläres 2-dimensionales verwandeln. UBound und ReDim fktionieren generell mit Arrays, egal, was diese enthalten. ReDim allerdings immer nur für die letzte Dimension (vgl meine AW unten!).
Luc :-?

Man kann auch aufs Löschen verzichten, ...
16.02.2016 20:42:43
Luc:-?
…Steffen,
wenn man das Array gleich ohne die entfallenden Zeilen bildet, zB so:
Sub Test124()
Const adQBer$ = "A1:F30", tiQWb$ = "xyz", tiQWs$ = "xyz"
Dim iz As Long, zz As Long, arQDat, avZDat, _
qBer As Range, xZ As Range, wf As WorksheetFunction
Set wf = WorksheetFunction
Set qBer = Workbooks(tiWb).Sheets(tiWs).Range(adQBer)
'    Set qBer = ActiveSheet.Range(adQBer)
zz = qBer.Rows.Count - wf.CountBlank(qBer.Columns(1))
ReDim arQDat(zz - 1)
For Each xZ In qBer.Rows
If Not IsEmpty(xZ.Cells(1)) Then _
arQDat(iz) = xZ: iz = iz + 1
Next xZ
avZDat = wf.Transpose(wf.Transpose(arQDat))
'    ActiveWindow.RangeSelection.Resize(UBound(avZDat, 1), _
'        UBound(avZDat, 2)) = avZDat
Set qBer = Nothing: Set wf = Nothing
arQDat = Empty: avZDat = Empty
End Sub
Hier wird erst ein Variant-Array mit QuellBereichsBezügen zeilenweise aus dem QBereich gebildet. Das entstehende Array ist ein vertikal-1-dimensionaler Vektor mit horizontal-1-dimensionalen Vektoren als Elemente → Index(0)(1)…(29)(6). Dieser wird zum Schluss mit wf.Transpose in ein klassisch-2dimensionales MatrixDatenfeld, Index(1,1)…(30,6), umgewandelt, das keinen BereichsBezug mehr hat. Ohne das könnte das ursprünglich entstandene Datenfeld aus einer SubProzedur heraus nicht auf einen ZellBereich ausgegeben wdn (eine UDF [FunktionsProzedur] in einer ZellFml könnte das aber, weil hier die Xl-Steuerung greift, die diesen einfachen Fall noch bewältigen kann).
Gruß, Luc :-?
Besser informiert mit …

Anzeige
AW: Man kann auch aufs Löschen verzichten, ...
17.02.2016 16:13:12
SteffenS
Hallo Luc,
danke für die Ausführungen. Da ich mich in das Thema array erst einarbeiten muss, verstehe ich Deine Anmerkungen nicht so richtig.
Kannst Du es vielleicht nochmal etwas einfacher erklären, gerade mit dem zerlegen und dann wieder zusammensetzen geht mir nicht auf.
Danke Dir nochmal
VG Steffen

Du wirst sicher verstehen, ...
17.02.2016 19:45:55
Luc:-?
…Steffen,
dass ich ebenso wie andere wenig Lust habe, mich ständig zu wiederholen. Zu Arrays und ihren Typen gibt's 'ne Menge Erläuterungen im Netz, nur wird der Variant-Typ idR etwas stief­mütter­lich behandelt. Hier hilft dann aber das Recherche-Stichwort Arrays in Array.
Der Unterschied zwischen Rudis Lösung und meiner (beide bilden das Array aus dem ZellBereich) besteht darin, dass Rudi erst ein Array über den GesamtBereich bildet und das mit .Transpose vom ZellBereich trennt, weil das Array sonst ZellBezüge, keine Werte enthält. Das mache ich erst zum Schluss und zwar gleich 2×, damit Zeilen und Spalten nicht vertauscht wdn. Rudi macht das auch, nur trennt er das in 2 Anweisungen, eine vor und eine nach Array-Befüllung. Dadurch kann er gleich mit echten bezugslosen Datenfeldern (Arrays) arbeiten und damit UBound und ReDim Preserve verwenden, wodurch die Überdimensionierung der letzten Dimension beseitigt wdn kann. Da immer nur die letzte Dimension geändert wdn kann, Zeilen aber die 1.Dimension bilden, war es auch sinnvoll, erst nur 1× .Transpose zu verwenden und erst zum Schluss die alte Anordnung wiederherzustellen.
Da ich ganz anders vorgehe, war das nicht erforderlich. Mein Pgm übernimmt die ZellBezüge der Daten zeilenweise in Elemente eines vertikalen Vektors und das nur, wenn deren 1.Bezug nicht auf eine LeerZelle verweist. Wenn man die Werte eines solchen Element­Vektors einzeln ansprechen wollte, müsste man das mit arQDat(i)(j) tun. Alle beteiligten Vektoren (auch der vertikal gerichtete HptVektor) sind übrigens 1dimensional!
Dadurch, dass diese Arrays in einem Array zum Schluss 2× transponiert wdn, entsteht aber ein ganz normales 2dimen­sionales Array (Matrix), dessen Elemente mit avZDat(i, j) ange­sprochen wdn können, wobei auch der ZeilenIndex nicht mehr mit 0, sondern mit 1 beginnt.
Du hast jetzt also die Wahl zwischen beiden Pgmm, wobei du dich für das schnellere entscheiden solltest, was du aber erst bei größeren Daten­Mengen fest­stellen kannst. Da beide Pgmm aber mit .Transpose arbeiten, ist die Daten­Menge durch die Limitationen dieser XlFkt begrenzt. Wenn das also sehr große Daten­Mengen wdn sollten, wäre einer der Objekt-Array-Typen (wie bspw ein Dictionary, das auch Vektoren als Elemente enthalten kann) vorzuziehen.
Luc :-?

Anzeige
AW: Du wirst sicher verstehen, ...
18.02.2016 11:14:47
SteffenS
Hallo,
danke für die ausführlichen Erläuterungen.
Muss mich da nochmal intensiver Beschäftigen.
Werde die erste Lösung verwenden. Ist (für mich) ein wenig einfacher.
Hat diese irgendwelche Performancenachteile?
VG SteffenS

Normalerweise nicht, evtl bei größeren ...
18.02.2016 14:41:00
Luc:-?
…Datenmengen, Steffen;
einfacher ist relativ und hängt hier wohl allein von deinen Kenntnissen ab. ;-)
Übrigens, bei arQDat kann jede vermeintliche „Dimension“ separat genutzt wdn → arQDat ist alles, arQDat(i) eine ganze Zeile und arQDat(i)(j) ein Wert. Wollte man eine ganze Spalte haben, müsste das andersherum aufgebaut wdn. Macht man also beides (2 unterschiedlich orientierte Arrays mit gleichen Daten), ist man auch vollständig flexibel. Diese Kenntnis kann also mal sehr nützlich sein.
Luc :-?

Anzeige
AW: Normalerweise nicht, evtl bei größeren ...
18.02.2016 17:14:47
SteffenS
Danke nochmal :-)
SteffenS

18 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige