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

Doppelte im Array filtern

Doppelte im Array filtern
23.05.2023 14:55:13
Herbert_Grom

Hallo,

Aus der Liste A16:A83 möchte ich nur die mehrfach vorkommenden Namen ermitteln und diese dann, ohne Duplikate, in die Spalte K kopieren. Das klappt mit dem Makro in der beigef. AM perfekt.

Meine Frage ist jedoch, ob ich das Ganze nicht schon gleich im Array filtern kann, damit am Ende diese 3 Namen eingetragen werden? Ich steh voll aufm Schlauch. Vielen Dank im Voraus.

https://www.herber.de/bbs/user/159286.xlsm

Servus

25
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Doppelte im Array filtern
23.05.2023 15:14:52
Heli
Hi,

Du könntest das mit der Formel =EINDEUTIG(A16:A83) ohne Makro erreichen - im VBA Array kannst Du glaube ich nicht so ohne Weiteres auf eindeutige Werte filtern, geht denke ich nur per Schleife.

VG, Heli


AW: Doppelte im Array filtern
23.05.2023 15:17:57
Herbert_Grom
Hallo Heli,

vielen Dank für deine Antwort. Doch das geht nicht, da der User nur 2016 hat und außerdem will ich das nicht mit einer Formel machen.

Servus


AW: Doppelte im Array filtern
23.05.2023 15:19:55
Heli
Hi,

ok, dann kommst Du um eine Schleife denke ich nicht rum - ich stelle mal auf offen da ich ned der Experte dafür bin ;-)

VG, Heli


Anzeige
AW: Doppelte im Array filtern
23.05.2023 15:19:05
snb
Sub M_snb()
  sn = Filter(Application.Transpose(Range("A16:A83")), "")
  
  Do Until UBound(sn) = -1
    If UBound(Filter(sn, sn(0))) > 0 Then c00 = c00 & "_" & sn(0)
    sn = Filter(sn, sn(0), 0)
  Loop
  
  sn = Split(Mid(c00, 2), "_")
  Cells(1, 11).Resize(UBound(sn) + 1) = Application.Transpose(sn)
End Sub


AW: Doppelte im Array filtern
23.05.2023 15:25:32
Herbert_Grom
Danke, funktioniert bestens!

Servus


Erweiterter Filter : Einzeiler
23.05.2023 15:45:41
NoNet
Hallo Herbert,

hier noch eine sehr kurze Variante, die den integrierten "Erweiterten Filter" nutzt :

Sub Kopieren_ohne_Duplikate()
    'Liste Kopieren ohne Duplikate per Erweitertem Filter
    Range([A16], [A16].End(xlDown)).AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range("K16"), Unique:=True
End Sub
Das ist natürlich nur dann sinnvoll, wenn das Array im späteren Programmverlauf nicht nochmal genutzt werden soll.

Salut, Nonet


Anzeige
AW: Erweiterter Filter : Einzeiler
23.05.2023 15:49:58
Daniel
Hi
diese Lösung berücksichtigt aber nicht die anforderung " nur die mehrfach vorkommenden Namen", denn sie gibt auch die Namen aus die nur ein mal in der Liste stehen.
außerdem musst du hier die Überschrift "A15" mitnehmen, da die erste Zeile des kopierten bereichs die überschrift ist.

Gruß Daniel


AW: Erweiterter Filter : Einzeiler
23.05.2023 15:54:08
Herbert_Grom
Hallo Thomas,

es freut mich sehr, von dir zu hören/lesen! Vielen Dank für deinen super Tipp. Allerdings hatte ich leider vergessen, dass ich das Ganze in eine Listbox (mit Namen "ListBox_Verkäuferauswahl") einer UF haben will. Hast du da noch bitte einen Tipp?

Servus


Anzeige
Doppelte Werte für UserForm
23.05.2023 16:33:43
NoNet
Hallo Herbert,

hier noch eine Variante für eine Listbox im Userform :

Private Sub UserForm_Activate()
    Dim arr() As Variant, lngT As Long, wsListe As Worksheet
    Set wsListe = Worksheets("Liste")
    
    ReDim arr(0)
    
    For lngZ = 16 To 83
        If Application.CountIf(wsListe.Range("A1:A" & lngZ), wsListe.Cells(lngZ, 1)) = 2 Then
            
            With Me.ListBox_Verkäuferauswahl
                .AddItem (wsListe.Cells(lngZ, 1))
            End With
            
            'Falls das Array weiter verarbeitet werden soll :
            arr(UBound(arr)) = wsListe.Cells(lngZ, 1)
            ReDim Preserve arr(UBound(arr) + 1)
        End If
    Next
End Sub
Evtl. musst Du das Array auch global deklarieren und/oder die Werte in der Tabelle ausgeben, falls gewünscht.

Salut, NoNet


Anzeige
AW: Doppelte Werte für UserForm
23.05.2023 16:48:26
Herbert_Grom
Hallo Thomas,

vielen Dank, es funktioniert bestens!

Du hast mich ganz schön in ein freudiges Gefühlschaos gestürzt, mit deiner Antwort! Vielen Dank dafür! Ich denke sehr oft an L. Noch dazu heute, an einem 23.! Ich hoffe sehr, dass es ihm und euch gut geht. Und ganz ehrlich, er fehlt mir sehr! Er hat ja dieses Jahr seinen ersten "runden" Geburtstag und wird ihn hoffentlich gebührend feiern. Und noch einmal ganz ehrlich: Ich hatte schon fest eigeplant, ihm dazu eine kleine Freude zu senden in Form von etwas "Papier"! ;o)=) Ich hoffe ich darf, ja?

Lasst es euch gut gehen!!!

Servus

P.S.: Seit 2020 sind wir Großeltern eines wunderbaren Enkels Moritz!


Anzeige
AW: Doppelte Werte für UserForm
28.05.2023 16:24:26
Herbert_Grom
Hallo Thomas,

schade, dass du mir nicht geantwortet hast. Vielleicht findest du ja noch ein paar Worte für mich. Bitte!

Servus


AW: Doppelte im Array filtern
23.05.2023 16:23:30
Daniel
Hi
für Arbeiten direkt im Array bietet sich auch das Dictionary-Element an.
man muss zwar Schleifen programmieren, aber die sind sehr schnell

Option Base 1

Sub test()
Dim arr, x
Dim Erg1
Dim Erg2

Set Erg1 = CreateObject("scripting.dictionary")

With Sheets("Liste").Range("A15")
    For Each x In Range(.Offset(1, 0), .End(xlDown)).Value
        Erg1(x) = Erg1(x) + 1
    Next
End With

For Each x In Erg1.keys
    If Erg1(x) >= 2 Then Erg2 = Erg2 & "|" & x
Next

Erg2 = WorksheetFunction.Transpose(Split(Mid(Erg2, 2), "|"))
Cells(1, 11).Resize(UBound(Erg2), 1) = Erg2


End Sub
Gruß Daniel


Anzeige
AW: Doppelte im Array filtern
24.05.2023 09:14:48
Yal
Moin!

Trotz, wie immer, hervorragenden Vorschlag von Daniel, kann ich mich eine Dictionary-Lösung noch schlanker vorstellen:
(Application.ScreenUpdating und .EnableEvents habe ich weggelassen)

Sub test()
Dim dic
Dim Z

    Set dic = CreateObject("Scripting.Dictionary")
    For Each Z In Worksheets(1).Range("A16:A83").Value
        dic(CStr(Z)) = 1
    Next
    Worksheets(1).Range("K1").Resize(dic.Count, 1).Value = Application.Transpose(dic.keys)
End Sub
VG
Yal


AW: Doppelte im Array filtern
24.05.2023 09:32:34
Herbert_Grom
HBallo Yal,

auch dir vielen Dank für deinen Vorschlag, der allerdings ein nicht ganz richtiges Ergebnis bringt, denn es sollen nicht alle Unikate aufgelistet werden, sondern nur die Unikate der mehrfach vorkommenden. Hast du dafür auch noch einen Tipp?

Servus


Anzeige
AW: Doppelte im Array filtern
24.05.2023 09:42:20
Daniel
gibts eigentlich nen Grund, dass du meine Lösung, die alles erfüllt was du dir gewünscht hast, konsequent ignorierst?


AW: Doppelte im Array filtern
24.05.2023 09:51:34
Herbert_Grom
Hallo Daniel,

sorry, aber ich habe leider vergessen dir direkt zu antworten. Aber ich habe dir indirekt geantwortet: Guckst du hier

https://www.herber.de/forum/messages/1931813.html

Und ich habe nur deinen Tipp verwendet, da er der kürzeste ist und alle Vorgaben erfüllt. Sorry noch mal und vielen Dank!!!

Servus


AW: Doppelte im Array filtern
24.05.2023 09:55:53
Herbert_Grom
Sorry Daniel, aber das war eine Fehlinformation, denn leider war das nicht dein Tipp, sondern der von snb. Dein Tipp funktioniert natürlich auch, aber der von snb ist einfach der kürzeste. Sorry noch mal, aber vor lauter Tipps bin ich gleich gar nicht dazugekommen dir zu antworten. Soll nicht wieder vorkommen!

Servus


Anzeige
AW: Doppelte im Array filtern
24.05.2023 10:28:52
Yal
Ich entdecke erst jetzt, dass ich die Aufgabenstellung falsch verstanden habe (wäre ja zu einfach gewesen ;-) und somit meinen Vorschlag keine passende Lösung darstellt.
Daniels Vorschlag ist die Lösung.

Ich habe mit der Idee, Eintrag in der Dictionary zu löschen, wenn nur einmal vorkommt, aber es funktioniert nicht so.
Ausserdem beansprucht das Löschen eines Dictionary-Eintrags wahrscheinlich mehr Prozessorzeit, als einen separaten Dictionary aufzubauen (so ist mindestens bei Collection. Bei Dictionary habe ich den Test nicht gemacht, sollte aber ähnlich sein).
Eine zweite Dictionary ist auch Prozessorzeit-teurer, als eine Zeichenkette zu bauen und zu splitten.

Sub test()
'basierend auf Daniels Lösung, aber nicht besser ;-)
Dim x
Dim Erg1
Dim Erg2

    Set Erg1 = CreateObject("scripting.dictionary")
    Set Erg2 = CreateObject("scripting.dictionary")

    With Sheets("Liste")
        For Each x In .Range("A16:A83").Value
            Erg1(x) = Erg1(x) + 1
        Next
    
        For Each x In Erg1.Keys
            If Erg1(x) >= 2 Then Erg2(x) = 1
        Next
    
        .Range("K1").Resize(Erg2.Count, 1) = Application.Transpose(Erg2.Keys)
    End With
End Sub
Bei der geringe Menge an Einträge wäre auch eine direkte Abgabe in Zelle auch nicht langsam (bei blockierten Updating und Events)
Sub test()
'basierend auf Daniels Lösung
Dim x
Dim Erg1
Dim Z As Range

    Set Erg1 = CreateObject("scripting.dictionary")
    With Sheets("Liste")
        For Each x In .Range("A16:A83").Value
            Erg1(x) = Erg1(x) + 1
        Next

        Set Z = .Range("K1")
        For Each x In Erg1.Keys
            If Erg1(x) >= 2 Then
                Z.Value = x
                Set Z = Z.Offset(1)
            End If
        Next
    End With
End Sub
VG
Yal


Anzeige
AW: Doppelte im Array filtern
24.05.2023 10:35:08
Herbert_Grom
Hallo Yal,

vielen Dank noch mal für deine Vorschläge, doch habe ich mich für snb's Vorschlag entschieden, da er der kürzeste ist. Außerdem hatte ich vergessen, dass ich das Ganze ja in eine Listbox einlesen wollte. Sorry dafür. Guckst du hier:

https://www.herber.de/forum/messages/1931813.html

Servus


AW: Doppelte im Array filtern
24.05.2023 10:58:23
Daniel
Hi
naja, der Vorschlag von snb ist eigentlich nur deshalb kürzer, weil er auf Variablendeklaration verzichtet (was ich nicht mache) und weil der den Zellbereich fest vorgibt und ich die automatische Ermittlung eingebaut habe.

wenn ich meinen Code im snb-Stil schreibe, dann ist er eigentlich fast genauso lang.

Sub M_Daniel()
Set Erg1 = CreateObject("scripting.dictionary")
For Each x In Range("A1:A10").Value
    Erg1(x) = Erg1(x) + 1
Next
For Each x In Erg1.keys
    If Erg1(x) >= 2 Then Erg2 = Erg2 & "|" & x
Next
Erg2 = WorksheetFunction.Transpose(Split(Mid(Erg2, 2), "|"))
Cells(1, 11).Resize(UBound(Erg2), 1) = Erg2
End Sub
Sub M_snb()
sn = Filter(Application.Transpose(Range("A1:A10")), "")
Do Until UBound(sn) = -1
  If UBound(Filter(sn, sn(0))) > 0 Then c00 = c00 & "_" & sn(0)
  sn = Filter(sn, sn(0), 0)
Loop
sn = Split(Mid(c00, 2), "_")
Cells(1, 11).Resize(UBound(sn) + 1) = Application.Transpose(sn)
End Sub


AW: Doppelte im Array filtern
24.05.2023 11:50:04
Yal
Hallo zusammen,

kurz ist immer gut, aber nicht ausschlaggebend. Meiner Erachtens ist wichtiger, wie schnell man den Code wiederlesen kann und zuverlässig dessen Bedeutung erfassen kann. Nicht nach 2 Tage, sondern nach 6 Monaten.

Es hängt natürlich an vielen Faktoren, u.a. an Gewonnheiten, z.B. ob man eher mit Dictionary oder Verkettung von Zeichenkette wohlfühlt. Im Laufe der Zeit entwickeln sich die eigenen Boiler plates, also die wiederkehrenden Implementierungsmuster, die man auf einem Blick erkennt und erfasst. Alles anderes ist Fall-spezifisch und Bedarf gezielte Aufmerksamkeit. Und da ist kurz und kompakt nicht unbedingt ein guter Freund.

Unter diese Gesichtspunkt halte ich die Lösung mit 2 Dictionaries für schlank und leicht zu erfasssen. Ich würde aber die Namen Erg1 und Erg2 so ändern, dass diese bildlich leichter zu unterscheiden sind, so was wie "Basis" und "Erg", weil im zweiten For nur mit erhöhter Aufmerksamkeit zu entdecken ist, dass beide vorkommen.

VG
Yal


AW: Doppelte im Array filtern
24.05.2023 12:19:58
Herbert_Grom
Hallo alle zusammen,

ich habe mir jetzt alle euere Vorschläge gesichert, denn sie sind alle sehr gut und irgendwann bin ich mal froh, wenn ich darauf zurückgreifen kann! Vielen Dank euch allen!

Servus


AW: Doppelte im Array filtern
23.05.2023 21:30:59
Luschi
Halloo Herbert,

hier mal meine Variante vür das Tabellnblatt:
Testseite für VBA-Umsetzung nach HTML
[Cc][+][-]


Sub til()
  Dim lKaeuferCount&, lAnzKaeuf&, wbKfLst As Worksheet, lDoppelte&, _

  sSuchName$, x&
  Dim dict As Object

  Set dict = CreateObject("Scripting.Dictionary")
  Set wbKfLst = Sheets("Liste")

  x = 1

  With wbKfLst
      lAnzKaeuf = .Cells(Rows.Count, "A").End(xlUp).Row - 15
      Range("K1:K100").ClearContents

      For lKaeuferCount = 1 To lAnzKaeuf
          sSuchName = .Cells(lKaeuferCount + 15, "A")
          lDoppelte = Application.WorksheetFunction.CountIf(.Range("A1:A100"), "=" & sSuchName)
          If lDoppelte > 1 Then
             ' Aufnahme doppelte Werte im Dictionary verhindern!
             dict(sSuchName) = 0
             x = x + 1
          End If
      Next lKaeuferCount


      ' * Inhalt Dictionary in Tabelle eintragen
      .Cells(1, "K").Resize(dict.Count) = WorksheetFunction.Transpose(dict.Keys)

  End With

  Set dict = Nothing
  Set wbKfLst = Nothing

End Sub

viele Grüße von
L u s c h i aus klein-Paris



AW: Doppelte im Array filtern
24.05.2023 09:32:53
Herbert_Grom
Hallo Luschi,

vielen Dank für deinen Vorschlag. Ich hatte allerdings vergessen zu sagen, dass ich das Ergebnis in eine Listbox einlesen möchte. Das habe ich nun so gelöst:

Private Sub UserForm_Initialize()
   Dim sn, c00

   sn = Filter(Application.Transpose(Tab6.Range("A16:A" & Tab6.Cells(Rows.Count, "A").End(xlUp).Row)), "")

   Do Until UBound(sn) = -1
      If UBound(Filter(sn, sn(0))) > 0 Then c00 = c00 & "_" & sn(0)
      sn = Filter(sn, sn(0), 0)
   Loop

   sn = Split(Mid(c00, 2), "_")

   ListBox_Verkäuferauswahl.List = Application.Transpose(sn)
End Sub
@Nonet: Sorry Thomas, aber Daniels Tipp war der kürzeste und du weißt ja, dass ich Tippfaul bin! ;o)=)

Servus


AW: Doppelte im Array filtern
25.05.2023 11:16:55
Herbert_Grom
Hallo alle zusammen,

jetzt gibt es eine weitere Anforderung, die mir bisher nicht bekannt war. Es müssen alle Namen in der Listbox aufgelistet werden, deren Name ungleich des Namens in der Spalte D ist, aber jeweils nur einmal. Schaut es euch bitte mal an. Danke.

https://www.herber.de/bbs/user/159315.xlsm

Servus

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige