Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1164to1168
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

Brauche Hilfe beim Aufbau eines Array

Brauche Hilfe beim Aufbau eines Array
Holger
Hallo,
folgende Situation: Es gibt zwei Worksheets. Aus dem zweiten will ich Informationen in ein erstes holen. Es gibt eine ID, mitholfe die Zurodnung geschehen kann. Ich schleife durch das zweite, übergebe zwei Parameter an eine Untrprozedur und durchschleife dann das erste Worksheet um nach der Zuordnung zu suchen. Das Problem ist, es dauert zu lange, da die ID öfters vorkommen kann und nur übertragen werden soll, wenn der zweite Parameter auch stimmt. Immoment schleife ich durch alle Datensätze, dabei weiss ich ja anhand des zweiten Parameters welche eigentlich nur in Frage kommen können.
Daher will ich ein Array aufbauen, das die Zeilen auf den zweiten Parameter eingrenzt, so dass es wesentlich schneller geht.
Hier das Beispiel
DE 123
DE 345
DE 124
BE 123
BE 678
GB 123
GB 342
Klar kommen da noch mehr Infos, aber ich habe als Parameter 1 das Land, als Parameter 2 die ID.
Jetzt möchte ich in der Unterprozedur ein Array aufbauen, dass die Zeilen anhand des zweiten Parameters folgendermaßen einschränkt, hier im Falle von DE:
DE 124
DE 345
DE 124
Kurz gesagt, wie kann man ein Array anhand eines Parameters aufbauen?
AW: Brauche Hilfe beim Aufbau eines Array
05.07.2010 10:02:16
fcs
Hallo Holger,
Kurz gesagt, wie kann man ein Array anhand eines Parameters aufbauen?
Indem man die Größe des Arrays dynamisch bestimmt und über entsprechende If-Bedingungen nur die gewünschten Daten einliest.
Schaut dann etwa wie folgt aus. Ich hab hier jetzt "nur" die Zeilennummern der Trefferzeilen ins Array eingelesen und greife beim Einlesen der Daten in die Tabelle1 über die Zeilennummer auf die Daten in Tabelle2 zu. Du kannst das Array natürlich auch mit entsprechend mehr Spalten versehen und alle gewünschten Daten ins Array einlesen und später dann auch aus dem Array in die Tabelle 1 einlesen.
Derart geschachtelte Suchschleifen machen sich in der Laufzeit aber erst deutlich bemerkbar, wenn die innere Schleife jedesm Mal mehrere Hundert Zeilen abarbeiten muss. Prüfe also ob in deiner Prozedur noch andere Bremsen enthalten sind (Bildschirmaktualisierung, Berechnungsmodus, Ereignismakros).
Bei sehr vielen Datenzeilen (mehrere Tausend) in Tabelle2 ist es ggf. geschickter die Suchfunktion in Verbindung mit einer Do..Loop-Schleifen einzusetzen, um die Trefferzeile zu finden.
Gruß
Franz
Sub Tabs_abgleichen()
Dim wks1 As Worksheet, wks2 As Worksheet, sSuchen As String
Dim Zeile1 As Long
Dim arr2 As Variant, iIndex As Long
Set wks2 = Worksheets("Tab2") 'Tabelle mit Quelldaten
Set wks1 = Worksheets("Tab1") 'Tabelle mit Zieldaten
'Array zur Suche der Quelldaten erstellen
sSuchen = InputBox("Bitte Land eingeben", "Eingabe Suchdaten", "DE")
If sSuchen = "" Then Exit Sub
arr2 = ArrayErstellen(sLand:=sSuchen)
'Daten in Blatt2 einlesen
With Application
.ScreenUpdating = False
.Calculation = xlCalculationManual
.EnableEvents = False
End With
With wks1
For Zeile1 = 2 To .Cells(.Rows.Count, 1).End(xlUp).Row
For iIndex = LBound(arr2, 2) To UBound(arr2, 2)
'ID in Blatt1 mit ID in Array vergleichen
If .Cells(Zeile1, 1).Value = sSuchen _
And .Cells(Zeile1, 2).Value = arr2(iIndex, 2) Then
'Daten aus Tabelle 2 in Tabelle 1 eintragen
.Cells(Zeile1, 3).Value = wks2.Cells(arr2(iIndex, 3), 4).Value
.Cells(Zeile1, 4).Value = wks2.Cells(arr2(iIndex, 3), 5).Value
Exit For
End If
Next
Next
End With
With Application
.ScreenUpdating = True
.Calculation = xlCalculationAutomatic
.EnableEvents = True
End With
End Sub
Function ArrayErstellen(sLand As String) As Variant
Dim wks2 As Worksheet
Dim Zeile2 As Long
Dim arr2() As Variant, iIndex As Long
Const SpLand2 As Long = 1 'Spalte mit Land in Blatt 2
Const SpID2 As Long = 2   'Spalte mit ID in Blatt 2
Const Zeile2_1 As Long = 2   '1. Datenzeile in Blatt 2
Set wks2 = Worksheets("Tab2") 'Tabelle mit Quelldaten
With wks2
iIndex = 0
ReDim arr2(1 To Application.WorksheetFunction.CountIf(.Range(.Cells(Zeile2_1, SpLand2), _
.Cells(.Rows.Count, SpLand2)), sLand), 1 To 3)
For Zeile2 = Zeile2_1 To .Cells(.Rows.Count, SpLand2).End(xlUp).Row
If .Cells(Zeile2, SpLand2).Value = sLand Then
iIndex = iIndex + 1
arr2(iIndex, 1) = .Cells(Zeile2, SpLand2).Value 'Land
arr2(iIndex, 2) = .Cells(Zeile2, SpID2).Value 'ID
arr2(iIndex, 3) = Zeile2 'Zeilennummer
End If
Next
End With
ArrayErstellen = arr2
End Function

Anzeige
Danke sehr!!!
05.07.2010 10:29:22
Holger
Hallo Franz,
Mann, da habe ich was zu lesen.
Danke für deine ausführliche Antwort, ich weiß das zu schätzen.
Immoment habe ich einen RangeBereich und verschiedene If Abfragen,
dauert alles zu lange! Daher bin ich gespannt, wie es mit dem Array sein wird.
Gruß
Holger
AW: Brauche Hilfe beim Aufbau eines Array
05.07.2010 10:24:40
Rudi
Hallo,
lies deine Quelltabelle komplett in ein Array ein und durchsuch dieses. Ein Array zu durchsuchen geht schneller als eine Tabelle zu durchsuchen.
MeinArray=Sheets(1).cells(1,1).currentregion
Gruß
Rudi
AW: Brauche Hilfe beim Aufbau eines Array
05.07.2010 10:32:54
Holger
Hallo,
und wie kann ich dann durch das Array schleifen?
Denn ich muss ja von der jeweiligen Zelle verschiedenes ermitteln?
Sub soisgerade
Do While InstoreWS.Cells(intZ, 1).Value  "" ' Das ist die QuellTabelle
strITEMID = InstoreWS.Cells(lngRow, 1).Value
strCountry = InstoreWS.Cells(lngRow, 5).Value
FindITEMID strITEMID, strCountry, rngInStoreBereich 'Hier geht es zur UNterprozudur
InstoreWS.Activate
lngRow = lngRow + 1
intZ = intZ + 1
Loop
End Sub
Unterprozedur:
Sub FindITEMID(ITEMID As String, ctry As String, rngBereich As Range)
Dim rngmyCell As Range
cpwInstoreWS.Activate
For Each rngmyCell In rngBereich
If rngmyCell.Offset(0, 4).Value  "OK" Then
If rngmyCell.Value = ctry Then
If rngmyCell.Offset(0, 1).Value = ITEMID Then
rngmyCell.Offset(0, 5).Value = InstoreWS.Cells(lngRow, 2).Value
rngmyCell.Offset(0, 4).Value = "OK"
Exit Sub
End If
End If
End If
Next rngmyCell
End Sub

Anzeige
Eindeutige Kombinationne per Collection
05.07.2010 10:45:45
NoNet
Hallo Holger,
vielleicht hilft Dir folgende Methode weiter :
In einer ersten Schleife wird zunächst eine COLLECTION mit den eindeutige Kombinationen der Spalte A&B befüllt und diese COLLECTION in ein ARRAY übertragen.
Innerhalb dieses ARRAYs kann man nun eine bestimmte Wertkombination mit APPLICATION.MATCH() suchen (entspricht der Tabellenblatt-Funktion VERGLEICH() !)
Falls ein Wert gefunden wurde, wird die Position innerhalb des ARRAYs angezeigt (Pos.1 entspricht dabei dem ARRAY-Index 0, Pos.2 dem Index 1 etc.).
Sub EindeutigeKombinationenPerCollection()
Dim lColl As New Collection, arrKombi
Dim lngZ As Long, strWert As String, lngPos As Long
On Error Resume Next 'Fehlervermeidung bei redundanten Kombinationen
'Schleife über alle Inhalte der Spalte A : Collection befüllen
For lngZ = 2 To Cells(Rows.Count, 1).End(xlUp).Row
lColl.Add Cells(lngZ, 1) & Cells(lngZ, 2), Cells(lngZ, 1) & Cells(lngZ, 2)
Next
ReDim arrKombi(lColl.Count - 1)
'Kombinationen in ein ARRAY übertragen :
For lngZ = 1 To lColl.Count
arrKombi(lngZ - 1) = lColl(lngZ)
Next
'suche Wert "DE124" im ARRAY :
strWert = "DE124"
lngPos = 0
lngPos = Application.Match(strWert, arrKombi, 0)
If lngPos > 0 Then
MsgBox "Kombination ' " & strWert & "' gefunden an Pos " & lngPos
Else
MsgBox "Kombination ' " & strWert & "' wurde nicht gefunden !"
End If
On Error GoTo 0 'Fehlerbehandlung zurück setzen
End Sub
Gruß, NoNet
PS: Deutschland spielt "Vier gewinnt" :
gegen 4:0    gegen 4:1    gegen 4:0    gegen ?:?
;-)
Anzeige
AW: Eindeutige Kombinationne per Collection
05.07.2010 11:21:46
Holger
Hallo,
also was das Verständnis deines Codes angeht, fühle ich mich
gerade so argentiniesch, als ob ich 4 reinbekommen hätte. *lach*!
Ok, back to topic, verstehe gerade nur Bahnhof und teste das an einem simplem Sheet.
Als Anfänger gleich sowas .... *lach*.
Danke dir.
Holger
Code ist doch ausführlich kommentiert
05.07.2010 11:31:12
NoNet
Hallo Holger,
jetzt fühle ich mich aber fast wie Maradona ;-) : Ich habe den Code doch sehr ausführlich kommentiert, so dass die Schritte nachvollziehbar sind.
Das Einzige, was ich NICHT ausführlich beschrieben habe, ist die Bedeutung einer COLLECTION - aber das kann man in der OH nachlesen !
Letztendlich dient der Code dazu, Wertepaare aus Spalte A und B nach eindeutigen Kombinationen zu "sieben" und in ein ARRAY zu übertragen - genau so, wie du es wolltest !
Die "Suche" nach einem Begriff in diesem ARRAY ist ein Beispiel : Das was hier im Code mit einem festen Begriff (strWert) gemacht wird, kannst Du in einer Schleife auch mit Wertepaaren aus einem anderen Tabellenblatt machen.
Gruß, NoNet
PS: ein 2:1 am Mi. für D. würde mir schon genügen - man muss es ja nicht übertreiben mit dem "4 Gewinnt" ;-))
Anzeige
AW: Code ist doch ausführlich kommentiert
05.07.2010 15:52:21
Holger
Hallo,
ja, die Kommentare habe ich gelesen, nur kenne ich teilweise die Befehle nicht.
Diese muss ich alle erst nachlesen. Ich muss alles immer ganz genau verstehen,
sonst kann ich es nicbht verwenden, da ich oft Anpassungen vornehmen muss.
Hm, ich habe mich schon so an Vier gewinnt gewöhnt, aber du hast recht, Hauptsache weiter.
Ich freue mich schon auf Mittwoch, kann mich nicht erinnern, wann ich mal
bei einer WM so viele schöne Tore gesehen habe.

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige