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

Geschwindigkeit der For / Next - Suche

Geschwindigkeit der For / Next - Suche
15.05.2017 08:50:55
cH_rI_sI
Guten Morgen liebe VBA-Experten,
ich habe mir eine For / Next-Suche gebastelt - die Suche selbst dauert leider etwas lang, da x-Dateien mit jeweils 30 Tabellenblättern durchsucht werden müssen.
Vielleicht hat ja jemand Optimierungsvorschläge um die Suche schneller zu machen (Array-Suche? -> kenne ich mich aber nicht aus, ...) - anbei die Beispielfiles:
File mit der eingebauten Suche:

Die Datei https://www.herber.de/bbs/user/113584.xlsm wurde aus Datenschutzgründen gelöscht


File, welches durchsucht wird:

Die Datei https://www.herber.de/bbs/user/113583.xlsx wurde aus Datenschutzgründen gelöscht


Und auch noch der Code:
Public Sub Import()
Dim objFileSearch As clsFileSearch
Dim lngIndex As Long
Dim strSuwort As String
Dim i As Integer
Dim bolErg As Boolean
Dim Zelle_C As Long
Dim Zelle_R As Long
Dim Wert As Long
Dim iZeile As Long, tempZeile As Long, iZähler As Long
Dim WS1 As Worksheet, WS2 As Worksheet
'Vorhandene Daten im Ziel löschen
If ActiveSheet.FilterMode Then ActiveSheet.ShowAllData
If Range("A3")  "" Then
Range("A3", ActiveCell.SpecialCells(xlLastCell)).EntireRow.Delete
Range("A3").Select
Else
Range("A3").Select
End If
Set objFileSearch = New clsFileSearch
'strSuwort = InputBox("Suchwort eingeben")
strSuwort = "Pos"
With objFileSearch
.CaseSenstiv = False
.Extension = "*.xls*"
.FolderPath = "D:\temp\"
.SearchLike = "*"
.SubFolders = False
'.SubFolders = True
If .Execute(Sort_by_Size, Sort_Order_Descending) > 0 Then
Application.ScreenUpdating = False
For lngIndex = 1 To .FileCount
With .Files(lngIndex)
Workbooks.Open (.strPath)                         'Workbook öffnen
On Error Resume Next
For i = 1 To Workbooks(.strFilename).Worksheets.Count
With Workbooks(.strFilename).Worksheets(i)
.Activate
bolErg = .Cells.Find(What:=strSuwort, LookIn:=xlValues, LookAt:= _
xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext,  _
MatchCase:=False).Activate
If bolErg Then
Set WS1 = Application.ActiveSheet
Set WS2 = Application.Workbooks("Suche.xlsm").Worksheets("Import database")
Zelle_C = ActiveCell.Column
Zelle_R = ActiveCell.Row
For iZeile = WS1.Cells(WS1.Rows.Count, Zelle_C).End(xlUp).Row To Zelle_R + 1 Step -1
If WS1.Cells(iZeile, Zelle_C)  "" And _
WS1.Name  "Zusammenfassung" And _
WS1.Cells(iZeile, 2)  "" And _
WS1.Cells(iZeile, 3)  "" And _
Left(WS1.Cells(iZeile, 3), 4)  "Prob" And _
Left(WS1.Cells(iZeile, 3), 4)  "Offe" And _
Left(WS1.Cells(iZeile, 3), 4)  "Besc" Then
iZähler = iZähler + 1
tempZeile = WS2.Cells(WS2.Rows.Count, 1).End(xlUp).Row + 1
WS2.Rows(tempZeile).Insert Shift:=xlDown
WS2.Cells(tempZeile, 1) = WS1.Cells(1, 14)
WS2.Cells(tempZeile, 2) = WS1.Cells(iZeile, 1)
WS2.Cells(tempZeile, 3) = WS1.Cells(iZeile, 2)
WS2.Cells(tempZeile, 4) = ActiveWorkbook.Name
WS2.Cells(tempZeile, 5) = WS1.Cells(iZeile, 3)
If WS1.Cells(iZeile, Zelle_C + 9) > 0 Then
WS2.Cells(tempZeile, 6) = WS1.Cells(iZeile, Zelle_C + 9)
WS2.Cells(tempZeile, 7) = "A"
End If
If WS1.Cells(iZeile, Zelle_C + 10) > 0 Then
WS2.Cells(tempZeile, 6) = WS1.Cells(iZeile, Zelle_C + 10)
WS2.Cells(tempZeile, 7) = "B"
End If
If WS1.Cells(iZeile, Zelle_C + 11) > 0 Then
WS2.Cells(tempZeile, 6) = WS1.Cells(iZeile, Zelle_C + 11)
WS2.Cells(tempZeile, 7) = "C"
End If
If WS1.Cells(iZeile, Zelle_C + 12) > 0 Then
WS2.Cells(tempZeile, 6) = WS1.Cells(iZeile, Zelle_C + 12)
WS2.Cells(tempZeile, 7) = "D"
End If
If WS1.Cells(iZeile, Zelle_C + 13) > 0 Then
WS2.Cells(tempZeile, 6) = WS1.Cells(iZeile, Zelle_C + 13)
WS2.Cells(tempZeile, 7) = "E"
End If
If WS1.Cells(iZeile, Zelle_C + 14) > 0 Then
WS2.Cells(tempZeile, 6) = WS1.Cells(iZeile, Zelle_C + 14)
WS2.Cells(tempZeile, 7) = "F"
End If
If WS1.Cells(iZeile, Zelle_C + 15) > 0 Then
WS2.Cells(tempZeile, 6) = WS1.Cells(iZeile, Zelle_C + 15)
WS2.Cells(tempZeile, 7) = "G"
End If
'WS2.Cells(tempZeile, 8) = getZahl(WS1.Cells(iZeile, 3))
End If
Next iZeile
'MsgBox "Import erfolgreich!"
Else
'MsgBox "Suchwort nicht gefunden"
bolErg = False
End If
End With
Next i
Workbooks(.strFilename).Close savechanges:=False   'Workbook schließen
End With
Next
Else
'MsgBox "Keine Datei gefunden"
End If
Application.ScreenUpdating = True
End With
Set objFileSearch = Nothing
End Sub
Besten Dank im Voraus für Eure Unterstützung!!!
Lg,
Chrisi

15
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Geschwindigkeit der For / Next - Suche
15.05.2017 10:44:53
Daniel
Hi
das Problem dürfte das Schreiben der Wert sein.
das braucht viel Zeit.
Es wäre besser, die Werte erst in ein Array zu schreiben und dann das Array als ganzes in den Zellbereich.
Hierbei kann man dann auch alle Werte, die sich über den Schleifenverlauf nicht ändern, vor der Schleife ins Array schreiben, so dass sich die Anzahl der Aktionen in der Schleife reduziert.
dh etwa in dem Stil:
Dim Arr(1 to 1, 1 to 8)
arr(1, 1) = WS1.Cells(1, 14)
arr(1, 4) = ActiveWorkbook.Name
For iZeile = WS1.Cells(WS1.Rows.Count, Zelle_C).End(xlUp).Row To Zelle_R + 1 Step -1
arr(1, 2) =  WS1.Cells(iZeile, 1)
WS2.Cells(tempZeile, 1).Resize(, 8) = arr
Next
gleiches gilt natürlich für die IF_Prüfungen.
ein IF, welches sich innerhalb der Schleife nicht ändert, sollte vorher ausgeführt werden.
denn wenn diese Bedingung nicht erfüllt ist braucht die Schleife erst gar nicht starten.
In deinem Fall ist es das ~f~ WS1.Name "Zusammenfassung" ~f~
desweiteren sollte man AND-Verknüpfte Bedingungen im IF meiden und stattdessen mehrere IFs schachteln.
das ist schneller, weil im AND immer alle Bedingungen überprüft werden.
Bei den geschachtelten IFs werden die inneren Bedingungen nur dann geprüft, wenn die äußeren erfüllt sind:
IF WS1.Name  "Zusammenfassung" Then
For iZeile = WS1.Cells(WS1.Rows.Count, Zelle_C).End(xlUp).Row To Zelle_R + 1 Step -1
If WS1.Cells(iZeile, Zelle_C)  "" Then
If  WS1.Cells(iZeile, 2)  "" Then
If WS1.Cells(iZeile, 3)  ""
usw..
bei der Reihenfolge der Prüfungen sollte man so vorgehen, dass die Prüfung, die am wenigsten oft WAHR wird, an den Anfang stellt.
Gruß Daniel
Anzeige
AW: Geschwindigkeit der For / Next - Suche
15.05.2017 10:50:52
Daniel
nochwas:
ist das
WS2.Rows(tempZeile).Insert Shift:=xlDown

