Programmieren - alles kontrollieren 4.941 Themen, 20.715 Beiträge

Zugriff von VB6 - Programm auf Excel: superlangsam und stürz

RyoOhki / 4 Antworten / Flachansicht Nickles

Nochmal eine Frage zu VB, vielleciht kann mir ja jemand einen Rat geben:

Ich habe vor kurzem die Beschäftigungstherapie aufgebrummt bekommen, Excelmakros für alle möglichen vorgänge zu schreiben.
Da die Makros aber an eine Tabelle \'gebunden\' sind
(ich habe lediglich den Visualbuilder und Excel hier, keinerlei Dokumentation oder Literatur und vorher habe ich mich nie damit auseinander gesetzt, also bitte Nachsicht!) fand mein ausbilder die Makros nicht so toll und meinte, ich solle sie \'universeller machen\'
Drum habe ich jetzt versucht, die Excel-Makros in ein VisualBasic-Programm einzubauen, so das sie extern und tabellenunabhängig laufen.
Das klappt soweit auch und funktioniert, aber
der Zugriff ist ersten ultralangsam, so das ein sinnvolles Arbeiten mit dem Programm in Verbindung mit größeren Tabellen hoffnungslos ist.
Das zweite ist, dass die VB-Anwendung (sammt Excel) während des Programmablaufs kaum noch reagiert und ssich bei großen Tabellen nacheiner Zeit einfach einfriert und sichdann so aufhängt.

Ich habe mal einen Code eingefügt, vielleicht kann ihn ja mal jemand überfliegen und Tips geben! Bei der Tabellenverarbeitung würd eine Spalte nach doppelten einträgen gesucht durchsucht und diese dann gelöscht, in einem listenfeld angezeigt oder beides (wird in der form durch check3 und check4 abgefragt)

Form1 ist meine Form, Text(1, 2, n) Textfelder zum einlesen von Variabel



Option Explicit
Public Anwendung As Excel.Application Sub start()

\'=====Deklaration=====
Dim Arbeitsmappe As Excel.Workbook
Dim Tabellenblatt As Excel.Worksheet

Dim Tabelle

Dim Bereich As Excel.Range

Dim Blatt

Dim Spalte1 As Integer
Spalte1 = 0
\'=====Deklaration ende=====


\'=====Nachschauen, ob schon eine von Excel ausgeführt wird.

On Error Resume Next
Set Anwendung = GetObject(, "Excel.Application")
If Err.Number 0 Then
Set Anwendung = CreateObject("Excel.Application")
End If
Err.Clear
On Error GoTo 0 \' Fortfahren mit der üblichen Fehlerbehandlung.


\'=====Excel-Datei öffnen=====

Set Arbeitsmappe = Anwendung.Workbooks.Open(Form1.Text1.Text)



\'=====Tabellenblatt öffnen=====

Blatt = Form1.Text2.Text

Set Tabellenblatt = Arbeitsmappe.Sheets(Blatt)
Tabellenblatt.Select
Set Bereich = Tabellenblatt.Rows(1)

Spalte1 = Form1.Text3.Text


\'====Beginn der Tabellenverarbeitung

\'=====Deklaration=====
Dim Zeile1 As Integer
Zeile1 = 1

Dim Zähler As Integer
Zähler = 0

Dim Doppelte As Integer
Doppelte = 0

Dim Vergleich As Excel.Range
\'=====Deklaration ende=====

If Form1.Check2.Value = vbChecked Then \'(wahlweise ist excel visible oder unvisible, zweiteres ist schneller

Anwendung.Application.Visible = True
Anwendung.Parent.Windows(1).Visible = True
Arbeitsmappe.Sheets(Blatt).Visible = True
Else
End If


\'(=====Beginn des Makros====)

If Form1.Check4.Value = vbChecked Then
Form1.List1.AddItem (" Folgende wurden als doppelte gefunden: ")
Form1.List1.AddItem ("")
End If


Bereich.Cells(Zeile1, Spalte1).Select

While Bereich.Cells(Zeile1, Spalte1) "" \'Suchschleife, läuft so lange bis aktive keinen Inhalt mehr hat

Zähler = Zähler + 1
Set Vergleich = Bereich.Cells(Zeile1, Spalte1)


While Bereich.Cells(Zeile1, Spalte1) ""


Zeile1 = Zeile1 + 1
\'Bereich.Cells(Zeile1, Spalte1).Select \'

If Bereich.Cells(Zeile1, Spalte1) = Vergleich Then

If Form1.Check4.Value = vbChecked Then
Form1.List1.AddItem (Bereich.Cells(Zeile1, Spalte1))
End If


If Form1.Check3.Value = vbChecked Then
Bereich.Rows(Zeile1).Select
Selection.Delete Shift:=xlUp
Zeile1 = Zeile1 - 1
Doppelte = Doppelte + 1
End If

End If

Wend

Zeile1 = 2 + Zähler

If Form1.Check2.Value = vbChecked Then
Bereich.Cells(Zeile1, Spalte1).Select
End If

Wend


If Form1.Check4.Value = vbChecked Then
Form1.List1.AddItem ("")
Form1.List1.AddItem ("")
End If


If Form1.Check1.Value = vbChecked Then
Form1.List1.AddItem (Doppelte & " Doppelte Einträge in gefunden und gelöscht!")
End If

Set Arbeitsmappe = Nothing
Set Tabellenblatt = Nothing


End Sub


ich weis nicht wie verständlich das ist weil das forum meine tabulatoren nicht übernimmt und der quelltext so nicht allzu übersichtlich ist, aber ich würde mich über jeden tipp freuen!

grüße, Ryo

bei Antwort benachrichtigen
T-Rex RyoOhki „Zugriff von VB6 - Programm auf Excel: superlangsam und stürz“
Optionen

Setz mal vor dem Wend ein DoEvents sein, dann hast Du noch ein bisschen die Kontrolle.

Aber ich verstehe noch nicht, wie Du die doppelten Einträge findest (ich blick das hier im Forum irgendwie nicht, Einrückungen sind halt besser).

Vorschlag:
Poste mal bitte im ActiveVB-Forum (drück mich), und da benutzt Du bitte den Link "Quelltext posten", um den Quelltext zu formatieren.

Da wird Dir recht schnell geholfen werden, wenn es sich um VB-relevante Fragen geht.

 GrüßeT-Rex 
bei Antwort benachrichtigen