none
VB:Net mit Excel 2007 RRS feed

  • Frage

  • Guten Abend, ich habe eine WinForm- Anwendung in VB.Net geschrieben, die mir eine Excel- Datei beim erstem Load erstellt und danach in diese Datei die Arbeitszeiten einträgt (wollte meine Arbeitszeit erfassen). Zu Hause habe ich Windows 7 und alles funktioniert einwandfrei, mit der Ausnahme, dass das Excel-Programm im Task-Manager immer noch vorhanden bleibt, trotz .Quitt und .Kill. Auf der Arbeit habe ich Windows XP und die Excel-Datei wird entweder nicht erzeugt oder erzeugt nicht in dem Pfad, den ich vorgegeben habe (außerdem wollte ich Book1.xls wurde aber Mappe1.xls erstellt). Deswegen habe ich folgende Fragen:

    1. wie beendet man richtig eine Office- Datei aus .Net Umgebung?

    2. wo liegt der Unterschied zwischen Windows 7 und XP um eine Excel-Datei zu erzeugen und die ohne Öffnen zu beschreiben? (ob es gäbe?)

    3. gibt es die Möglichkeit ein Programm aus dem Autostart- Ordner per VB- Code zu entfernen?

    Vielen Dank im Voraus.

    Dienstag, 7. Juni 2011 18:39

Antworten

  • Hallo,

     

    zu 1:

    Dim xl as New Excel.Application

    Dim wb as Excel.Workbook

    wb = xl.Workbooks.Open("C:\test.cls")

     

    'schließen

    if xl.Workbooks.count > 1 then

    wb.close

    else

    xl.quit

    end if

     

    wb = Nothing

    xl = Nothing

     

    Zu 2.: Wenn du mit interoperability arbeitest, muss die Datei geöffnet sein. Sie ist aber nicht zwangsweise visible

    xl.Visible = True 'Excel App sichtbar machen

     

    Es gibt aber einen Unterschied: In WinXp könntest du Probleme bekommen wenn du mit GetObject versucht auf die Excel Anwendung zuzugreifen und diese noch nicht in der ROT eingetragen ist. Dieses Problem solltest du allerdings nicht haben wenn du mit Winforms arbeitest.

     

    Zu 3:

    Hab ich noch nie versucht, aber mit dem Kill-Befehl kannst du Dateien löschen

    Also etwa so: Kill("Pfad\Datei.endung")

     


    Cheers, Jörn Bosse
    Microsoft Student Partner
    Mittwoch, 8. Juni 2011 14:36
  • Hallo,

    3. gibt es die Möglichkeit ein Programm aus dem Autostart- Ordner per VB- Code zu entfernen?


    Kommt drauf an welchen Autostart - Ordner Du meinst. Aus dem Startmenü des aktuellen Benutzers:

    IO.File.Delete(IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Startup), "programmname.lnk")
    

    Autostart Einträge können aber auch im Autostart aller Benutzer liegen (Environment.SpecialFolder.CommonStartup ab .NET 4.0), wie auch in der Systemregistrierung (HKLM/HKCU\Software\Microsoft\Windows\CurrentVersion\Run).


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    Freitag, 10. Juni 2011 06:12
    Moderator

Alle Antworten

  • Guten Tag,

    auf die erste Frage habe ich folgende Antwort in einem Buch gefunden:

                    myExcel.Quit()

                     GC.Collect()

                    GC.WaitForPendingFinalizers()

                    GC.Collect()

                    GC.WaitForPendingFinalizers()

    Es funktioniert.

    Mittwoch, 8. Juni 2011 14:23
  • Hallo,

     

    zu 1:

    Dim xl as New Excel.Application

    Dim wb as Excel.Workbook

    wb = xl.Workbooks.Open("C:\test.cls")

     

    'schließen

    if xl.Workbooks.count > 1 then

    wb.close

    else

    xl.quit

    end if

     

    wb = Nothing

    xl = Nothing

     

    Zu 2.: Wenn du mit interoperability arbeitest, muss die Datei geöffnet sein. Sie ist aber nicht zwangsweise visible

    xl.Visible = True 'Excel App sichtbar machen

     

    Es gibt aber einen Unterschied: In WinXp könntest du Probleme bekommen wenn du mit GetObject versucht auf die Excel Anwendung zuzugreifen und diese noch nicht in der ROT eingetragen ist. Dieses Problem solltest du allerdings nicht haben wenn du mit Winforms arbeitest.

     

    Zu 3:

    Hab ich noch nie versucht, aber mit dem Kill-Befehl kannst du Dateien löschen

    Also etwa so: Kill("Pfad\Datei.endung")

     


    Cheers, Jörn Bosse
    Microsoft Student Partner
    Mittwoch, 8. Juni 2011 14:36
  • Hallo Jörn,

    entschuldige bitte für die späte Antwort. Deinen Tipp zu 1. funktioniert aber ich habe ihn mit meinem zusammen angewendet. Zu 3. bin ich noch beim Suchen.

    vielen Dank für deine Vorschläge.

     

    Donnerstag, 9. Juni 2011 17:55
  • Hallo,

    3. gibt es die Möglichkeit ein Programm aus dem Autostart- Ordner per VB- Code zu entfernen?


    Kommt drauf an welchen Autostart - Ordner Du meinst. Aus dem Startmenü des aktuellen Benutzers:

    IO.File.Delete(IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Startup), "programmname.lnk")
    

    Autostart Einträge können aber auch im Autostart aller Benutzer liegen (Environment.SpecialFolder.CommonStartup ab .NET 4.0), wie auch in der Systemregistrierung (HKLM/HKCU\Software\Microsoft\Windows\CurrentVersion\Run).


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    Freitag, 10. Juni 2011 06:12
    Moderator
  • Hallo Thorsten,

    vielen dank für deine Antwort. Es funktioniert prima! Ich habe aber bemerkt, dass nach dem Beenden des Programms die Datei immer noch im Task-Manager zu finden ist. Ich habe versucht sie auf diese Art zu beenden, finde aber keine Lösung der Variablen "Myprocess" die Dateiname zu übergeben. Ich benutze folgende Code: 

     Private Sub myProcess() 

            Dim Myprocess As System.Diagnostics.Process

            Dim prList() As Process

            Myprocess = ?

            prList = Process.GetProcessesByName(My.Application.Info.AssemblyName & ".exe")

            For Each i In prList

                Myprocess.Kill()

            Next

        End Sub

    Samstag, 11. Juni 2011 09:24
  • Hallo Thorsten,

    das Problem existierte, weil ich Excel nicht korrekt beendet habe... Jetzt geht es:

                    oBook.Save()           

                    ' Datei schließen

                    oBook.Close()

                    'quit Excel

                    oSheet = Nothing

                    oBook = Nothing

                    ' Objekt schließen

                    oOffice.Quit()

                    ' Reinigung

                    System.Runtime.InteropServices.Marshal.ReleaseComObject(oOffice)

                    System.Runtime.InteropServices.Marshal.ReleaseComObject(oBook)

                    System.Runtime.InteropServices.Marshal.ReleaseComObject(oSheet)

                    oOffice = Nothing

                    GC.Collect()

                    GC.WaitForPendingFinalizers()

                    GC.Collect()

                    GC.WaitForPendingFinalizers()

    Samstag, 11. Juni 2011 11:52
  • Guten Tag,

    Jetzt aber richtig: 

    zur 1.

    oBook.Save()           

                    ' Datei schließen

                    oBook.Close()

                    'quit Excel

                    ' Objekt schließen

                    oOffice.Quit()

                    ' Reinigung

                    System.Runtime.InteropServices.Marshal.ReleaseComObject(oOffice)

                    System.Runtime.InteropServices.Marshal.ReleaseComObject(oBook)

                    System.Runtime.InteropServices.Marshal.ReleaseComObject(oSheet)

                    oSheet = Nothing

                    oBook = Nothing

                    oOffice = Nothing

                    GC.Collect()

                    GC.WaitForPendingFinalizers()

                    GC.Collect()

                    GC.WaitForPendingFinalizers()

     

    zur Frage vom 11.06.:

     Dim prList() As Process

            prList = Process.GetProcessesByName(My.Application.Info.AssemblyName & ".exe")

            For Each i In prList

                i.Kill()

            Next

    Montag, 13. Juni 2011 08:05