wirklich notwendig, wenn du die Daten sowieso am Ende der Tabelle einfügst?
tempZeile = WS2.Cells(WS2.Rows.Count, 1).End(xlUp).Row + 1
das Insert ist nur dann erforderlich, wenn die Tabelle in einer anderen Spalte weiter geht als in Spalte A.
Markiert jedoch die Spalte A die letzte Zeile auf dem gesamten Blatt, so ist das Insert nicht notwendig und kann entfallen.
Gruß Daniel
AW: Geschwindigkeit der For / Next - Suche
15.05.2017 12:11:49
cH_rI_sI
Hi Daniel,
vielen lieben Dank für deine Vorschläge und Tipps - ich werde mal versuchen zu optimieren und melde mich ggf. nochmal - daher lasse ich den Thread mal offen...
Lg,
Chrisi
Anzeige
AW: Geschwindigkeit der For / Next - Suche
15.05.2017 17:35:51
Hajo_Zi
Du willst was machen. Es soll keiner Vorbei kommen. Falls dann offen, dann Stelle dann auf offen. Jetzt ist nichts offen.
Gruß Hajo
AW: Geschwindigkeit der For / Next - Suche
15.05.2017 17:54:46
cH_rI_sI
Hallo Daniel,
eine Frage habe ich schon wieder, da ich mich bei Arrays überhaupt nicht auskenne...
Wenn

arr(1, 4) = ActiveWorkbook.Name
angeführt ist - wie schreibt man später den Inhalt des Arrays in die vorgesehenen Zeilen des WS2? Das mache ich ja normalerweise in der Schleife mit

WS2.Cells(tempZeile, 4) = ActiveWorkbook.Name
Ich hoffe Du verstehst die Frage ;-)
Danke schonmal für deine erneute Mühe!
Lg,
Chrisi
Anzeige
AW: Geschwindigkeit der For / Next - Suche
15.05.2017 17:54:46
cH_rI_sI
Hallo Daniel,
eine Frage habe ich schon wieder, da ich mich bei Arrays überhaupt nicht auskenne...
Wenn

arr(1, 4) = ActiveWorkbook.Name
angeführt ist - wie schreibt man später den Inhalt des Arrays in die vorgesehenen Zeilen des WS2? Das mache ich ja normalerweise in der Schleife mit

WS2.Cells(tempZeile, 4) = ActiveWorkbook.Name
Ich hoffe Du verstehst die Frage ;-)
Danke schonmal für deine erneute Mühe!
Lg,
Chrisi
AW: Geschwindigkeit der For / Next - Suche
15.05.2017 18:28:12
Daniel
Hi
das Zurückschreiben macht dann diese Zeile vor dem NEXT:
WS2.Cells(tempZeile, 1).Resize(, 8) = arr
das ist zwar jetzt nur die Halbe Lösung, weil das Array immer nur Zeilenweise erstellt und ins Tabellenblatt geschrieben wird, aber es sollte das ganze schon mal beschleunigen.
Sinnvoller wäre es natürlich, das komplette Ergebnis in EIN Array zu schreiben und dieses erst ganz am Schluss zurück zu schreiben, aber das war mir jetzt zu kompliziert für ne schnelle Konstnix-Lösung.
Kannst du dir ja vielleicht selber basteln, wenn du dich mit Arrays ein bisschen besser auskennst.
Gruß Daniel
Anzeige
AW: Geschwindigkeit der For / Next - Suche
15.05.2017 18:50:10
cH_rI_sI
Mit der Kostnix-Lösung kann ich aber nur Werte zurückschreiben, die sich nicht jede Zeile ändern oder geht das mit variablen Werten auch?
Wenn ja, kannst mir eventuell einen Beispielcode geben, wie ich nur die fett markierte Coding-Zeile in ein Array schreibe und dann zurück - also Zeile für Zeile (tempZeile)...
Hier nochmal der Code:
 For iZeile = WS1.Cells(WS1.Rows.Count, Zelle_C).End(xlUp).Row To Zelle_R + 1 Step -1
If WS1.Cells(iZeile, Zelle_C)  "" And _
WS1.Name  "Zusammenfassung" And _
WS1.Cells(iZeile, 2)  "" And _
WS1.Cells(iZeile, 3)  "" And _
Left(WS1.Cells(iZeile, 3), 4)  "Prob" And _
Left(WS1.Cells(iZeile, 3), 4)  "Offe" And _
Left(WS1.Cells(iZeile, 3), 4)  "Besc" Then
iZähler = iZähler + 1
tempZeile = WS2.Cells(WS2.Rows.Count, 1).End(xlUp).Row + 1
WS2.Rows(tempZeile).Insert Shift:=xlDown
WS2.Cells(tempZeile, 1) = WS1.Cells(1, 14)
WS2.Cells(tempZeile, 2) = WS1.Cells(iZeile, 1)
WS2.Cells(tempZeile, 3) = WS1.Cells(iZeile, 2)
Ich kann mich gar nicht oft genug bedanken - ihr braucht eine Mords-Geduld mit Anfängern wie mir - Kompliment!
Lg,
Chrisi
Anzeige
AW: Geschwindigkeit der For / Next - Suche
15.05.2017 19:02:40
Daniel
hab ich doch.
Schau dir mein Beispiel doch mal an.
(es ist halt für das Befüllen nur eine Zeile beispielhaft drin, den rest musst du ergänzen, außer denen, die du schon vor Schleife befüllt hast)
Das Array wird Zeilenweise neu befüllt und dann Zeilenweise zurück geschrieben, damit hast du dann auch die Werte berücksichtigt, die sich Zeilenweise ändern.
Gruß Daniel
AW: Geschwindigkeit der For / Next - Suche
15.05.2017 19:50:17
cH_rI_sI
Ich hätte mir so gedacht (siehe fett markierte Zeilen):
Set WS1 = Application.ActiveSheet
Set WS2 = Application.Workbooks("CPU- u. DMM-Import database7.xlsm").Worksheets("CPU-Import  _
database")
Zelle_C = ActiveCell.Column
Zelle_R = ActiveCell.Row
Arr(1, 4) = ActiveWorkbook.Name
For iZeile = WS1.Cells(WS1.Rows.Count, Zelle_C).End(xlUp).Row To Zelle_R + 1 Step -1
If WS1.Cells(iZeile, Zelle_C)  "" And _
WS1.Name  "Zusammenfassung" And _
WS1.Cells(Zelle_R, Zelle_C + 1) = "Motor" And _
WS1.Cells(iZeile, 2)  "" And _
WS1.Cells(iZeile, 3)  "" And _
Left(WS1.Cells(iZeile, 3), 4)  "Prob" And _
Left(WS1.Cells(iZeile, 3), 4)  "Offe" And _
Left(WS1.Cells(iZeile, 3), 4)  "Besc" Then
iZähler = iZähler + 1
tempZeile = WS2.Cells(WS2.Rows.Count, 1).End(xlUp).Row + 1
WS2.Rows(tempZeile).Insert Shift:=xlDown
WS2.Cells(tempZeile, 1) = WS1.Cells(1, 14)
WS2.Cells(tempZeile, 2) = WS1.Cells(iZeile, 1)
WS2.Cells(tempZeile, 3) = WS1.Cells(iZeile, 2)
'WS2.Cells(tempZeile, 4) = ActiveWorkbook.Name
WS2.Cells(tempZeile, 5) = WS1.Cells(iZeile, 3)
If WS1.Cells(iZeile, Zelle_C + 9) > 0 Then
WS2.Cells(tempZeile, 6) = WS1.Cells(iZeile, Zelle_C + 9)
WS2.Cells(tempZeile, 7) = "MOS"
End If
If WS1.Cells(iZeile, Zelle_C + 10) > 0 Then
WS2.Cells(tempZeile, 6) = WS1.Cells(iZeile, Zelle_C + 10)
WS2.Cells(tempZeile, 7) = "ZVM"
End If
If WS1.Cells(iZeile, Zelle_C + 11) > 0 Then
WS2.Cells(tempZeile, 6) = WS1.Cells(iZeile, Zelle_C + 11)
WS2.Cells(tempZeile, 7) = "FT"
End If
If WS1.Cells(iZeile, Zelle_C + 12) > 0 Then
WS2.Cells(tempZeile, 6) = WS1.Cells(iZeile, Zelle_C + 12)
WS2.Cells(tempZeile, 7) = "SQ"
End If
If WS1.Cells(iZeile, Zelle_C + 13) > 0 Then
WS2.Cells(tempZeile, 6) = WS1.Cells(iZeile, Zelle_C + 13)
WS2.Cells(tempZeile, 7) = "WHM"
End If
If WS1.Cells(iZeile, Zelle_C + 14) > 0 Then
WS2.Cells(tempZeile, 6) = WS1.Cells(iZeile, Zelle_C + 14)
WS2.Cells(tempZeile, 7) = "R&D"
End If
If WS1.Cells(iZeile, Zelle_C + 15) > 0 Then
WS2.Cells(tempZeile, 6) = WS1.Cells(iZeile, Zelle_C + 15)
WS2.Cells(tempZeile, 7) = "Unklar"
End If
'WS2.Cells(tempZeile, 7).FormulaLocal = "=VERWEIS(9^9;--TEIL(D4;MIN(WENN( _
ISTZAHL(--TEIL(D4;SPALTE(1:1);1));SPALTE(1:1)));SPALTE(1:1)))"
WS2.Cells(tempZeile, 8) = getZahl(WS1.Cells(iZeile, 3))
WS2.Cells(tempZeile, 9).FormulaArray = _
"=INDEX('U:\My Documents\Desktop\VBA\CPU\[SQ_BSC-Overview__FY18.xlsm]PPM Import  _
Database'!R5C1:R100000C14,MATCH(RC[-1]&"""",'U:\My Documents\Desktop\VBA\CPU\[SQ_BSC-Overview__FY18.xlsm]PPM Import Database'!R5C4:R100000C4,0),14)"
WS2.Cells(tempZeile, 10).FormulaArray = _
"=INDEX('U:\My Documents\Desktop\VBA\CPU\[SQ_BSC-Overview__FY18.xlsm]PPM Import  _
Database'!R5C1:R100000C14,MATCH(RC[-2]&"""",'U:\My Documents\Desktop\VBA\CPU\[SQ_BSC-Overview__FY18.xlsm]PPM Import Database'!R5C4:R100000C4,0),6)"
End If
 WS2.Cells(tempZeile, 4).Resize(, 8) = Arr
Next iZeile
Was macht eigentlich das Resize und warum (, 8) ? Was heißt das?
Was ich noch immer nicht verstanden habe ist:
"Das Array wird Zeilenweise neu befüllt und dann Zeilenweise zurück geschrieben, damit hast du dann auch die Werte berücksichtigt, die sich Zeilenweise ändern."
Was macht dann das Array schneller? Ich mache ja auch alles Zeilenweise in der Schleife und _ Feld für Feld -

WS2.Cells(tempZeile, 4).Resize(, 8) = Arr
-> mit (tempZeile, 4) befülle ich doch auch nur ein Feld oder nicht?
Ich glaube ich bin zu blöd um das zu verstehen...
Lg,
Chrisi
Anzeige
AW: Geschwindigkeit der For / Next - Suche
16.05.2017 11:59:01
Daniel
Hi
nochmal:
jeder Schreibende Zugriff auf eine Zelle braucht Zeit!
allerdings ist es so, dass wenn ich mehrere Zellen gleichzeitig beschreibe, dies genauso viel Zeit braucht, wie eine einzelne Zellen zu beschreiben (Excel kann dann die notwendigen Aktionen für alle geänderten Zellen in einen Schritt ausführen und nicht für jede Zelle einzeln)
daher sammelt man alle zu übertragenden Werte erstmal in einem Array und schreibt dann dieses Array als ganzes in den Zellbereich zurück.
gleiches gilt für die beiden Formeln in Spalte 9 und 10.
da hier ja in jede Zeile die gleiche Formel kommt, kann man die Formel am Schluß in alle Zellen gleichzeitig schreiben (da du Array-Formeln hast, muss man erst in eine Zelle einfügen und dann kopieren)
sieht dann als ganzes in etwas so aus (ist jetzt dein gezeigter code überarbeitet, wahrscheinlich nicht vollständig)
Dim arr(1, 8)
Dim Zeile1 As Long
Set ws1 = Application.ActiveSheet
Set WS2 = Application.Workbooks("CPU- u. DMM-Import database7.xlsm").Worksheets("CPU-Import  _
database")
Zelle_C = ActiveCell.Column
Zelle_R = ActiveCell.Row
arr(1, 1) = ws1.Cells(1, 14)
arr(1, 4) = ActiveWorkbook.Name
If ws1.Name  "Zusammenfassung" Then
tempZeile = WS2.Cells(WS2.Rows.Count, 1).End(xlUp).Row
Zeile1 = tempZeile + 1
For iZeile = ws1.Cells(ws1.Rows.Count, Zelle_C).End(xlUp).Row To Zelle_R + 1 Step -1
If ws1.Cells(iZeile, Zelle_C)  "" And _
ws1.Cells(Zelle_R, Zelle_C + 1) = "Motor" And _
ws1.Cells(iZeile, 2)  "" And _
ws1.Cells(iZeile, 3)  "" And _
Left(ws1.Cells(iZeile, 3), 4)  "Prob" And _
Left(ws1.Cells(iZeile, 3), 4)  "Offe" And _
Left(ws1.Cells(iZeile, 3), 4)  "Besc" Then
iZähler = iZähler + 1
'--- Werte ins Array
tempZeile = tempZeile + 1
'WS2.Rows(tempZeile).Insert Shift:=xlDown
'arr(1, 1) = WS1.Cells(1, 14)
arr(1, 2) = ws1.Cells(iZeile, 1)
arr(1, 3) = ws1.Cells(iZeile, 2)
'arr(1, 4) = ActiveWorkbook.Name
arr(1, 5) = ws1.Cells(iZeile, 3)
If ws1.Cells(iZeile, Zelle_C + 9) > 0 Then
arr(1, 6) = ws1.Cells(iZeile, Zelle_C + 9)
arr(1, 7) = "MOS"
End If
If ws1.Cells(iZeile, Zelle_C + 10) > 0 Then
arr(1, 6) = ws1.Cells(iZeile, Zelle_C + 10)
arr(1, 7) = "ZVM"
End If
If ws1.Cells(iZeile, Zelle_C + 11) > 0 Then
arr(1, 6) = ws1.Cells(iZeile, Zelle_C + 11)
arr(1, 7) = "FT"
End If
If ws1.Cells(iZeile, Zelle_C + 12) > 0 Then
arr(1, 6) = ws1.Cells(iZeile, Zelle_C + 12)
arr(1, 7) = "SQ"
End If
If ws1.Cells(iZeile, Zelle_C + 13) > 0 Then
arr(1, 6) = ws1.Cells(iZeile, Zelle_C + 13)
arr(1, 7) = "WHM"
End If
If ws1.Cells(iZeile, Zelle_C + 14) > 0 Then
arr(1, 6) = ws1.Cells(iZeile, Zelle_C + 14)
arr(1, 7) = "R&D"
End If
If ws1.Cells(iZeile, Zelle_C + 15) > 0 Then
arr(1, 6) = ws1.Cells(iZeile, Zelle_C + 15)
arr(1, 7) = "Unklar"
End If
arr(1, 8) = getZahl(ws1.Cells(iZeile, 3))
'--- Array in Zellbereich schreiben
WS2.Cells(tempZeile, 4).Resize(, 8) = arr
End If
Next iZeile
'--- Formeln einfügen
WS2.Cells(Zeile1, 9).FormulaArray = "=INDEX('U:\My Documents\Desktop\VBA\CPU\[ _
SQ_BSC-Overview__FY18.xlsm]PPM ImportDatabase '!R5C1:R100000C14,MATCH(RC[-1]&"""",'U:\My Documents\Desktop\VBA\CPU\[SQ_BSC-Overview__FY18.xlsm]PPM Import Database'!R5C4:R100000C4,0),14)"
WS2.Cells(Zeile1, 10).FormulaArray = "=INDEX('U:\My Documents\Desktop\VBA\CPU\[ _
SQ_BSC-Overview__FY18.xlsm]PPM ImportDatabase '!R5C1:R100000C14,MATCH(RC[-2]&"""",'U:\My Documents\Desktop\VBA\CPU\[SQ_BSC-Overview__FY18.xlsm]PPM Import Database'!R5C4:R100000C4,0),6)"
WS2.Cells(Zeile1, 9).Resize(1, 2).Copy WS2.Cells(Zeile1, 9).Resize(tempZeile -  _
Zeile1 + 1)
End If

kleiner Tip noch:
wenn du die Datei, welche in der Formel verwendet wird, vorher öffnest, läuft die Berechnung schneller, da Zellbezüge auf geschlossene Dateien sehr langsam sind.
Gruß Daniel
Anzeige
AW: Geschwindigkeit der For / Next - Suche
16.05.2017 17:06:41
cH_rI_sI
Hallo Daniel,
besten Dank für die detaillierte Ausführung - eine Frage habe ich trotzdem noch - beim Einfügen des Arrays hast Du ja folgende Coding-Zeile angegeben:
'--- Array in Zellbereich schreiben
WS2.Cells(tempZeile, 4).Resize(, 8) = arr
Bedeutet die 4 nicht, dass nur in die Spalte D geschrieben wird? Und was genau macht das Resize bzw. was sagt die 8 aus (ich tippe auf die Anzahl der Spalten des Arrays)?
Vielleicht kannst mir das noch näher erklären - Danke!!!
Lg,
Chrisi
AW: Geschwindigkeit der For / Next - Suche
16.05.2017 17:55:23
cH_rI_sI
Noch was - ich habe jetzt den Code wie folgt umgebaut:
Public Sub CPU_Import()
Dim objFileSearch As clsFileSearch
Dim lngIndex As Long
Dim strSuwort As String
Dim i As Integer
Dim bolErg As Boolean
Dim Zelle_C As Long
Dim Zelle_R As Long
Dim Wert As Long
Dim iZeile As Long, tempZeile As Long, iZähler As Long
Dim WS1 As Worksheet, WS2 As Worksheet
Dim strOrdner As String
Dim arr(1, 8)
Dim Zeile1 As Long
'Vorhandene Daten im Ziel löschen
'ActiveWorkbook.Worksheets("ISR Import Database").AutoFilter.Sort.SortFields. _
Clear
If ActiveSheet.FilterMode Then ActiveSheet.ShowAllData
If Range("A3")  "" Then
'Range("A3", ActiveCell.SpecialCells(xlLastCell)).EntireRow.Delete
'Range("A3").Select
Range("A3").End(xlDown).Offset(1, 0).Select
Else
Range("A3").Select
End If
Set objFileSearch = New clsFileSearch
With Application.FileDialog(msoFileDialogFolderPicker)
'.InitialFileName = "C:\"
.InitialFileName = Environ("Userprofile") & "\Documents\"
.Title = "Ordnerauswahl"
.ButtonName = "Auswahl..."
.InitialView = msoFileDialogViewList
If .Show = -1 Then
strOrdner = .SelectedItems(1)
If Right(strOrdner, 1)  "\" Then strOrdner = strOrdner & "\"
Else
strOrdner = ""
End If
End With
If strOrdner = "" Then MsgBox ("Kein Ordner gewählt!") 'Else MsgBox strOrdner
'strSuwort = InputBox("Suchwort eingeben")
strSuwort = "Pos"
With objFileSearch
.CaseSenstiv = False
.Extension = "*.xls*"
'.FolderPath = "D:\temp\"
.FolderPath = strOrdner
.SearchLike = "*"
.SubFolders = False
'.SubFolders = True
If .Execute(Sort_by_Size, Sort_Order_Descending) > 0 Then
Application.ScreenUpdating = False
For lngIndex = 1 To .FileCount
With .Files(lngIndex)
Workbooks.Open (.strPath)                         'Workbook öffnen
On Error Resume Next
For i = 1 To Workbooks(.strFilename).Worksheets.Count
With Workbooks(.strFilename).Worksheets(i)
.Activate
bolErg = .Cells.Find(What:=strSuwort, LookIn:=xlValues, LookAt:= _
xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext,  _
MatchCase:=False).Activate
If bolErg Then
'Ermittlung relevanter Einträge
Set WS1 = Application.ActiveSheet
Set WS2 = Application.Workbooks("SQ_BSC-Overview__FY18.xlsm").Worksheets("CPU-Import database")
Zelle_C = ActiveCell.Column
Zelle_R = ActiveCell.Row
arr(1, 1) = WS1.Cells(1, 14)
arr(1, 4) = ActiveWorkbook.Name
If WS1.Name  "Zusammenfassung" And _
WS1.Cells(Zelle_R, Zelle_C + 1) = "Motor" Then
tempZeile = WS2.Cells(WS2.Rows.Count, 1).End(xlUp).Row
Zeile1 = tempZeile + 1
For iZeile = WS1.Cells(WS1.Rows.Count, Zelle_C).End(xlUp).Row To Zelle_R + 1 Step -1
If IsNumeric(WS1.Cells(iZeile, Zelle_C)) Then
If WS1.Cells(iZeile, 2)  "" And _
WS1.Cells(iZeile, 3)  "" Then
If Left(WS1.Cells(iZeile, 3), 4)  "Prob" And _
Left(WS1.Cells(iZeile, 3), 4)  "Besc" Then
iZähler = iZähler + 1
'--- Werte ins Array
tempZeile = tempZeile + 1
'tempZeile = WS2.Cells(WS2.Rows.Count, 1).End(xlUp).Row + 1
'WS2.Rows(tempZeile).Insert Shift:=xlDown
'WS2.Cells(tempZeile, 1) = WS1.Cells(1, 14)
'WS2.Cells(tempZeile, 2) = WS1.Cells(iZeile, 1)
'WS2.Cells(tempZeile, 3) = WS1.Cells(iZeile, 2)
arr(1, 2) = WS1.Cells(iZeile, 1)
arr(1, 3) = WS1.Cells(iZeile, 2)
'WS2.Cells(tempZeile, 4) = ActiveWorkbook.Name
'WS2.Cells(tempZeile, 5) = WS1.Cells(iZeile, 3)
arr(1, 5) = WS1.Cells(iZeile, 3)
Wert = WS1.Cells(iZeile, Zelle_C + 9)
If Wert > 0 Then
'WS2.Cells(tempZeile, 6) = WS1.Cells(iZeile, Zelle_C + 9)
arr(1, 6) = WS1.Cells(iZeile, Zelle_C + 9)
'WS2.Cells(tempZeile, 7) = "MOS"
arr(1, 7) = "MOS"
Wert = 0
End If
Wert = WS1.Cells(iZeile, Zelle_C + 10)
If Wert > 0 Then
'WS2.Cells(tempZeile, 6) = WS1.Cells(iZeile, Zelle_C + 10)
arr(1, 6) = WS1.Cells(iZeile, Zelle_C + 10)
'WS2.Cells(tempZeile, 7) = "ZVM"
arr(1, 7) = "ZVM"
Wert = 0
End If
Wert = WS1.Cells(iZeile, Zelle_C + 11)
If Wert > 0 Then
'WS2.Cells(tempZeile, 6) = WS1.Cells(iZeile, Zelle_C + 11)
arr(1, 6) = WS1.Cells(iZeile, Zelle_C + 11)
'WS2.Cells(tempZeile, 7) = "FT"
arr(1, 7) = "FT"
Wert = 0
End If
Wert = WS1.Cells(iZeile, Zelle_C + 12)
If Wert > 0 Then
'WS2.Cells(tempZeile, 6) = WS1.Cells(iZeile, Zelle_C + 12)
arr(1, 6) = WS1.Cells(iZeile, Zelle_C + 12)
'WS2.Cells(tempZeile, 7) = "SQ"
arr(1, 7) = "SQ"
Wert = 0
End If
Wert = WS1.Cells(iZeile, Zelle_C + 13)
If Wert > 0 Then
'WS2.Cells(tempZeile, 6) = WS1.Cells(iZeile, Zelle_C + 13)
arr(1, 6) = WS1.Cells(iZeile, Zelle_C + 13)
'WS2.Cells(tempZeile, 7) = "WHM"
arr(1, 7) = "WHM"
Wert = 0
End If
Wert = WS1.Cells(iZeile, Zelle_C + 14)
If Wert > 0 Then
'WS2.Cells(tempZeile, 6) = WS1.Cells(iZeile,  _
Zelle_C + 14)
arr(1, 6) = WS1.Cells(iZeile, Zelle_C + 14)
'WS2.Cells(tempZeile, 7) = "R&D"
arr(1, 7) = "R&D"
Wert = 0
End If
Wert = WS1.Cells(iZeile, Zelle_C + 15)
If Wert > 0 Then
'WS2.Cells(tempZeile, 6) = WS1.Cells(iZeile,  _
Zelle_C + 15)
arr(1, 6) = WS1.Cells(iZeile, Zelle_C + 15)
'WS2.Cells(tempZeile, 7) = "Unklar"
arr(1, 7) = "Unklar"
Wert = 0
End If
'WS2.Cells(tempZeile, 8) = getZahl(WS1.Cells(iZeile, 3))
arr(1, 8) = getZahl(WS1.Cells(iZeile, 3))
'WS2.Cells(tempZeile, 9).FormulaArray = _
"=INDEX('PPM Import Database'!R5C1:R150000C14,MATCH(RC[-1]&"""",'PPM Import  _
Database'!R5C4:R150000C4,0),14)"
'WS2.Cells(tempZeile, 10).FormulaArray = _
"=INDEX('PPM Import Database'!R5C1:R150000C14,MATCH(RC[-2]&"""",'PPM Import  _
Database'!R5C4:R150000C4,0),6)"
'WS2.Cells(tempZeile, 11).FormulaArray = _
"=INDEX('ZZQME_PARTNER'!C[-10]:C[-7],MATCH(RC[-1],'ZZQME_PARTNER'!C[-10],0),4)"
End If
End If
End If
Next iZeile
'--- Formeln einfügen
WS2.Cells(Zeile1, 9).FormulaArray = _
"=INDEX('PPM Import Database'!R5C1:R150000C14,MATCH(RC[-1]&"""",'PPM Import  _
Database'!R5C4:R150000C4,0),14)"
WS2.Cells(Zeile1, 10).FormulaArray = _
"=INDEX('PPM Import Database'!R5C1:R150000C14,MATCH(RC[-2]&"""",'PPM Import  _
Database'!R5C4:R150000C4,0),6)"
WS2.Cells(Zeile1, 11).FormulaArray = _
"=INDEX('ZZQME_PARTNER'!C[-10]:C[-7],MATCH(RC[-1],'ZZQME_PARTNER'!C[-10],0),4)"
WS2.Cells(Zeile1, 9).Resize(1, 2).Copy WS2.Cells(Zeile1, 9).Resize(tempZeile - _
Zeile1 + 1)
End If
'MsgBox "Import erfolgreich!"
Else
'MsgBox "Suchwort nicht gefunden"
bolErg = False
End If
End With
Next i
Workbooks(.strFilename).Close savechanges:=False   'Workbook schließen
End With
Next
Else
'MsgBox "Keine Datei gefunden"
End If
Application.ScreenUpdating = True
End With
Set objFileSearch = Nothing
End Sub

Das Problem ist, dass nachher nichts aus dem Array geschrieben wird und die Formeln auch nur in eine Zeile - was ist hier falsch? Bitte um deine Unterstützung - Danke!
Lg,
Chrisi
Anzeige
AW: Geschwindigkeit der For / Next - Suche
16.05.2017 19:16:20
cH_rI_sI
Im gepostetem Code fehlt der Code

'--- Array in Zellbereich schreiben
WS2.Cells(tempZeile, 4).Resize(, 8) = arr
In meinem gesamten Coding habe ich diese Zeile jedoch:
            End If
End If
End If
'--- Array in Zellbereich schreiben
WS2.Cells(tempZeile, 4).Resize(, 8) = arr
Next iZeile
'--- Formeln einfügen
Trotzdem funktiert das nicht *ggrrr*
zu-da neuer Beitrag
17.05.2017 08:24:50
robert

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige