Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1104to1108
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Spaltenwerte in Array einlesen sofern diese ...

Spaltenwerte in Array einlesen sofern diese ...
Peter
ein "," enthalten, sortieren doppelte löschen und einmalige Strings an neuem Ort ausgeben.
Guten Abend
Ich habe in einer Tabelle eine umfangreiche Auswertung (ca. 30'000 Zeilen), wobei in Spalte B in der Regel Name Vorname (abgetrennt durch ein Komma) steht. Die Namen kommen in der Regel mehrfach vor.
Ich habe verschiedentlich gelesen, dass mit Hilfe von Arrays sehr schnell Daten bearbeitet werden können. Deshalb möchte ich alle Werte der Spalte B in ein Array einlesen. Einzige Bedingung: Es dürfen nur Strings eingelesen werden, die ein , (Komma) enthalten.
Anschliessend sollten die Strings sortiert werden, die doppelten Strings eliminiert werden und dann die verbleibenden Strings an einer frei zu definierenden Stelle, z.B. in der Tabelle "Mitarbeiter" ab Zelle B2 ausgegeben werden.
Ist so was möglich (oder bloss Wunschdenken von mir)?
Danke für jede Hilfe.
Gruss, Peter
Beispieldatei: https://www.herber.de/bbs/user/64632.xls
AW: Spaltenwerte in Array einlesen sofern diese ...
23.09.2009 21:00:39
Reinhard
Hallo Peter,
vielleicht so:

Sub Kopier()
Dim Zei As Long, colC As New Collection, C As Long
On Error Resume Next
With Worksheets("Export1")
For Zei = 1 To .Cells(Rows.Count, 2).End(xlUp).Row
If InStr(.Cells(Zei, 2), ",") > 0 Then
colC.Add Item:=CStr(.Cells(Zei, 2)), key:=CStr(.Cells(Zei, 2))
End If
Next Zei
End With
With Worksheets("Mitarbeiter")
For Zei = 1 To colC.Count
.Cells(Zei + 1, 2) = colC(Zei)
Next Zei
.Range("B2:B" & .Cells(Rows.Count, 2).End(xlUp).Row).Sort _
Key1:=.Range("B2"), Order1:=xlAscending, Header:=xlNo, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
End With
End Sub

Gruß
Reinhard
Anzeige
AW: Spaltenwerte in Array einlesen sofern diese ...
23.09.2009 21:13:11
ransi
HAllo Peter
Etwas anderer Ansatz:
' **********************************************************************
' Modul: Tabelle1 Typ: Element der Mappe(Sheet, Workbook, ...)
' **********************************************************************

Option Explicit

Public Sub Sortierte_Unikate()
Dim objDic As Object
Dim vntIn As Variant
Dim L As Long
Dim Letzte As Long
Dim vntOut As Variant
With Tabelle1
    Letzte = .Range("B" & Rows.Count).End(xlUp).Row
    vntIn = .Range("B2:B" & Letzte).Value
End With
Set objDic = CreateObject("Scripting.Dictionary")
For L = LBound(vntIn) To UBound(vntIn)
    If InStr(1, vntIn(L, 1), ",") Then objDic(vntIn(L, 1)) = 0
Next
vntOut = objDic.keys
QuickSort vntOut
With Sheets("Mitarbeiter")
    .Range("B2").Resize(UBound(vntOut) + 1) = WorksheetFunction.Transpose(vntOut)
End With
Set objDic = Nothing
End Sub


Public Sub QuickSort(vSort As Variant, _
    Optional ByVal lngStart As Variant, _
    Optional ByVal lngEnd As Variant)

If IsMissing(lngStart) Then lngStart = LBound(vSort)
If IsMissing(lngEnd) Then lngEnd = UBound(vSort)
Dim i As Long
Dim j As Long
Dim h As Variant
Dim x As Variant
i = lngStart: j = lngEnd
x = vSort((lngStart + lngEnd) / 2)
Do
While (vSort(i) < x): i = i + 1: Wend
While (vSort(j) > x): j = j - 1: Wend
    If (i <= j) Then
        h = vSort(i)
        vSort(i) = vSort(j)
        vSort(j) = h
        i = i + 1: j = j - 1
    End If
Loop Until (i > j)
If (lngStart < j) Then QuickSort vSort, lngStart, j
If (i < lngEnd) Then QuickSort vSort, i, lngEnd
End Sub


Schau zu dem Thema auch mal hier vorbei.
http://www.office-loesung.de/ftopic311971_0_0_asc.php
Da findest du noch einige Anregungen.
ransi
Anzeige
AW: Spaltenwerte in Array einlesen sofern diese ...
24.09.2009 11:28:48
Peter
Hallo Ransi
Ich habe deinen Code nochmals durchgesehen und nachdem ich
With Tabelle1
durch
Sheets("Export1")
ersetzt habe, läuft der Code auch einwandfrei (die Exporttabelle ist die 2. im Workbook, daher läuft es - wie ich soeben herausgefunden habe - natürlich auch mit With Tabelel2).
Nochmals Dankeschön und Gruss, Peter
AW: Spaltenwerte in Array einlesen sofern diese ...
23.09.2009 21:04:42
Josef
Hallo Peter,
probier mal.
' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Sub Namen()
  Dim varNames As Variant, varResult() As Variant
  Dim lngLast As Long, lngIndex As Long, lngC As Long
  
  With Sheets("Export1")
    lngLast = .Cells(Rows.Count, 2).End(xlUp).Row
    varNames = UniqueList(.Range("B2:B" & CStr(lngLast)))
  End With
  
  For lngIndex = 0 To UBound(varNames)
    If InStr(1, varNames(lngIndex), ",") > 0 Then
      Redim Preserve varResult(lngC)
      varResult(lngC) = varNames(lngIndex)
      lngC = lngC + 1
    End If
  Next
  
  If lngC > 0 Then
    With Sheets("Mitarbeiter")
      .Range("B2:B" & CStr(lngC + 1)) = Application.Transpose(varResult)
    End With
  End If
  
End Sub


Function UniqueList(Matrix As Range, Optional Sorted As Boolean = True) As Variant
  Dim objDic As Object, rng As Range, varTmp() As Variant
  
  Set objDic = CreateObject("Scripting.Dictionary")
  
  For Each rng In Matrix
    If rng.Value <> "" Then objDic(rng.Value) = 0
  Next
  
  varTmp = objDic.keys
  
  If Sorted Then QuickSort varTmp
  
  UniqueList = varTmp
  
  Set objDic = Nothing
End Function

Private Sub QuickSort(data() As Variant, Optional UG, Optional OG)
  Dim P1&, P2&, T1 As Variant, T2 As Variant
  
  UG = IIf(IsMissing(UG), LBound(data), UG)
  OG = IIf(IsMissing(OG), UBound(data), OG)
  
  P1 = UG
  P2 = OG
  T1 = data((P1 + P2) / 2)
  
  Do
    
    Do While (data(P1) < T1)
      P1 = P1 + 1
    Loop
    
    Do While (data(P2) > T1)
      P2 = P2 - 1
    Loop
    
    If P1 <= P2 Then
      T2 = data(P1)
      data(P1) = data(P2)
      data(P2) = T2
      P1 = P1 + 1
      P2 = P2 - 1
    End If
    
  Loop Until (P1 > P2)
  
  If UG < P2 Then QuickSort data, UG, P2
  If P1 < OG Then QuickSort data, P1, OG
  
End Sub

Gruß Sepp

Anzeige
AW: Spaltenwerte in Array einlesen sofern diese ...
23.09.2009 21:08:52
Tino
Hallo,
kannst ja mal testen.
Sub Uebertragen()
Dim MeArray
Dim A As Long
Dim oDic As Object

With Sheets("Export1") 'Tabellennamen anpassen 
 MeArray = .Range("B2", .Cells(.Rows.Count, 2).End(xlUp))
End With

Set oDic = CreateObject("Scripting.Dictionary")

For A = 1 To Ubound(MeArray)
 If InStr(MeArray(A, 1), ",") > 0 Then
  oDic(MeArray(A, 1)) = 0
 End If
Next A


With Sheets("Mitarbeiter")
 .Range("B2", .Cells(.Rows.Count, 2)).Value = ""
 .Range("B2").Resize(oDic.Count) = Application.Transpose(oDic.keys)
 .Range("B2", .Cells(.Rows.Count, 2)).Sort key1:=.Cells(2, 2), Order1:=xlAscending, Header:=xlNo
End With


End Sub
Gruß Tino
Anzeige
AW: Spaltenwerte in Array einlesen sofern diese ...
23.09.2009 21:55:44
Peter
Hallo zusammen
Es ist überwältigend, innert so kurzer Zeit 4 super funktionierende Lösungen erhalten zu haben. Vielen Dank!
Das hat mich auf die Idee gebracht, die den Zeitbedarf der einzelnen Varianten (genannt ist jeweils der Name des aufzurufenden Subs) zu ermitteln:
Bei rund 7000 Zeilen
Kopier - Millisekunden: 578
Namen - Millisekunden: 141
Uebertragen - Millisekunden: 31
Sortiere_Unikate - Millisekunden: 31
Bei meinem File mit rund 23100 Zeilen
Kopier - Millisekunden: 1219
Namen - Millisekunden: 328
Uebertragen - Millisekunden: 63
Bei Sortiere_Unikate erhielt ich ein Debug-Fehler, und zwar auf der Zeile
x = vSort((lngStart + lngEnd) / 2)
lngStart hat den Wert 0 und lngEnd den Wert -1
ergibt vSort = ausserhalb des gültigen Bereichs
da bin ich natürlich meilenweit davon entfernt, ausfindig zu machen, was wohl der Grund ist
Im Vergleich zu der Daten mit rund 7000 Zeilen sind im grösseren Datenbestand zwischendurch auch leere Zeilen enthalten. Könnte das der Grund sein?
Interessant ist auch, dass die Umlaute bei der Variante "Namen" die Umlaute anders sortiert werden (Reihenfolge a,e,ä; bei "Kopier" und Übertragen a,ä,e)
Nochmals vielen Dank und Gruss, Peter
Anzeige

228 Forumthreads zu ähnlichen Themen


Guten Morgen!
Ich habe in einem Arbeitsblatt mehrere Tabellen.
In einer UserForm habe habe ich 460 TextBoxen, wobei die Zählung immer pro Reihe senkrecht erfolgt.
Spalte 1 = TextBox1-23, Spalte2 = TextBox24- TextBox46 usw.
Ich möchte nun z.B. die erste Tabelle in die Textboxen e...
Anzeige

Guten Morgen, kann man das Makro
Sub tt() Dim Zei As Long, Werte, W As Integer, Spa As Long For Zei = 30 To Range("A" & Rows.Count).End(xlUp).Row If InStr(Cells(Zei, 1), Chr(124)) > 0 Then Werte = Split(Cells(Zei, 1), Chr(124)) For W = LBound(Werte) To UBound(Werte) If Len(Werte(W)...

Hallo,
ich hätt' da mal folgende Frage
Private Sub CommandButton1_Click() ThisWorkbook.FollowHyperlink "htt p://de.wikipedia.org/wiki/Hallo_Welt" End Sub
Anzeige

Hallo da draußen :-),
ich habe ein Problem, an dem ich mir echt die Zähne ausbeiße:
Ich habe (über VBA) aus einer TXT Daten in Excel eingelesen. Die Zahlen konnte ich "verwendbar" machen, indem ich diese mit 1 multipliziert habe. Aber der Text wird nicht als Text erkannt.
Hintergrun...

Hallo Excel-Götter,
ich als VBA-Dummie darf mich mit einem schönen Makro-Problem befassen:
Ich arbeite mit einem Excel-File, das Auswertungen aufgrund von Daten in einem 2.File macht. Beide Files liegen im gleichen Ordner auf meinem Rechner. Das ganze wurde erstellt von meinem Vorgänger...

Hallo,
gibt es per VBA eine Möglichkeit alle Excel Dateien eines Verzeichnisses inkl. der jeweils enthaltenen Arbeitsblattnamen einzulesen (der Name der Exceldatei sollte ohne .xls ausgegeben werden), so dass nachfolgendes Ergebnis erzeugt wird:
Dateiname.......Arbeitsblattname
Date...
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige