Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
Anzeige
Archiv - Navigation
844to848
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
844to848
844to848
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Optimierung beschleunigung Code

Optimierung beschleunigung Code
08.02.2007 11:56:53
chris
Hallo VBA Experten, habe jetzt eine frage zur Optimierung der Geschwindigkeit.
Weiß auch nicht ob es irgendwie möglich ist aber wenn mir jemand helfen kann dann hier.
ich habe einen code der aus zwei verschiedenen Tabellenblättern Werte zusammenfügt.
Es handelt sich um manchmal über 1000 Einträge.
habe dazu diesen Code erstellt.Gibt es eine möglichkeit in zu optimieren damit das Programm nicht wie jetzt ca 30 sek läuft ?
Wäre euch über Antworten sehr dankbar !
lz_gepaart = Worksheets("gepaart").Cells(Rows.Count, 1).End(xlUp).Row
lz_verwendung = Worksheets("Verwendung").Cells(Rows.Count, 1).End(xlUp).Row
'Aus Spalte 1 Punkte in Düsennummer entfernen
'Paaren Teil 1 aus Tabelle ("Importierte") - mit " Spalten aus Tabelle ("Importiere")
For x1 = 2 To lz_gepaart
aktnr = Worksheets("gepaart").Cells(x1, 1)
For x2 = 2 To lz_verwendung
If Worksheets("Verwendung").Cells(x2, 3) = aktnr Then
'gleiche nummern gewünschten Werte eintragen
Worksheets("gepaart").Cells(x1, 7) = Worksheets("gepaart").Cells(x1, 7) & Chr(10) & Worksheets("Verwendung").Cells(x2, 11)
Worksheets("gepaart").Cells(x1, 8) = Worksheets("gepaart").Cells(x1, 8) & Chr(10) & Worksheets("Verwendung").Cells(x2, 16)
Else
'keine Gemeinsamkeit der nummern
End If
Next
Next
Application.ScreenUpdating = True
MsgBox ("abgeschlossen"), vbInformation, "Fertig"

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Nachfrage
08.02.2007 12:24:43
mpb
Hallo Chris,
1) Kann es für "aktnr" in der Tabelle "Verwendung" mehr als einen Eintrag geben? Ich vermute nein, da ja dann in der Schleife die Einträge überschrieben würden.
2) Sind die Tabellen aufsteigend sortiert (oder liesen sie sich aufsteigend sortieren) und zwar "Gepaart" nach Spalte A und "Verwendung" nach Spalte C?
Gruß
Martin
AW: Nachfrage
08.02.2007 13:04:49
chris
Hallo, also
1) Kann es für "aktnr" in der Tabelle "Verwendung" mehr als einen Eintrag geben? Ich vermute nein, da ja dann in der Schleife die Einträge überschrieben würden.
Ja kann es.aktnr sind auch ca 900 einträge.
2) Sind die Tabellen aufsteigend sortiert (oder liesen sie sich aufsteigend sortieren) und zwar "Gepaart" nach Spalte A und "Verwendung" nach Spalte C?
? versteh ich nicht was das für einen Sinn macht ? Ich habe doch einen Coeausschnitt eingefügt.
Diesen "Verschnellern"
Anzeige
AW: Nachfrage
08.02.2007 13:15:19
bst
Auch Hallo,
sind ca. 0,2 sec für 2000 Zeilen schnell genug ?
cu, Bernd
--
Option Explicit

Sub x()
    Dim lngMaxRows As Long, i As Long, lngIndex As Long, strKey As String
    Dim dicIndex As Object, arVerwendung, arGepaartIndex, arGepaartWerte, t As Single
    
    t = Timer
    Set dicIndex = CreateObject("scripting.dictionary")
    
    With Worksheets("Verwendung")
        lngMaxRows = IIf(Len(.Cells(.Rows.Count, 1)), .Rows.Count, .Cells(.Rows.Count, 1).End(xlUp).Row)
        arVerwendung = .Range(.Cells(1, 3), .Cells(lngMaxRows, 16))
        
        For i = 1 To lngMaxRows
            strKey = arVerwendung(i, 1)
            If dicIndex.Exists(strKey) Then
                Debug.Print "Zeile: "; i; " Key existiert bereits: "; strKey
            Else
                dicIndex.Add strKey, i
            End If
        Next
    End With
    
    With Worksheets("gepaart")
        lngMaxRows = IIf(Len(.Cells(.Rows.Count, 1)), .Rows.Count, .Cells(.Rows.Count, 1).End(xlUp).Row)
        arGepaartIndex = .Range(.Cells(1, 1), .Cells(lngMaxRows, 1))
        arGepaartWerte = .Range(.Cells(1, 7), .Cells(lngMaxRows, 8))
        For i = 1 To lngMaxRows
            strKey = CStr(arGepaartIndex(i, 1))
            If dicIndex.Exists(strKey) Then
                lngIndex = dicIndex(strKey)
                arGepaartWerte(i, 1) = arGepaartWerte(i, 1) & Chr(10) & arVerwendung(lngIndex, 9)
                arGepaartWerte(i, 2) = arGepaartWerte(i, 2) & Chr(10) & arVerwendung(lngIndex, 14)
            End If
        Next
        .Range(.Cells(1, 7), .Cells(lngMaxRows, 8)) = arGepaartWerte
    End With
    dicIndex.RemoveAll
    Set dicIndex = Nothing
    MsgBox Timer - t, vbInformation, "Fertig"
End Sub


Anzeige
AW: Nachfrage
08.02.2007 19:37:27
chris
Boa danke,
blick jetzt nicht ganz durch und weiß noch nicht ob ich es schaffe in meinen code einzubauen.
Aber ich werde es morgen versuchen !;)
Danke
AW: Nachfrage offen für bst
09.02.2007 11:52:46
chris
Hallo bst,
bekomme den Code leider nicht so umgebaut das ich in verwenden kann :(
VBA Kentnisse sind aber besser als Makrorekorder.Ich füge hier mal mein ganzes

Sub ein vieleicht könntest du mir da noch einmal helfen ?
Wäre super.
Vielen dank
Option Explicit

Sub paaren()
Dim lz_klassen As Integer
Dim lz_gepaart As Integer
Dim lz_verwendung
Dim x1 As Integer
Dim x2 As Integer
Dim leer
Dim aktnr
Dim test
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
'Einfügen Teil 1 aus tabelle ("Importiere_Files_Klassen")
lz_gepaart = Worksheets("Klassen mit Verwendung gepaart").Cells(Rows.Count, 1).End(xlUp).Row
If lz_gepaart > 1 Then
'Daten bereits vorhanden - alle löschen in Tabelle (Klassen mit Verwendung gepaart)
Worksheets("Klassen mit Verwendung gepaart").Rows("2:" & lz_gepaart).Delete Shift:=xlUp
Else
'kein löschen nötig da leer
End If
lz_klassen = Worksheets("Importiere_Files_Klassen").Cells(Rows.Count, 1).End(xlUp).Row
'Spalten aus Tabelle ("Importiere_Files_Klassen")    1 zu 1 in    Tabelle  ("Klassen mit Verwendung gepaart") übernehmen
'Daten aus Tabelle("Importiere_Files_Klassen") Spalte 1 in Tabelle ("Klassen mit Verwendung gepaart") Spalte 1 kopieren
Worksheets("Importiere_Files_Klassen").Range("A2:A" & lz_klassen).Copy
Sheets("Klassen mit Verwendung gepaart").Range("A2").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
'Daten aus Tabelle("Importiere_Files_Klassen") Spalte 3  in Tabelle ("Klassen mit Verwendung gepaart") Spalte 2 kopieren
Worksheets("Importiere_Files_Klassen").Range("C2:C" & lz_klassen).Copy
Sheets("Klassen mit Verwendung gepaart").Range("B2").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
'Daten aus Tabelle("Importiere_Files_Klassen") Spalte 6  in Tabelle ("Klassen mit Verwendung gepaart") Spalte 3 kopieren
Worksheets("Importiere_Files_Klassen").Range("F2:F" & lz_klassen).Copy
Sheets("Klassen mit Verwendung gepaart").Range("C2").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
'Daten aus Tabelle("Importiere_Files_Klassen") Spalte 5  in Tabelle ("Klassen mit Verwendung gepaart") Spalte 4 kopieren
Worksheets("Importiere_Files_Klassen").Range("E2:E" & lz_klassen).Copy
Sheets("Klassen mit Verwendung gepaart").Range("D2").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
'Daten aus Tabelle("Importiere_Files_Klassen") Spalte 4  in Tabelle ("Klassen mit Verwendung gepaart") Spalte 5 kopieren
Worksheets("Importiere_Files_Klassen").Range("D2:D" & lz_klassen).Copy
Sheets("Klassen mit Verwendung gepaart").Range("E2").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
'Daten aus Tabelle("Importiere_Files_Klassen") Spalte 7  in Tabelle ("Klassen mit Verwendung gepaart") Spalte 6 kopieren
Worksheets("Importiere_Files_Klassen").Range("G2:G" & lz_klassen).Copy
Sheets("Klassen mit Verwendung gepaart").Range("F2").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Worksheets("Klassen mit Verwendung gepaart").Select
Worksheets("Klassen mit Verwendung gepaart").Cells(2, 1).Select
Application.CutCopyMode = False
lz_gepaart = Worksheets("Klassen mit Verwendung gepaart").Cells(Rows.Count, 1).End(xlUp).Row
lz_verwendung = Worksheets("Importiere_Files_Verwendung").Cells(Rows.Count, 1).End(xlUp).Row
'Aus Spalte 1 Punkte in Düsennummer entfernen
'Paaren  Teil 1 aus Tabelle ("Importiere_Files_Klassen")  -   mit    " Spalten aus Tabelle ("Importiere_Files_Verwendung")
For x1 = 2 To lz_gepaart
aktnr = Worksheets("Klassen mit Verwendung gepaart").Cells(x1, 1)
For x2 = 2 To lz_verwendung
If Worksheets("Importiere_Files_Verwendung").Cells(x2, 3) = aktnr Then
'gleiche Düsennummern gewünschten Werte eintragen
Worksheets("Klassen mit Verwendung gepaart").Cells(x1, 7) = _
Worksheets("Klassen mit Verwendung gepaart").Cells(x1, 7) & Chr(10) & _
Worksheets("Importiere_Files_Verwendung").Cells(x2, 11)
Worksheets("Klassen mit Verwendung gepaart").Cells(x1, 8) = _
Worksheets("Klassen mit Verwendung gepaart").Cells(x1, 8) & Chr(10) & _
Worksheets("Importiere_Files_Verwendung").Cells(x2, 16)
Else
'keine Gemeinsamkeit der Düsennummern
End If
Next
Next
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Worksheets("Start").Select
Range("L3") = "Schritt 3 gestartet am " & Date & " um " & Time
MsgBox ("abgeschlossen"), vbInformation, "Fertig"
End Sub


Anzeige
AW: Nachfrage offen für bst
09.02.2007 16:25:29
bst
Hi chris b,
versuche das mal so ähnlich.
HTH, Bernd
--
Option Explicit

Sub Paaren()
    Dim wsGepaart As Worksheet, lz_klassen As Long, lz_gepaart As Long
    
    Application.Calculation = xlCalculationManual
    Application.ScreenUpdating = False
    
    ' Einfügen Teil 1 aus tabelle ("Importiere_Files_Klassen")
    
    Set wsGepaart = Worksheets("Klassen mit Verwendung gepaart")
    With wsGepaart
        lz_gepaart = .Cells(Rows.Count, 1).End(xlUp).Row
        If lz_gepaart > 1 Then
            ' Daten bereits vorhanden - alle löschen in Tabelle (Klassen mit Verwendung gepaart)
            .Rows("2:" & lz_gepaart).Delete Shift:=xlUp
        End If
    End With
    
    With Worksheets("Importiere_Files_Klassen")
        lz_klassen = .Cells(Rows.Count, 1).End(xlUp).Row
        
        'Spalten aus Tabelle ("Importiere_Files_Klassen") 1 zu 1 in Tabelle ("Klassen mit Verwendung gepaart") übernehmen
        
        'Daten aus Tabelle("Importiere_Files_Klassen") Spalte 1 in Tabelle ("Klassen mit Verwendung gepaart") Spalte 1 kopieren
        wsGepaart.Range("A2:A" & lz_klassen).Value = .Range("A2:A" & lz_klassen).Value
        
        'Daten aus Tabelle("Importiere_Files_Klassen") Spalte 3 in Tabelle ("Klassen mit Verwendung gepaart") Spalte 2 kopieren
        wsGepaart.Range("B2:B" & lz_klassen).Value = .Range("C2:C" & lz_klassen).Value
        
        'Daten aus Tabelle("Importiere_Files_Klassen") Spalte 6 in Tabelle ("Klassen mit Verwendung gepaart") Spalte 3 kopieren
        wsGepaart.Range("C2:C" & lz_klassen).Value = .Range("F2:F" & lz_klassen).Value
        
        'Daten aus Tabelle("Importiere_Files_Klassen") Spalte 5 in Tabelle ("Klassen mit Verwendung gepaart") Spalte 4 kopieren
        wsGepaart.Range("D2:D" & lz_klassen).Value = .Range("E2:E" & lz_klassen).Value
        
        'Daten aus Tabelle("Importiere_Files_Klassen") Spalte 4 in Tabelle ("Klassen mit Verwendung gepaart") Spalte 5 kopieren
        wsGepaart.Range("E2:E" & lz_klassen).Value = .Range("D2:D" & lz_klassen).Value
        
        'Daten aus Tabelle("Importiere_Files_Klassen") Spalte 7 in Tabelle ("Klassen mit Verwendung gepaart") Spalte 6 kopieren
        wsGepaart.Range("F2:F" & lz_klassen).Value = .Range("G2:G" & lz_klassen).Value
    End With
    
    'Aus Spalte 1 Punkte in Düsennummer entfernen
    
    'Paaren Teil 1 aus Tabelle ("Importiere_Files_Klassen") - mit " Spalten aus Tabelle ("Importiere_Files_Verwendung")
    Call doPaaren(wsGepaart, Worksheets("Importiere_Files_Verwendung"))
    
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    Worksheets("Start").Select
    Range("L3") = "Schritt 3 gestartet am " & Date & " um " & Time
    MsgBox ("abgeschlossen"), vbInformation, "Fertig"
End Sub

Private Sub doPaaren(wsVerwendung As Worksheet, wsGepaart As Worksheet)
    Dim lngMaxRows As Long, i As Long, lngIndex As Long, strKey As String
    Dim dicIndex As Object, arVerwendung, arGepaartIndex, arGepaartWerte
    
    Set dicIndex = CreateObject("scripting.dictionary")
    
    With wsVerwendung
        lngMaxRows = IIf(Len(.Cells(.Rows.Count, 1)), .Rows.Count, .Cells(.Rows.Count, 1).End(xlUp).Row)
        arVerwendung = .Range(.Cells(1, 3), .Cells(lngMaxRows, 16))
        
        For i = 1 To lngMaxRows
            strKey = arVerwendung(i, 1)
            If dicIndex.Exists(strKey) Then
                Debug.Print "Zeile: "; i; " Key existiert bereits: "; strKey
            Else
                dicIndex.Add strKey, i
            End If
        Next
    End With
    
    With wsGepaart
        lngMaxRows = IIf(Len(.Cells(.Rows.Count, 1)), .Rows.Count, .Cells(.Rows.Count, 1).End(xlUp).Row)
        arGepaartIndex = .Range(.Cells(1, 1), .Cells(lngMaxRows, 1))
        arGepaartWerte = .Range(.Cells(1, 7), .Cells(lngMaxRows, 8))
        For i = 1 To lngMaxRows
            strKey = CStr(arGepaartIndex(i, 1))
            If dicIndex.Exists(strKey) Then
                lngIndex = dicIndex(strKey)
                arGepaartWerte(i, 1) = arGepaartWerte(i, 1) & Chr(10) & arVerwendung(lngIndex, 9)
                arGepaartWerte(i, 2) = arGepaartWerte(i, 2) & Chr(10) & arVerwendung(lngIndex, 14)
            End If
        Next
        .Range(.Cells(1, 7), .Cells(lngMaxRows, 8)) = arGepaartWerte
    End With
    dicIndex.RemoveAll
    Set dicIndex = Nothing
End Sub


Anzeige
AW: Nachfrage offen für bst
09.02.2007 17:10:38
chris
Hallo Bernd,
also vorab ohne das ichs getestet habe vielen vielen Dank !!!
Ist wirklich der Hammer.
Danke hast mein WE getrettet !
Wünsche dir auch ein schönes WE und ich geb wenn ihcs nicht vergesse am Montag noch bescheid obs klappt.
Danke gruß Chris
AW: Nachfrage offen für bst
12.02.2007 11:08:29
chris
Hallo Bernd,
wollte heute den Code laufen lassen.
Funktioniert leider nicht.und ich blick auch nicht so richtig durch.
Einen fehler den ich am ende der function gefunden habe glaube ich zumindest ist das er die daten ins falsche Sheet importiert.
Also hier:
With wsGepaart
lngMaxRows = IIf(Len(.Cells(.Rows.Count, 1)), .Rows.Count, .Cells(.Rows.Count, 1).End(xlUp).Row)
arGepaartIndex = .Range(.Cells(1, 1), .Cells(lngMaxRows, 1))
arGepaartWerte = .Range(.Cells(1, 7), .Cells(lngMaxRows, 8))
For i = 1 To lngMaxRows
strKey = CStr(arGepaartIndex(i, 1))
If dicIndex.Exists(strKey) Then
lngIndex = dicIndex(strKey)
arGepaartWerte(i, 1) = arGepaartWerte(i, 1) & Chr(10) & arVerwendung(lngIndex, 9)
arGepaartWerte(i, 2) = arGepaartWerte(i, 2) & Chr(10) & arVerwendung(lngIndex, 14)
End If
Next
.Range(.Cells(1, 7), .Cells(lngMaxRows, 8)) = arGepaartWerte
End With
dicIndex.RemoveAll
Set dicIndex = Nothing
in wsGepaart steht Sheet Importiere_Files_Verwendung
aber er sollte es ja in Sheet Klassen mit Verwendung gepaart impotieren.
ich schaumir das ganze noch mal schritt für schritt durch vieleicht schaffe ich es.
Wenn du mir noch mal helfen möchtest wäre ich dir sehr Dankbar !
gruß Chris
Anzeige
AW: Nachfrage offen für bst
12.02.2007 11:29:33
bst
Morgen chris,
hmm, im Aufruf von doPaaren habe ich wohl die beiden Tabellen verwechselt.
Versuche das mal einfach so:
Call doPaaren(Worksheets("Importiere_Files_Verwendung"), wsGepaart)
HTH, Bernd
AW: Nachfrage offen für bst
12.02.2007 11:48:35
chris
Hallo mir ist noch etwas aufgefallen.
Und zwar glaube ich das dieser code teil falsch ist ?
Weil er übersprint wenn eine Nummer schon vorhanden ist.
Aber es kann ja durchaus seine das bestimmt komponenten mehere Verwednungen haben.
diese sollen dann im Sheet: Klassen mit Verwendung gepaart
in den Spalten 7 und 8 untereinander in einer zelle stehen.
ich hoffe es ist möglich.
Deinen Code umbauen schaffe ich glaube ich nicht.
For i = 1 To lngMaxRows
strKey = arVerwendung(i, 1)
If dicIndex.Exists(strKey) Then
Debug.Print "Zeile: "; i; " Key existiert bereits: "; strKey
Else
dicIndex.Add strKey, i
End If
Next
End With
Anzeige
AW: Nachfrage offen für bst
12.02.2007 12:08:28
bst
Hi chris,
Ja, in wsVerwendung wird jeder Schlüssel aus der Spalte C nur EINMAL berücksichtigt.
Anders geht das M.E. auch nicht, welcher soll denn sonst zugeordnet werden ?
Vermutlich kommen wir so wohl nicht weiter :-(
Schicke mal besser eine (kurze) Beispielsmappe, in welcher die beiden Tabellen "Klassen mit Verwendung gepaart" und "Importiere_Files_Klassen" UND das gewünschte Ergebnis enthalten sind.
cu, Bernd
AW: Nachfrage
08.02.2007 13:27:06
mpb
Hallo Chris,
zu 1) Mißverständnis. Ich wollte wissen, ob es für jeden einzelnen Wert, den "aktnr" zugewiesen bekommt, in der Tabelle "Verwendung" nur einen oder mehrere "Treffer" geben kann. Wenn es nur einen Treffer geben kann, kann Du die innere Schleife danach mit "Exit For" abbrechen.
zu 2) Wenn die Tabellen sortiert sind, kann man die innere Schleife evtl. nicht bei 2, sondern bei einem höheren Wert beginnen lassen. Wenn beispielsweise schon 5 Treffer vorliegen und die Daten sortiert sind, muss die innere Schleife nicht mehr bei 2 beginnen, es reicht, wenn sie bei 7 beginnt.
Beides führt dazu, dass die Zahl der Schleifendurchläufe reduziert wird und der Code schneller läuft.
Gruß
Martin
Anzeige
AW: Nachfrage
08.02.2007 13:59:22
chris
Danke.

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige