Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Einzelne Listojekt Spalte aus Array Füllen

Forumthread: Einzelne Listojekt Spalte aus Array Füllen

Einzelne Listojekt Spalte aus Array Füllen
19.08.2019 11:30:43
Andreas
Hallo Liebe Forum Mitglieder
Ich bin auf der suche nach etwas Hilfe bei einem Makro das ursprünglich mit Hilfe dieses Forums entstanden ist. Und zwar, ich versuche es dahingehen zu ändern das ich die Werte für eine Hilfspalte nicht direkt in die Tabelle schreibe, sondern zuerst in ein Array und dann das Array auf einmal in eine Hilfspalte. Es funktioniert aber nicht.
Es wird nur der erste Wert des Arrays in alle Zellen der Hilfsspalte geschrieben. Ich würde eine schleife gerne vermeiden weil die Zeilenanzahl so groß ist, das es recht lange dauert. Wenn es einzelne Tabellenzugriffe sind. Ich hab es bis jetzt auf zwei Arten Probiert.
iTabDaten.ListColumns(29).DataBodyRange = arrSichtbar

und
wsDaten.Range(Cells(2, iDatenLS + 1), Cells(iDatenLZ, iDatenLS + 1)) = arrSichtbar
Immer mit dem selben falschen Ergebnis.
Hintergrund:
Ich will Zeilen die durch einen Advancefilter ausgeblendet wurden über die eingeblendeten Zeilen Sortiere.
• Dazu setze ich zuerst den Advancefilter.
• Erfasse dann in einem gleichgroßen Array welche Zeilen EIN/AUS geblendet sind indem ich einfach nur die Buchstaben A (Ausgeblendet) und E (eingeblendete) in das Array Schreibe.
• Anschließend löse ich den Advancefilter wider auf. Und würde gerne das Array auf einen schlag in eine Hilfsspalte der Tabelle Schreiben. (Was nicht funktionieren will)
• Dann sortiere ich nach der Hilfsspalte.
• Lösche den Inhalt der Hilfspalte.
• Und Setze den Advance Filter wider ein
Wäre für eure Hilfe wirklich dankbar und natürlich auch für jeden Verbesserungsvorschlag.
Danke und Grüße
Andreas
PS Ganzer Code Folgt noch.
Anzeige

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Einzelne Listojekt Spalte aus Array Füllen
19.08.2019 11:40:01
Andreas
Das wäre der ganze Code den ich verwende
 Sub ZeilenUmsortieren()
Dim wsDaten As Worksheet
Dim iTabDaten As ListObject
Set wsDaten = ThisWorkbook.Worksheets("Daten")
Set iTabDaten = wsDaten.ListObjects("Daten_IntelligenteTabelle")
Dim iDatenLZ As Long, iDatenLS As Long
Dim i As Integer
Dim arrSichtbar As Variant
''Letzte zeile und letze Spalte des Listojekt erfassen
iDatenLS = iTabDaten.ListColumns.Count
iDatenLZ = wsDaten.ListObjects("Daten_IntelligenteTabelle").ListRows.Count + 1
''Dimensionieren des Arrays
ReDim arrSichtbar(2 To iDatenLZ)
''Advancefilter setzen
Call SpezialfilterDatum1(True)
''Erfassen welche Zeilen eingebledetet und welche ausgeblendet sind in einem Array
For i = iDatenLZ To 2 Step -1
If iTabDaten.Range.Rows(i).Hidden = True Then
arrSichtbar(i) = "A"
Else
arrSichtbar(i) = "E"
End If
Next
''Advancfilter auflösen
If wsDaten.FilterMode = True Then wsDaten.ShowAllData
''Array in Hilfsspalte übernehmen
iTabDaten.ListColumns(iDatenLS + 1).DataBodyRange = arrSichtbar
''Sortieren Nach Hilfsspalte
Range("Daten_IntelligenteTabelle[#All]").Select
With iTabDaten
.Sort.SortFields.Clear
.Sort.SortFields.Add Key:=Range("Daten_IntelligenteTabelle[S29]"), SortOn:= _
xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
.Sort.Header = xlYes
.Sort.MatchCase = False
.Sort.Orientation = xlTopToBottom
.Sort.SortMethod = xlPinYin
.Sort.Apply
End With
''Inhalt hilfsspalte Löschen
iTabDaten.DataBodyRange.Columns(iDatenLS).ClearContents
''Advancefilter  wider setzen
Call SpezialfilterDatum1
Range("A1").Select
End Sub

