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

VBA copy ohne doppelte Werte

VBA copy ohne doppelte Werte
28.05.2020 16:17:59
Kerumi
Hallo zusammen,
ich habe foldendes Anliegen:
Ich habe folgende Tabelle:
https://www.herber.de/bbs/user/137842.xlsm
Aus dieser lese ich von Blatt 1 und Blatt 2 die Spalten Hersteller CPU und CPU aus, da ich wissen möchte welche Hersteller und wie welche Typen der CPU ich habe.
Also zb. Beckhoff, CP6930-010
Was ich bisher gebastelt hab ist ein VBA Skript, das mir die Spalten kopiert. Jedoch habe ich nun das Problem gehabt, dass ich nicht mehr richtig filtern konnte.
Dh. ich habe erweiter gefiltert, an eine andere Stelle kopiert und ohne Dublikate. Jedoch habe ich dann trotzdem Werte doppelt oder gar nicht mehr angezeigt gekriegt.
Was ich eigentlich möchte ist folgendes:
https://www.herber.de/bbs/user/137843.xlsm
Also ein Zusammenzug von Tabelle 1 und " in den Spalten Hersteller und CPU ohne Dublikate pro Hersteller.
Wie muss ich meinen Code dafür anpassen?
Besten Dank für eure Hilfe!

2
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA copy ohne doppelte Werte
29.05.2020 07:46:31
Kerumi
Habe mal diesen Code gefunden:
Sub Werte_ohne_Redundanzen_Kopieren()
'Kopiert alle Werte der Spalte B EINMALIG nach Spalte C - ohne Redundanzen
'24.11.2011, NoNet - www.excelei.de
Dim lngZQ As Long, lngZZ As Long 'Zeilen-Variablen für Quelle/Ziel
Dim lngSQ As Long, lngSZ As Long 'Spalten-Variablen für Quelle/Ziel
lngSQ = 2 'Werte aus Quell-Spalte 2 = Spalte B
lngSZ = 3 'Werte nach Ziel-Spalte 3 = Spalte C
Columns(lngSZ).ClearContents 'Zielspalte zuvor löschen !
For lngZQ = 2 To Cells(Rows.Count, lngSQ).End(xlUp).Row
'Per ZÄHLENWENN() prüfen, ob Wert bereits in ZIEL-Spalte vorhanden ist :
If Application.CountIf(Columns(lngSZ), Cells(lngZQ, lngSQ)) = 0 Then
'Wenn der Wert noch NICHT in der ZIEL-Spalte vorhanden ist :
lngZZ = Cells(Rows.Count, lngSZ).End(xlUp).Row + 1
Cells(lngZZ, lngSZ) = Cells(lngZQ, lngSQ)
End If
Next
End Sub
Der sieht eigentlich ganz gut aus, für das was ich machen möchte, jedoch muss ich vorab nach dem Begriff Beckhoff filtern.
Bisheriger Code dafür:
Sub kopierenBT()
Dim variable As String
variable = [A1]
'Blatt auswählen und Startpunkt (A4)festlegen'
With Sheets("BT Projekte ganz").Range("A4").CurrentRegion
'Field= Spalte (Nr) Criterial= Suchbegriff'
.AutoFilter Field:=7, Criteria1:="Beckhoff"
'Resize= ,Anzahl Spalten nach ausgewählter Reihe werden mitkopiert'
.Resize(, 2).Offset(1, 6).SpecialCells(xlCellTypeVisible).Copy
End With
'Schreibe Daten in Blatt'
Sheets("Beckhoff").Cells(Rows.Count, 6).End(xlUp).Offset(1, 0).PasteSpecial xlPasteValues
'Anfangspunkt definieren (A4)'
Sheets(variable).Range("A4").CurrentRegion.AutoFilter
End Sub
wie knüpfe ich das hier am besten rein?
Ebenso wäre es toll den bisherigen Filtercode zusammenzuführen über die 2 Tabellenblätter. (Blatt 1+2). Ist das möglich? Oder muss ich das in 2 separaten Spalten machen?
2. Teil des Filtercodes bisher: (Funzt nicht so dolle)
Sub kopierenAT()
Dim variable As String
variable = [A1]
'Blatt auswählen und Startpunkt (A4)festlegen'
With Sheets("AT Projekte ganz").Range("A4").CurrentRegion
'Field= Spalte (Nr) Criterial= Suchbegriff'
.AutoFilter Field:=9, Criteria1:="Beckhoff"
'Resize= ,Anzahl Spalten nach ausgewählter Reihe werden mitkopiert'
.Resize(, 2).Offset(1, 8).SpecialCells(xlCellTypeVisible).Copy
End With
'Schreibe Daten in Blatt'
Sheets("Beckhoff").Cells(Rows.Count, 6).End(xlUp).Offset(1, 0).PasteSpecial xlPasteValues
'Anfangspunkt definieren (F4)'
Sheets(variable).Range("F4").CurrentRegion.AutoFilter
End Sub

Anzeige
AW: VBA copy ohne doppelte Werte
29.05.2020 10:17:12
volti
Hallo Kerumi,
nachfolgend mal eine Idee zu einem Code, mit dem Du, wenn ich es richtig verstanden habe, eine sortierte und gefilterte Liste für zwei Spalten aus mehreren (hier 2) Tabellen erstellen kannst.
Das ist natürlich noch relativ einfach erweiterbar...
Falls Du es nicht unbedingt mit Deinem bereits gefundenen Code machen möchtest, probiere es einfach mal aus, ob es in Deinem Sinne funktioniert.

Option Explicit
Sub Erstelle_Sortierte_OhneDoppelte()
'Elementeliste gefiltert und sortiert zusammenstellen
 Dim vArr As Variant, WSh As Worksheet, iAnzTab As Integer
 Dim sSpalten() As String, sBlätter() As String, sArr() As String
 Dim sSp2 As String
 Dim sItems As String, sFilter As String, sWert As String
 Dim i As Integer, iSP As Integer
 sFilter = "Beckhoff"                                   'Hersteller-Filter
 sBlätter = Split("AT Projekte ganz,BT Projekte ganz", ",") 'Quell-Tabellen vorgeben
 sSpalten = Split("I,G", ",")                           'Quell-Spalten vorgeben
 
 If sFilter = "*" Or sFilter Like "Alle" Then sFilter = ""
 With CreateObject("System.Collections.SortedList")     'SortedListe kreieren
  For iAnzTab = 0 To UBound(sBlätter)                   'Mehrere Quelltabellen
   Set WSh = ThisWorkbook.Sheets(sBlätter(iAnzTab))
   sSp2 = Chr$(Asc(sSpalten(iAnzTab)) + 1)
   vArr = WSh.Range(sSpalten(iAnzTab) & "2:" & sSp2 _
      & WSh.Cells(Rows.Count, sSpalten(iAnzTab)).End(xlUp).Row) 'Bereich in Array schaffen
   On Error Resume Next
   For i = 1 To UBound(vArr)                            'In Collection einlesen
     sWert = vArr(i, 1) & "," & vArr(i, 2)
     If Len(sWert) > 3 Then
      If vArr(i, 1) Like sFilter Or sFilter = "" Then   'Hersteller-Filter
        If vArr(i, 2) <> "?" Then                     'CPU-Filter
           If Not .contains(sWert) Then .Add sWert, sWert
        End If
      End If
     End If
   Next i
  Next iAnzTab
  ReDim sArr(1, .Count)
  For i = 1 To .Count                                   'Ausgabearray füllen
   sArr(0, i - 1) = Split(.GetByIndex(i - 1), ",")(0)
   sArr(1, i - 1) = Split(.GetByIndex(i - 1), ",")(1)
  Next i
'Daten auf Blatt ausgeben, Zelle ggf. anpassen
  ThisWorkbook.Sheets("Beckhoff").Range("D4").Resize(.Count + 1, 2) = Application.Transpose(sArr)
 End With
End Sub
viele Grüße
Karl-Heinz

Anzeige

329 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige