Announcement

Collapse
No announcement yet.

Excel-Zugriff beschleunigen!!

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Excel-Zugriff beschleunigen!!

    Hallo zusammen,

    ich benötige mal wieder eure Hilfe!

    Mit dem folgenden Befehlscode schreibe ich 7 Werte in eine Exceltabelle:

    [highlight=vb.net] exWB2.Worksheets("tabelle1").Range("B" & izeile).Value() = PSA
    exWB2.Worksheets("tabelle1").Range("C" & izeile).Value() = fPSA
    exWB2.Worksheets("tabelle1").Range("D" & izeile).Value() = Testo
    exWB2.Worksheets("tabelle1").Range("E" & izeile).Value() = Resth
    exWB2.Worksheets("tabelle1").Range("F" & izeile).Value() = PVol
    exWB2.Worksheets("tabelle1").Range("G" & izeile).Value() = Miktio
    exWB2.Worksheets("tabelle1").Range("H" & izeile).Value() = Notiz[/highlight]

    Für diese 7 Werte benötigt mein PC ca. 3 sec.

    Da das bis zu 100 Zeilen sind, die mit "izeile" eingetragen werden müssen, ist das natürlich extrem lang.

    Kennt jemand eine Möglichkeit, dies zu verkürzen?

    vG

    fredyx

  • #2
    Programmtechnisch oder Laufzeitmäßig?

    Programmtechnisch würde ich Dir zu einer Schleife raten, du müsstest nur dafür sorgen, dass die Werte für fPSA, Testo, Resth usw. über einen Index verfügbar sind. Außerdem entweder zu With exWB2.Worksheets("tabelle1")
    oder zur Zuweisung des exWB2.Worksheets("tabelle1") zu einer Variablen.

    Von der Verarbeitungszeit her, weiß ich nicht, ob das was bringt, aber versuch mal anstatt über die Range zu gehen mit Worksheet.Cells(row, col).Value auf die Zellen zuzugreifen. Möglicherweise spart Excel ein paar Millisekunden, um festzustellen, dass die Range nur eine Zelle umfasst... Da würde ich aber doch eher auf die Antwort eines Experten warten.

    Edit: Mir ist gerade noch was eingefallen: versuch mal, ob Du eine komplette Zeile als String mit Trennern (ich glaube Tabs) in die Zwischenablage schreibst, und dann in Excel ein Paste auslöst, da weiß ich aber nicht genau wie das geht.
    Zuletzt editiert von M.Dietz; 19.01.2009, 13:54. Reason: Nachtrag

    Comment


    • #3
      Du mußt per VariantArray einen kompletten Bereich übergeben. Jeder Einzelzugriff auf eine Zelle in Excel ist grotten Langsam.

      Beispiel kann ich dir nicht geben da ich ihn nur für Delphi aus einer Closed-Source-Komponente zur verfügung habe.

      Comment


      • #4
        Originally posted by M.Dietz View Post
        Programmtechnisch oder Laufzeitmäßig?



        Von der Verarbeitungszeit her, weiß ich nicht, ob das was bringt, aber versuch mal anstatt über die Range zu gehen mit Worksheet.Cells(row, col).Value auf die Zellen zuzugreifen. Möglicherweise spart Excel ein paar Millisekunden, um festzustellen, dass die Range nur eine Zelle umfasst... Da würde ich aber doch eher auf die Antwort eines Experten warten.

        Edit: Mir ist gerade noch was eingefallen: versuch mal, ob Du eine komplette Zeile als String mit Trennern (ich glaube Tabs) in die Zwischenablage schreibst, und dann in Excel ein Paste auslöst, da weiß ich aber nicht genau wie das geht.
        Hallo,

        danke, es geht um die Verarbeitungszeit.

        Worksheet.Cells(row, col).Value

        Wie sieht denn das genauer aus?

        Die Idee mit dem String werde ich auch mal versuchen. Aber nicht in die Zwischenablage, sondern den String in die erste Zelle schreiben, denn wenn man von irgendwoher etwas in eine Zelle kopiert, dann passiert es ja auch, dass das auf mehrere Zellen verteilt ist.
        Also muss das doch mit dem richtigen Trennzeichen wohl klappen.

        Aus Word kopiert ist Tabulator das richtige Trennzeichen.

        Ich werde mich wieder melden!!

        vG

        fredyx

        Comment


        • #5
          Im Prinzip folgendermaßen:

          [highlight=vbnet]
          Dim excApp As Object
          Dim excWbk As Object
          Dim excSheet As Object

          Try
          excApp = CreateObject("Excel.Application")
          Catch e As Exception
          Fehlerausgabe(e.Message)
          return
          End Try

          Try
          exWbk = excApp.Workbooks.Open(ExcelFileName)
          Catch e As Exception
          'Aufräumen und Excel schließen
          End Try

          Try
          excSheet = excWbk.Sheets(1)
          excSheet.Cells(row, col).value="Dies ist ein Beispiel"
          Catch e As Exception
          Fehlerausgabe(e.Message)
          Finally
          'Aufräumen und Excel beenden
          Process.Start(ExcelFileName)
          End Try
          [/highlight]

          Lohnt sich aber, wenn ich Bernhard richtig verstanden habe, nur, wenn man gezielt einzelne Zellen setzen möchte. An einer effiziente Art, einen Bereich zu übergeben, wäre ich natürlich auch interessiert , das erspart mir auch eine Menge Zeit beim Erstellen von Statistiken aus der Datenbank.

          Comment


          • #6
            Originally posted by M.Dietz View Post
            Im Prinzip folgendermaßen:

            [highlight=vbnet]

            excSheet = excWbk.Sheets(1)
            excSheet.Cells(row, col).value="Dies ist ein Beispiel"

            [/highlight]
            Hallo M.,

            das bringt leider keine Verbesserung!
            Trotzdem danke.

            vG

            fredyx

            Comment


            • #7
              Zur Info hier die beiden Varianten, die bei mir funktionieren:

              [Highlight=vb.net]
              Dim exAPP As Excel.Application
              Dim exWB As Excel.Workbook
              Dim vxy As Object

              '-----> Excel öffnen
              exAPP = New Excel.Application
              exAPP.Visible = True

              '-----> Mappe öffnen
              exWB = exAPP.Workbooks.Open("psa.xls")

              exWB.Activate()

              vxy = exWB.Worksheets("tabelle1").Range("a1:h100")

              For iz As Integer = 1 To 100 'Feld füllen
              For isp As Integer = 1 To 8
              vxy(iz, isp) = "1.6.2008" 'mit der Ausführung dieses Befehls erfolgen schon die Eintragungen in die Exceldatei
              '1.6;"1,6";"x";"1.6.2008" geht
              '1,6;1.6.2008 geht nicht
              Next
              Next

              [/Highlight]


              Die folgende Variante ist wesentlich schneller, hat aber den Nachteil, dass die Variablen alle dem Datentyp des Feldes entsprechen müssen. LEIDER!
              Das hat nichts mit den 100 bzw. 1000 Zeilen zu tun. Ich habe beide Fälle auch mit 10.000 Zeilen getestet.

              [Highlight=vb.net]
              Dim exAPP As Excel.Application
              Dim exWB As Excel.Workbook
              Dim feld(0 To 999, 0 To 3) As Integer

              '-----> Excel datei öffnen
              exAPP = New Excel.Application
              exAPP.Visible = True

              '-----> Mappe öffnen
              exWB = exAPP.Workbooks.Open("psa.xls")

              exWB.Activate()

              For iz As Integer = 0 To 999
              For isp As Integer = 0 To 3
              feld(iz, isp) = iz + isp
              Next
              Next

              exWB.Worksheets("tabelle1").Range("a1:c1000") = feld [/Highlight]

              vG

              fredyx

              Comment


              • #8
                Ich habe nachträglich noch festgestellt:

                wenn man das Feld nicht so:

                [highlight=vb.net]Dim feld(0 To 999, 0 To 3) As Integer[/highlight]

                sondern so deklariert,

                [highlight=vb.net]Dim feld(0 To 999, 0 To 3) As Object[/highlight]

                dann wird ein Feld von 500.000 Elementen in ca 2 sec. in eine Exceldatei übertragen und man kann damit verschiedene Variablentypen übergeben!!

                Das finde ich toll!!

                vG

                fredyx

                Comment

                Working...
                X