Announcement

Collapse
No announcement yet.

Umstellung Office 2000 auf 2007

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

  • Umstellung Office 2000 auf 2007

    Hallo zusammen,

    ich hatte ein VB 2005 Programm, aus dem ich eine Exceldatei (mit Excel 2000 erstellt) aufgerufen und bearbeitet habe.

    Nach der Umstellung von Office 2000 auf Office 2007 tauchen da reichlich Fehlermeldungen auf: z.B.

    "für folgende Komponenten, auf die verwiesen wird, sind aktualisierte benutzerdefinierte Wrapper verfügbar:Excel,Office,VBIDE"

    Ich vermute und hoffe, dass das nur mit den Verweisen zu tun hat und habe daher schon mal den Excel-Verweis erneuert.

    Mehr habe ich mich bisher nicht getraut.

    Andere Fehlermeldungen sind:
    "New" kann nicht auf einer Schnittstelle verwendet werden"
    bei dem Befehl "exAPP = New Excel.Application"

    "XlWindowstate"ist kein Member von Excel"
    bei dem Befehl
    "exAPP.WindowState = Excel.XlWindowState.xlMinimized"

    Wer kann mir da genaueres sagen?

    Oder ist es evtl. sogar nötig, einzelne Befehle zu ändern?

    vG

    fredyx

  • #2
    Hi fredyx,

    hab vor kurzem ein Projekt entwickelt das auf dem Entwicklungsrechner Excel 2003 hat und auf dem Zielrechner Excel 2007.

    Grundsätzlich wird für COM in .net ein Wrapper erstellt damit auf die "unmanaged" Klassen/Schnittstellen zugegriffen werden kann. Diesen Wrapper erstellt VS beim Einbinden eines Verweises automatisch.

    Dh auch dass die COM-Schnittstelle der Zielversion verwendet werden sollte, also Excel 2007.

    Nun, wenn auf dem Entwicklungsrechner diese nicht vorhanden ist oder man nicht weiß mit welcher Excel-Version der/die Zielrechner arbeiten gibts es zwei (vielleicht auch mehr) Möglichkeiten:
    1. du verwendest "Late Binding", dh dass auf Excel über Reflection zugegriffen wird. Dies ist aber eher umständlich, jedoch Excel-Versions unabhängig.
    2. du verteilst die Wrapper-Assemblies indem in VS unter den Dateieigenschaften Lokale Kopie = True eingestellt wird

    Die 2. Möglichkeit macht sich zum Nutz dass der Excel-Code abwärtskompatibel ist (sein sollte). Deshalb war es bei mir mit Excel 2003 und Excel 2007 kein Problem. Vielleicht geht das auch mit Excel 2000, denn auch diese Version legt die gleichen Schnittstellen offen.

    Der Start von Excel wird in meiner Anwendung über
    Code:
    Microsoft.Office.Interop.Excel.Application = new ApplicationClass();
    getätigt.

    Hoffe es hilft dir ein wenig.

    mfG Gü
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #3
      Originally posted by gfoidl View Post
      du verteilst die Wrapper-Assemblies indem in VS unter den Dateieigenschaften Lokale Kopie = True eingestellt wird
      Hallo Gü,

      wo finde ich denn diese Dateieigenschaften und bei welchen Dateien muss ich das so einstellen?

      vG

      fredyx

      Comment


      • #4
        Hi,

        siehe Bild im Anhang.

        Mit der lokalen Kopie werden die Assemblies (wurscht wo sie ursprünglich sind, im GAC, ...) in das Ausgabeverzeichnis der Anwendung kopiert (bin\Release oder Debug) und können mit der Anwendung verteilt werden. Auf dem Zielrechner wird dann bei nichtfinden der Assembly im dortigen GAC die Assemblie verwendet welche mit der Anwendung verteilt wurde.

        mfG Gü
        Attached Files
        "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

        Comment


        • #5
          Ja, danke!

          Ich habe auch noch den Verweis " microsoft.office.Interop.Excel", den ich auch auf true gestellt habe oder hat der da nichts zu suchen?

          vG

          fredyx

          Comment


          • #6
            microsoft.office.Interop.Excel
            Entspricht bei mir (siehe Abbildung) der Assembly Excel. Wenn er bei dir da ist füge auch diesen hinzu.

            mfG Gü
            "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

            Comment


            • #7
              Hallo Gü,

              wenn du "Excel" unter Verweise meinst; den habe ich auch.

              Nach Schließen und Neustart meines Programms hat sich an den o.g. Fehlermeldungen aber nichts geändert.

              Ich habe aber jetzt festgestellt, dass das Programm in der Laufzeit alles tut was es soll.

              Die o.g. Fehlermeldungen stehen bereits vor dem Debuggen an!!

              Aber natürlich möchte ich die doch gerne weg haben.

              Außerdem habe ich gerade festgestellt, dass beim Erstellen einer EXE-Datei die Meldung kommt:

              "Fehler beim Builtvorgang"

              vG

              fredyx
              Zuletzt editiert von fredyx; 03.12.2008, 16:35.

              Comment


              • #8
                [highlight=c#]
                using System.Runtime.InteropServices;
                using Microsoft.Office.Interop.Excel;

                namespace ConsoleApplication1
                {
                class Program
                {
                static void Main()
                {
                // Excel starten:
                Application excel = new ApplicationClass();
                excel.WindowState = XlWindowState.xlMinimized;

                // Code:
                // bla bla bla
                // und nochmal
                // bla bla bla

                // Excel schließen und Verweis freigeben:
                excel.Quit();
                Marshal.ReleaseComObject(excel);
                }
                }
                }
                [/highlight]
                bzw.
                [highlight=vbnet]
                Imports System.Runtime.InteropServices
                Imports Microsoft.Office.Interop.Excel

                Namespace ConsoleApplication1
                Public Class Program
                Public Shared Sub Main()
                ' Excel starten:
                Dim excel As Application = New ApplicationClass()
                excel.WindowState = XlWindowState.xlMinimized

                ' Code:
                ' bla bla bla
                ' und nochmal
                ' bla bla bla

                ' Excel schließen und Verweis freigeben:
                excel.Quit()
                Marshal.ReleaseComObject(excel)
                End Sub
                End Class
                End Namespace
                [/highlight]
                Lässt sich problemlos kompilieren und funktioniert auch.

                mfG Gü
                "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                Comment


                • #9
                  Noch eine Ergänzung:

                  Wenn ich

                  exAPP = New Excel.Application

                  durch


                  Microsoft.Office.Interop.Excel.Application = New ApplicationClass()

                  ersetze, dann tauchen die Fehlermeldungen auf:

                  "Application" ist ein Typ in "Excel" und kann nicht als Ausdruck verwendet werden." und

                  "Der Typ "ApplicationClass" ist nicht definiert."

                  vG

                  fredyx

                  Comment


                  • #10
                    Microsoft.Office.Interop.Excel.Application = New ApplicationClass()
                    Das ist klar, denn es fehlt die Variable. Schau das obige Bsp. an.

                    mfG Gü
                    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                    Comment


                    • #11
                      Hallo Gü,

                      also in einem kleinen Testprogramm klappt das.

                      In meinem realen Programm hatte ich in einem separaten Modul die Deklaration mit:

                      Public exAPP As Excel.Application

                      gemacht und an den verschiedensten Stellen im Programm, häufig mit Try - Catch so

                      exApp = New Excel.Application

                      geöffnet.




                      Ich habe versucht das zu trennen

                      Dim excel As Application = New ApplicationClass()

                      aber offensichtlich nicht richtig!

                      vG

                      fredyx

                      Comment


                      • #12
                        Hallo!

                        So klappt jetzt das Öffnen der Excel-Datei in einem Beispielprogramm:

                        [highlight=vb.net]
                        Imports System.Runtime.InteropServices
                        Imports Microsoft.Office.Interop.Excel




                        Public Class Form1
                        Public exApp As Application
                        Public exWB As Microsoft.Office.Interop.Excel.Workbook




                        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

                        ' Excel starten:
                        exApp = New ApplicationClass()

                        exApp.WindowState = XlWindowState.xlMinimized

                        exApp.Visible = True

                        exWB = exApp.Workbooks.Open(Application.StartupPath & "dateix")




                        If FolderBrowserDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then

                        'beliebige Codefolge
                        End If



                        End Sub

                        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

                        ' Excel schließen und Verweis freigeben:
                        exApp.Quit()
                        Marshal.ReleaseComObject(exApp)


                        End Sub
                        End Class
                        [/highlight]

                        Jetzt bekomme ich aber eine Fehlermeldung bei
                        [highlight=vb.net]exWB = exApp.Workbooks.Open(Application.StartupPath & "dateix")[/highlight]

                        und zwar bei "Application.StartupPath " kommt:

                        Der Verweis auf einen nicht freigegebenen Member fordert einen Objektverweis

                        und eine weitere Fehlermeldung im Aufruf von

                        [highlight=vb.net]If FolderBrowserDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then[/highlight]

                        und zwar bei "Windows.Forms" kommt:

                        "Forms" ist kein Member von "Microsoft.Office.Interop.Excel.Windows"

                        Vor der Umstellung auf Excel 2007 war das i.O.

                        Wie kann ich das wieder in Ordnung bringen?

                        vG

                        fredyx

                        Comment


                        • #13
                          Application ist sowohl Bestandteil von System.Windows.Forms als auch von Excel. Der Compiler kann sich dann nicht mehr auskennen welche Application gemeint ist und meldet einen Fehler.

                          Deshalb bei einem von beiden den vollen Namen angeben.

                          zB:
                          [highlight=vbnet]
                          exWB = exApp.Workbooks.Open(System.Windows.Forms.Applicat ion.StartupPath & "dateix")
                          [/highlight]

                          Dann weiß der Compiler wieder was gemeint und erledigt brav seine Arbeit

                          mfG Gü
                          "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                          Comment


                          • #14
                            Ja, danke! Das ist prima.

                            Und was ist bei "Application.StartupPath" falsch?

                            DIE FRAGE WAR QUATSCH!! DIE NEHME ICH ZURÜCK!!

                            vG

                            fredyx
                            Zuletzt editiert von fredyx; 04.12.2008, 20:43.

                            Comment


                            • #15
                              Hallo,

                              leider habe ich immer noch ein Problem und zwar kommt bei der folgenden Zeile, mit der ich nur ein Label in einer Form positionieren möchte:

                              [highlight=vbnet]Form1.Label1.Location = New Point(10, 10)[/highlight]

                              nach der Umstellung auf Excel 2007 bei New wieder die Fehlermeldung:

                              ""New" kann nicht auf einer Schnittstelle verwendet werden."

                              Da brauche ich wohl noch einen guten Rat.

                              Das hat aus meiner Sicht mit all dem vorher nichts zu tun? Oder?

                              vG

                              fredyx

                              Comment

                              Working...
                              X