Sub SpezialfilterDatum1(Optional Kriterien As Boolean)
Dim Von As Date, Bis As Date
Dim wsZeitraum As Worksheet, wsDaten As Worksheet
Dim iTabZeitraum As ListObject, iTabDaten As ListObject
Set wsDaten = ThisWorkbook.Worksheets("Daten")
Set iTabDaten = wsDaten.ListObjects("Daten_IntelligenteTabelle")
'Filter Löschen
If wsDaten.AutoFilterMode = True Then If wsDaten.FilterMode = True Then wsDaten.AutoFilter. _
ShowAllData
''Wenn True Übergeben dann Kriterien Bereich erstellen
If Kriterien Then
Von = wsDaten.OLEObjects("TextBox1").Object.Value 'Von
Bis = wsDaten.OLEObjects("TextBox2").Object.Value 'Bis
wsDaten.Range("AF23:AG23").Value = "Von"
wsDaten.Range("AH23:AI23").Value = "Bis"
wsDaten.Range("AF24").Value = ">=" & CLng(Von)
wsDaten.Range("AH24").Value = ">=" & CLng(Von)
wsDaten.Range("AG24").Value = "=" & CLng(Bis)
wsDaten.Range("AG25").Value = ">=" & CLng(Von)
wsDaten.Range("AH25").Value = "=" & CLng(Von)
wsDaten.Range("AG26").Value = "
Grüße Andreas
Anzeige
AW: Einzelne Listojekt Spalte aus Array Füllen
19.08.2019 11:41:27
Daniel
Hi
wie wird denn das Array arrSichtbar erstellt und ist es ein- oder zweidimenional?
eindimensionale Arrays werden, wenn sie in Tabellenblätter geschrieben werden, wie zweidimensionale Arrays, die aus einer Zeile und vielen Spalten bestehen, behandelt.
entweder du erstellst dein arrSichtbar als zweidimensionales Array mit vielen Zeilen und einer Spalte
oder wenn du beim eindimensionalen Array bleiben willst, musst du beim zurückschreiben transponieren:
iTabDaten.ListColumns(29).DataBodyRange = Worksheetfunction.Transpose(arrSichtbar)
Gruß Daniel
Anzeige
AW: Einzelne Listojekt Spalte aus Array Füllen
19.08.2019 12:55:26
Andreas
Hallo Daniel
Danke für die Antwort
So hat es bis jetzt ausgesehen, also Eindimensional
Dim arrSichtbar As Variant
''Dimensionieren des Arrays
ReDim arrSichtbar(2 To iDatenLZ)
''Erfassen welche Zeilen eingebledetet und welche ausgeblendet sind in einem Array
For i = iDatenLZ To 2 Step -1
If iTabDaten.Range.Rows(i).Hidden = True Then
arrSichtbar(i) = "A"
Else
arrSichtbar(i) = "E"
End If
Next
''Array in Hilfsspalte übernehmen
iTabDaten.ListColumns(29).DataBodyRange = arrSichtbar
Transponieren Funktioniert vielen dank. :)
Was ist den Prinzipiell Besser/Schneller, Transponieren oder ein zweidimensionales Array verwenden? Hast du vielleicht noch irgendwelche Vorschläge wie ich das Makro besser machen kann. Vor allem in punkto Geschwindigkeit. Abgesehen vom ausschalten der Bildschirm Aktualisierung usw. meine ich.
Aus Solchen Vorschlägen lerne ich immer sehr viel, deswegen die frage.
Ursprünglich hatte ich es direkt in die Tabelle geschrieben mit
For i = iDatenLZ To 2 Step -1
If iTabDaten.Range.Rows(i).Hidden = True Then
wsDaten.Cells(i, iDatenLS + 1).Value = "A"
Else
wsDaten.Cells(i, iDatenLS + 1).Value = "E"
End If

Aber das war zu langsam weil es so viele Zeilen sind.
Grüße
Andreas
Anzeige
AW: Einzelne Listojekt Spalte aus Array Füllen
19.08.2019 13:18:15
Daniel
hi
kommt auf deine Excelversion und die Datenmenge an.
in den älteren Excelversionen (bis 2010) war Transponieren recht langsam und hatte ein Limit bei 65536 Zeilen/Spalten)
ab 2013 scheint das Transponieren schneller geworden zu sein und das Limit gilt auch nicht mehr.
wenn du das ganze gleich in 2-D machst, musst halt immer den 2. Parameter mitführen, dafür sparst du am Schluss das transponieren.
ReDim arrSichtbar(2 To iDatenLZ, 1 to 1)
arrSichtbar(i, 1) = "A"
zu dem ganzen nochmal ne ganz andere Idee wie du das schleifenfrei machen könntest:
Ergänze in der Tabelle, die du mit dem Spezialfilter bearbeitest, eine Spalte mit der Formel: =Teilergebnis(103;A1)
wobei A1 ein bezug auf eine Zelle in der gleichen Zeile die einen Wert enthält, sein sollte.
das Ergebnis der Teilergebnisformel ist 1 für eingeblendet und 0 für ausgeblendet.
das ergebnis kannst du dann entweder direkt in ein Array einlesen, oder du kannst die Werte direkt übertragen, aber dann mit Range(...).Value = Range(...).Value
das währe wahrscheinlich am schnellsten und würde dir jede Menge Programmieraufwand sparen
Gruß Daniel
Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

