Worksheet vergleich dauert viel zu lang

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von Tomi G..

    Worksheet vergleich dauert viel zu lang

    Hallo,
    ich habe ein problem mit meinem Code. Ich steuer eine Exceltabelle mit vb.net und möchte ca. 500 Werte in zwei weiteren Tabellenblätter vergleichen. ist der wert in beiden Tabellenblätter nicht vorhanden sollte er in vierten Tabellenblatt aufgelistet bzw. nur in einer ComboBox angezeigt werden.
    Zur verständnis:

    Quellcode

    1. Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
    2. Dim SoR As Excel.Range, CompR As Excel.Range, SorC As Excel.Range, CompC As Excel.Range, CompC2 As Excel.Range, CompSPERR As Excel.Range
    3. ComboBox3.Visible = True
    4. ComboBox3.Items.Clear()
    5. SoR = Master.objXlBlattVERGL.Range("C2:C500")
    6. CompR = Master.objXlBlattLEITUNG.Range("C4:C500")
    7. CompSPERR = Master.objXlBlattGESPE.Range("A4:A500")
    8. For Each SorC In SoR
    9. CompC = CompR.Find(SorC.Value, , Excel.XlFindLookIn.xlValues, Excel.XlLookAt.xlWhole, )
    10. CompC2 = CompSPERR.Find(SorC.Value, , Excel.XlFindLookIn.xlValues, Excel.XlLookAt.xlWhole, )
    11. If CompC Is Nothing And CompC2 Is Nothing Then ComboBox3.Items.Add(SorC.Text)
    12. Next
    13. End Sub


    .... hier nur als ComboBox3 anzeige.
    Es dauert ca 30 bis 40 Sek. bis das Ergebnis sichtbar ist!! Gibt es nen schnelleren Weg. In VBA dauert die auswertung mit for - next verfahren ca 4 Sek.

    siehe...

    Quellcode

    1. Private Sub CommandButton4_Click() 'FreiePorts
    2. Dim CelA As String
    3. Dim FiNNd As Range
    4. Dim FiNNdSPR As Range
    5. Dim iAnzahl As Integer
    6. ActiveWindow.WindowState = xlMinimized
    7. ComboBox1.Visible = True
    8. For i = 2 To 1000
    9. CelA = Sheets("PORTVERGLEICH").Cells(i, 3).Value
    10. Sheets("LEITUNGSWEGE").Visible = True
    11. Sheets("LEITUNGSWEGE").Select
    12. Columns(3).Select
    13. Set FiNNd = Selection.Find(what:=CelA, After:=ActiveCell, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=False)
    14. Sheets("GESPERRT").Visible = True
    15. Sheets("GESPERRT").Select
    16. Columns(1).Select
    17. Set FiNNdSPR = Selection.Find(what:=CelA, After:=ActiveCell, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=False)
    18. If FiNNd Is Nothing And FiNNdSPR Is Nothing Then
    19. Sheets("FreierPlatz").Visible = True
    20. Sheets("FreierPlatz").Select
    21. Cells(Cells(Rows.Count, "B").End(xlUp).Row + 1, "B").Value = CelA
    22. Else
    23. End If
    24. Next i
    25. Sheets("LEITUNGSWEGE").Visible = False
    26. Sheets("PORTVERGLEICH").Visible = False
    27. Sheets("GESPERRT").Visible = False
    28. Sheets("FreierPlatz").Visible = False
    29. For iAnzahl = 1 To 1000
    30. With ComboBox1
    31. If Sheets("FreierPlatz").Cells(iAnzahl, 2) <> "" Then
    32. .AddItem Sheets("FreierPlatz").Cells(iAnzahl, 2)
    33. ComboBox1.ListIndex = 0
    34. End If
    35. End With
    36. Next iAnzahl
    37. ActiveWindow.WindowState = xlMaximized
    38. End Sub


    Danke im vorraus
    Tomi
    Ja. Nimm nicht die COM-APIs sondern eine Bibliothek die unabhängig von Office läuft. Habe persönlich sehr gute Erfahrungen mit EPPlus gemacht.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Habe gerade auf die schnelle was davon gelesen... klingt sehr interessant. Leider habe ich office 2000. So wie ich das sehe geht es nur mit 2007 und 2010-er. Funktioniert das dan auch ohne Office auf dem rechner?

    Ich habe schon mit SQL versucht aber bin wahnsinig geworden da ich über 60 columns habe und eine Dokumentation über die Veränderungen je User speichern mochte. Noch dazu sollten sich die von mir freigegebene User registrieren konnen usw. Das ist mir mit SQL nicht so gelungen.
    Danke für die schnelle Antwort
    Tomi

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Tomi G.“ ()

    Das läuft 100% unabhängig von Office. Habe das vor allem bei ASP.NET Webanwendungen verwendet, welche auf Serverseite Excel-Dateien importieren. Dort ist kein Office installiert -> läuft wunderbar. Die Bibliothek liest also wirklich nur die Excel-Datei aus.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    @thefiloe
    Ist das nicht so das EPPlus die Tabellen in eigene Tabellen um...was auch immer? Oder bleibt die Tabelle als .xlsx und wird mit seiner Hilfe als Datenbank verknüpft? Sorry habe noch keine Zeit gehabt genauer zu Googlen. Habe nur gestern gesehen daß es nicht so viel davon im Google steht.
    @petaod
    Das werde ich ausprobieren. Danke. War eigentlich bis jetzt mit 2000-er sehr zufrieden. Es tat was ich bräuchte.
    Schönen Abend euch beiden. Ihr habt mir gut geholfen.
    Tomi
    Mit EEPlus kannste einfach ganz simpel eine Excel-Datei lesen und schreiben. Intern wird die Datei eingelesen und du hast dann Zugriff auf alles was in der Tabelle bzw. Tabellen steht.
    Ich persönlich hab mir da nen kleinen Mapper gebastelt der automatisch Tabellen in Objekte mappt (Objekte müssen mit entsprechenden Attributen gekennzeichnet werden -> ähnlich wie bei Serialisierung) und damit klappt das ganz wunderbar. Lesen und schreiben :).


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Wie gesagt. Ich verarbeite Import-Dateien die bis zu mehrere hundert MB groß werden können. Geht alles wunderbar. Die ganzen Com Schnittstellen von Excel sind halt a) langsam und b) brauchste dafür Office installiert. Damit biste halt unabhängig und wesentlich schneller.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „thefiloe“ ()