Announcement

Collapse
No announcement yet.

Fehler beim Öffnen einer Excel Datei

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

  • Fehler beim Öffnen einer Excel Datei

    Ich möchte in einem gegebenen Verzeichnis alle Excel-Dateien nach Hyperlinks durchsuchen und alle Links in einer Datei auflisten.

    Auf dem Entwicklungssystem (Windows 7 64Bit, Visual Studio 2008, Office 2007) läuft das Program ohne Fehler.

    Auf dem Zielrechner (Windows XP, Office 2000) kommt folgender Fehler:
    "Could not load file or assembly 'Microsoft.Office.Interop.Excel, Version=12.0.0.0, Culture...."

    Also habe ich den Verweis auf "Microsoft.Office.Interop.Excel" in VS 2008 in den Eigenschaften des Projekts auf "Lokale Kopie = True" gesetzt und nehme die resultierende DLL auf den Zielrechner mit.

    Das Program startet, bricht aber beim Öffnen der ersten Excel Datei:
    -> Excel1.Workbooks.Open(Filename:=FileArray.Item(i). ToString, ReadOnly:=True)
    mit der Fehlermeldung "Object Reference not set to an instance of an object" ab.

    Der Stringarray "FileArray" beinhaltet nach dem Aufruf der Funktion "FSearch.Search" eine Liste aller Excel-Dateien.

    Hier der Code:
    Code:
    Private Sub bt_SearchHyperlinks_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bt_SearchHyperlinks.Click
            Dim FSearch As New FileSearch
            Dim Filter As New FileSearch.SearchFilter
            Dim FileArray As New List(Of String)
            Dim RowNR As Integer = 0
    
            lb_Status1.Text = "läuft"
            tb_Zeile1.Text = 0
    
            Dim SW_Excel_Output, SW_ErrExcel_Output As StreamWriter
            Dim Err_No As Integer = 0
            Dim OutEXcelFile As String = tb_Ziel.Text + "\HYPERLINKS_in_EXCEL.txt"
            Dim OutErrFile As String = tb_Ziel.Text + "\ErrorOutput_EXCEL.txt"
            Dim fs_EXcel As FileStream = New FileStream(OutEXcelFile, FileMode.Create, FileAccess.Write)
            Dim fs_ErrEXcel As FileStream = New FileStream(OutErrFile, FileMode.Create, FileAccess.Write)
            SW_Excel_Output = New StreamWriter(fs_EXcel)
            SW_ErrExcel_Output = New StreamWriter(fs_ErrEXcel)
            SW_Excel_Output.WriteLine("DATEINAME, PFAD, HYPERLINKNAME, HYPERLINKADRESSE")
    
            With Filter
                .Listing = FileSearch.SearchFilter.LO.FILES_ONLY
                .FileTypes = "xls,xlsx"
                .SizeType = FileSearch.SearchFilter.ST.BYTES
            End With
    
            FSearch.Search(tb_FindFolder1.Text, "", Filter, FileArray)
    
            Dim fzeile As String
            For i = 0 To FileArray.Count - 1
                Dim Excel1 As New Microsoft.Office.Interop.Excel.Application
                Try
                    Excel1.Workbooks.Open(Filename:=FileArray.Item(i).ToString, ReadOnly:=True)
                    For Each WB_Sheet In Excel1.Sheets
                        For Each hyp In WB_Sheet.hyperlinks
                            fzeile = FileArray(i).ToString.Substring(FileArray(i).ToString.LastIndexOf("\"c) + 1) & ", " & _
                                FileArray(i).ToString.Substring(0, FileArray(i).ToString.LastIndexOf("\"c)) & ", " & _
                                hyp.Name & ", " & hyp.Address
                            ' MessageBox.Show(fzeile, "EXCEL Suche", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, 0, 0)
                            SW_Excel_Output.WriteLine(fzeile)
                            RowNR = RowNR + 1
                            If RowNR Mod 5 = 0 Then
                                tb_Zeile1.Text = RowNR
                            End If
                        Next
                    Next
                Catch ex As Exception
                    Err_No = Err_No + 1
                    Dim EText As String = "FEHLER: " & ex.Message
                    ' MessageBox.Show(EText, "EXCEL Suche", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, 0, 0)
                    SW_ErrExcel_Output.WriteLine(EText & "(" & FileArray.Item(i).ToString & ")")
                Finally
                    Excel1.ActiveWorkbook.Close(False)
                    Excel1.Workbooks.Close()
                    Excel1.Quit()
                    Kill_Obj(Excel1)
                    GC.Collect()
                End Try
            Next
            SW_Excel_Output.Close()
            fs_EXcel.Close()
            SW_ErrExcel_Output.Close()
            fs_ErrEXcel.Close()
            tb_Zeile1.Text = RowNR
            tb_Fehler1.Text = Err_No
            lb_Status1.Text = "steht"
            bt_SearchHyperlinks.Enabled = False
        End Sub
    Meine Frage:

    1.) Ist die Vorgehensweise (DLL kopieren) überhaupt richtig?
    oder
    2.) Wie bekomme ich das Program auf dem Zielrechner zum rennen?

  • #2
    Hallo,

    Kannst Du auf dem Entwicklungsrechner auch eine kleinere Version als 12.0.0.0 wählen?
    Vielleicht ruft die 12er Version Routinen auf die es auf einem System mit Office 2000 gar nicht gibt.

    Gruß Womble

    Comment


    • #3
      Ist das die Interop Assembly aus VSTO oder selbst erzeugt?
      Mindestvoraussetzung für VSTO ist übrigens Office 2003.

      Comment


      • #4
        Wie Ralf schon schrieb, werden .net dll's von Office 2000 nicht unterstützt.
        Es soll möglichkeiten geben diese auch dort zum laufen zu bekommen, jedoch soll das sehr aufwendig sein. Ich hab es nicht selber ausprobiert, aber vielleicht helden dir diese Links weiter:

        http://www.c-sharpcorner.com/Code/20...elSheetGAG.asp
        http://forums.devarticles.com/archiv...cess-excel-obj

        Comment

        Working...
        X