Einzelne Listojekt Spalte aus Array Füllen in Excel


Schritt-für-Schritt-Anleitung

  1. Makro erstellen: Öffne den Visual Basic for Applications (VBA) Editor in Excel (Alt + F11).

  2. Neues Modul hinzufügen: Klicke mit der rechten Maustaste auf "VBAProject (DeinWorkbookName)" und wähle "Einfügen" > "Modul".

  3. Code einfügen: Kopiere den folgenden Code in das Modul:

    Sub ZeilenUmsortieren()
       Dim wsDaten As Worksheet
       Dim iTabDaten As ListObject
       Set wsDaten = ThisWorkbook.Worksheets("Daten")
       Set iTabDaten = wsDaten.ListObjects("Daten_IntelligenteTabelle")
       Dim iDatenLZ As Long, iDatenLS As Long
       Dim i As Integer
       Dim arrSichtbar As Variant
    
       'Letzte Zeile und letzte Spalte des ListObjects erfassen
       iDatenLS = iTabDaten.ListColumns.Count
       iDatenLZ = wsDaten.ListObjects("Daten_IntelligenteTabelle").ListRows.Count + 1
    
       'Dimensionieren des Arrays
       ReDim arrSichtbar(2 To iDatenLZ)
    
       'Advancefilter setzen
       Call SpezialfilterDatum1(True)
    
       'Erfassen welche Zeilen eingeblendet und welche ausgeblendet sind
       For i = iDatenLZ To 2 Step -1
           If iTabDaten.Range.Rows(i).Hidden = True Then
               arrSichtbar(i) = "A"
           Else
               arrSichtbar(i) = "E"
           End If
       Next
    
       'Array in Hilfsspalte übernehmen
       iTabDaten.ListColumns(iDatenLS + 1).DataBodyRange = WorksheetFunction.Transpose(arrSichtbar)
    
       'Sortieren nach Hilfsspalte
       'Sortiercode hier einfügen
    
       'Inhalt Hilfspalte löschen
       iTabDaten.DataBodyRange.Columns(iDatenLS).ClearContents
    
       'Advancefilter wieder setzen
       Call SpezialfilterDatum1
    End Sub
  4. Makro ausführen: Schließe den VBA-Editor und führe das Makro über die Entwicklertools oder mit Alt + F8 aus.


Häufige Fehler und Lösungen

  • Fehler: Nur der erste Wert des Arrays wird geschrieben
    Lösung: Stelle sicher, dass du das Array korrekt transponierst, wenn du es in die Hilfsspalte überträgst. Verwende WorksheetFunction.Transpose(arrSichtbar).

  • Fehler: Fehlermeldung beim Zugriff auf das Array
    Lösung: Überprüfe, ob das Array ordnungsgemäß dimensioniert wurde und dass du beim Zugriff auf die Elemente die richtigen Indizes verwendest.


Alternative Methoden

  • Zweidimensionales Array verwenden: Anstatt ein eindimensionales Array zu nutzen, könntest du ein zweidimensionales Array erstellen. Dadurch sparst du dir das Transponieren:

    ReDim arrSichtbar(2 To iDatenLZ, 1 To 1)
  • Formel in der Tabelle nutzen: Du kannst eine Formel wie =Teilergebnis(103;A1) in einer neuen Spalte hinzufügen, um die Sichtbarkeit der Zeilen zu bestimmen. Dies kann die Programmierung vereinfachen und die Geschwindigkeit erhöhen.


Praktische Beispiele

  • Beispiel für den Einsatz von Teilergebnis: Füge in eine Hilfsspalte die Formel =Teilergebnis(103;A2) ein und ziehe sie nach unten. So erhältst du 1 für eingeblendete und 0 für ausgeblendete Zeilen.

  • Sortierung nach Hilfsspalte: Du kannst die Sortierung nach der Hilfsspalte in dein Makro integrieren, um die Daten schnell zu ordnen.


Tipps für Profis

  • Bildschirmaktualisierung deaktivieren: Deaktiviere die Bildschirmaktualisierung vor dem Ausführen des Makros, um die Geschwindigkeit zu erhöhen:

    Application.ScreenUpdating = False
  • Datenübertragung optimieren: Verwende Range(...).Value = Range(...).Value, um Daten direkt zu übertragen, was schneller ist als das Arbeiten mit Schleifen.


FAQ: Häufige Fragen

1. Frage
Was ist schneller, Transponieren oder ein zweidimensionales Array?
Antwort: In neueren Excel-Versionen (ab 2013) ist das Transponieren schneller geworden. Wenn du jedoch ein zweidimensionales Array verwendest, vermeidest du den zusätzlichen Schritt des Transponierens.

2. Frage
Wie kann ich die Performance meines Makros verbessern?
Antwort: Deaktiviere die Bildschirmaktualisierung und vermeide Schleifen, indem du Arrays effizient nutzt und Formeln in der Tabelle einsetzt.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige