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

Autofilter Abhängig von der Anzahl der Werte in der Spalte

Autofilter Abhängig von der Anzahl der Werte in der Spalte
05.03.2024 13:12:06
Max_Bot
Hallo Zusammen,
Ich habe einen Datensatz, bestehend aus einer Auflistung von Bauteilen. Insgesamt knapp 32000 Bauteile, von denen ich teilweise mehrere mit der gleichen Bezeichnung habe. Für mich sind nur die Bauteile interessant, die mindestens 10mal aufgeführt wurden. Ich habe versucht, einen Code für einen Autofilter zu erstellen.
Leider funktioniert das nur mäßig. Zur Kontrolle und für die weitere Verarbeitung lasse ich mir die Bauteile und die Häufigkeit der Bauteile in einer Listbox anzeigen.


Hier mein Ansatz für den nicht funktionierenden Autofilter:

Private Sub Test_Click()


Dim tbl As ListObject
Dim rng As Range
Dim cell As Range
Dim dict As Object
Dim count As Integer


Set tbl = ThisWorkbook.Sheets("Abfrage1").ListObjects("Abfrage1")
Set rng = tbl.ListColumns("Bezeichnung Bauteil").DataBodyRange
Set dict = CreateObject("Scripting.Dictionary")


For Each cell In rng
If cell.Value > "" Then
If dict.exists(cell.Value) Then
dict(cell.Value) = dict(cell.Value) + 1
Else
dict.Add cell.Value, 1
End If
End If
Next cell

tbl.Range.AutoFilter Field:=rng.Column

For Each Key In dict.keys
If dict(Key) 10 Then
tbl.Range.AutoFilter Field:=rng.Column, Criteria1:=">" & Key
End If
Next Key

MsgBox "Filtern abgeschlossen."

Set dict = Nothing

End Sub


Die Ergebnisse aus der Tabelle kontrolliere ich in der Listbox.
Soweit ich das erkenne, funktioniert das wie gewollt.

Private Sub cb_Auführen1_Click()


Me.ListBox1.Clear

HäufigsteWörterInListbox

End Sub


Sub HäufigsteWörterInListbox()

ListBox1.ColumnCount = 2

Dim tbl As ListObject
Dim wordRange As Range
Dim wordCount As Long
Dim i As Long
Dim wordDict As Object
Dim word As Variant
Dim sortedWords() As Variant
Dim sortedCounts() As Variant
Dim j As Long

Set tbl = ActiveSheet.ListObjects("Abfrage1")
Set wordRange = tbl.ListColumns("Bezeichnung Bauteil").DataBodyRange
Set wordDict = CreateObject("Scripting.Dictionary")

On Error Resume Next
For Each word In wordRange.SpecialCells(xlCellTypeVisible)
If Not wordDict.exists(word.Value) Then
wordDict.Add word.Value, 1
Else
wordDict(word.Value) = wordDict(word.Value) + 1
End If
Next word
On Error GoTo 0

ReDim sortedWords(1 To wordDict.count)
ReDim sortedCounts(1 To wordDict.count)
i = 1
For Each word In wordDict.keys
sortedWords(i) = word
sortedCounts(i) = wordDict(word)
i = i + 1
Next word
For i = 1 To wordDict.count - 1
For j = i + 1 To wordDict.count
If sortedCounts(j) > sortedCounts(i) Then
Dim tempWord As Variant
Dim tempCount As Variant
tempWord = sortedWords(i)
tempCount = sortedCounts(i)
sortedWords(i) = sortedWords(j)
sortedCounts(i) = sortedCounts(j)
sortedWords(j) = tempWord
sortedCounts(j) = tempCount
End If
Next j
Next i

For i = 1 To 1000
If i > wordDict.count Then Exit For
Me.ListBox1.AddItem sortedWords(i)
Me.ListBox1.List(i - 1, 1) = sortedCounts(i)
Next i

End Sub


Hat jemand eine Idee wie man den Autofilter ans laufen bekommt?
Danke im voraus!

Gruß
Max

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

Betreff
Datum
Anwender
Anzeige
AW: Autofilter Abhängig von der Anzahl der Werte in der Spalte
05.03.2024 13:50:22
Yal
Hallo Max,

es müsste eine Hilfespalte mit Zählenwenn-Formel, die Du auf 10+ filtern könntest. Bei 32.000 DS wird es ungemüdlich.

Alternativ ist Power Query. Das Ergebnis wird in einer separaten Tabelle aufgeführt:
gehe auf die Tabelle "Bezeichnung Bauteil",
Menü "Daten", "aus Tabelle/Bereich"
Schon bist Du in Power Query Editor.

Auf die Abfrage links rechtsklicken und "Duplizieren" auswählen,
in der zweite Abfrage die Spalte mit der Bauteile markieren,
Menü "Transformieren", "Gruppieren nach",
Einstellung steht schon auf die richtige Spalte (oben) und die richtige Aggregationsformel "Zeilen zählen".
Übrig bleiben die Bauteile und wie oft sie vorkommen.
Auf die Spalte "Anzahl", filter nach zahlenfilter "Größer als oder gleich..." 10

Gehe auf die erste Abfrage, Menü "Start", "Abfrage zusammenführen",
wähle in unteren Bereich die zweite Abfrage,
wähle in beiden Abfrage die Bauteil-Spalte,
Join-Art "innerer Join".
Es fügt sich eine neue Spalte, die aber unrelevant ist, weil durch den Join die Bauteile mit weniger als 10 Treffer schon rausgefiltert sind.
Auf dem Spaltenüberschrift dieser Spalte rechtsklicken und "Entfernen" wählen.
Dann Menü "Datei", "Schliessen & laden".
Fertig.

Da es ein Abfrage ist, kannst Du das Ergebnis(-Tabelle) jederzeit rechtsklicken und "Aktualisieren" (macht aber nur Sinn, wenn die Quelle sich geändert hat).

Du kannst auch die Verarbeitung zwischen 2 Datein machen. Insbesonders wenn diese Bauteilliste aus einer Datei oder eine Datenbank kommt.

Und wenn Du auf Power Query neugierig geworden bist, hier das Forum-Lieblingstutorial: https://excelhero.de/power-query/power-query-ganz-einfach-erklaert/

VG
Yal
Anzeige
AW: Autofilter Abhängig von der Anzahl der Werte in der Spalte
05.03.2024 15:11:23
daniel
Hi
wenn du lieber in einer Tabelle arbeitest, dann spiel dir doch einfach die Ergebnisse des Dictionarys in die Tabelle zurück.
dann hast du die Anzahlen der Verwendung in einer Spalte und kannst damit arbeiten (sortieren, filtern usw)
über das Dictionary geht das sehr schnell, deutlich schneller als mit ZählenWenns.

Private Sub Test_Click()


Dim tbl As ListObject
Dim rng As Range
Dim z as long
Dim dict As Object
Dim count As Integer

dim arr

Set tbl = ThisWorkbook.Sheets("Abfrage1").ListObjects("Abfrage1")
Set rng = tbl.ListColumns("Bezeichnung Bauteil").DataBodyRange
Set dict = CreateObject("Scripting.Dictionary")

arr = rng.value
for z = 1 to ubound(arr)
dict(arr(z, 1)) = dict(arr(z, 1)) + 1
next

for z = 1 to ubound(arr, 1)
arr(z, 1) = dict(arr(z, 1))
next

rng.Offset(0, ?).value = arr 'hier einen Offsetwert eingeben, bis du eine freie Spalte bzw die Spalte erreichst, in der die Anzahl stehen soll.




End Sub
Anzeige
AW: Autofilter Abhängig von der Anzahl der Werte in der Spalte
05.03.2024 14:43:48
Max_Bot
Hallo Yal,
erstmal danke für die schnelle Antwort.
Es handelt sich tatsächlich um einen SQL-Export einer Datenbank. Die Datenbank wächst laufend bzw. verändert sich, die abgerufenen Daten sollen in unregelmäßigen Abständen aktualisiert werden.
Leider ist es wichtig, die Tabelle vollständig zu belassen, also alle Bauteile, auch wenn diese nur 1x vorhanden sind, aufgeführt zu lassen.
Eine Zweite Tabelle wäre möglich, allerdings würde es mir besser gefallen in einer zu Arbeiten.


Gruß Max
AW: Autofilter Abhängig von der Anzahl der Werte in der Spalte
05.03.2024 16:21:05
Yal
Hallo Max,

es ist mit Power Query vieles möglich.
Du kannst die erste Liste aus der DB in einer PQ-Abfrage und diese in einer Excel-Blall vollständig herausgeben, aus diese Query machst Du 2 Verweise (auf die Abfrage in der rechten Spalte rechtsklicken und "Verweis" anstatt "Duplizieren" wählen), die Du wie vorab beschrieben behandelst.

https://www.herber.de/bbs/user/167562.xlsx

VG
Yal
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige