Exceldatei öffnen und vorige Schließen mit VBA

  • Excel

Es gibt 33 Antworten in diesem Thema. Der letzte Beitrag () ist von peterfido.

    Exceldatei öffnen und vorige Schließen mit VBA

    Hallo

    Ich habe ein wahrscheinlich relativ einfaches Problem, aber finde keine Lösung dazu.

    Ich habe eine Excel Datei wo ich ein Userform als Navigation eingebaut habe. Diese Navigations-Userform öffnet sich beim Starten der Datei und der Nutzer wählt
    dann das was er machen möchte. Je nachdem was er wählt öffnet sich dann die entsprechende andere Excel, in welcher beim Start wiederrum gleich eine Anwendung mit Userform startet.
    Das Problem ist, dass ich die Navigationsdatei schließen möchte, sobald der Nutzer sich eine Anwendung ausgewählt hat, aber da sich bei Auswahl gleich eine neue Anwendung startet, reagiert die alte nicht mehr beim schließen.
    Bsp: Ich starte die ExcelDatei "Navigation" und wähle dann dort "Programm1". Jetzt soll sich die Excel mit öffen wo Programm1 drauf ist. Die Anwendung startet ja automatisch. Gleichzeitig soll die ExcelDatei "Navigation" sich schließen. Wenn er nun fertig mit den "Programm1" ist würde er dort auf Beenden drücken und ein dort hinterlegter Befehl bringt ihn wieder zu "Navigation" und schließt "Programm1"
    --> Problem ist, dass wenn ich Programm1 öffne, dass die dort startende Anwendung anscheinend das Beenden des Workbooks "Navigation" verhindert.

    Wie kann ich das denn genau lösen?
    Vielen Dank

    Visual Basic-Quellcode

    1. Private Sub btnProgramm1_Click()
    2. Workbooks.Open "C:\Users\User\Desktop\Sicherungen\Programm1.xlsm"
    3. Application.DisplayAlerts = False
    4. Workbooks("Navigation.xlsm").Close savechanges = no
    5. Application.DisplayAlerts = True
    6. End Sub
    Also meinst du ich soll einen Befehl schreiben zum öffnen der Excel und einen Befehl zum Schließen und diesen beiden Befehle dann einfach
    in einen Cklick Erreignis aufrufen?

    Weil selbst wenn ich das trenne, dann schließt er die Excel nicht, da die Anwendung der geöffneten Excel dies blockiert.

    Visual Basic-Quellcode

    1. Private Sub btnProgramm1_Click()
    2. OpenProgramm1
    3. CloseNavigation
    4. End Sub
    5. Private Sub OpenProgramm1()
    6. Workbooks.Open "C:\Users\User\Desktop\Sicherungen\Programm1.xlsm"
    7. End Sub
    8. Privat Sub CloseNavigation()
    9. Application.DisplayAlerts = False
    10. Workbooks("Navigation.xlsm").Close savechanges = no
    11. Application.DisplayAlerts = True
    12. End Sub

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „TeamBob“ ()

    Nein, ich meinte eine neue Excel-Instanz zu öffnen.
    Irgend so eine Konstrukt:

    Visual Basic-Quellcode

    1. Sub OpenNextWorkbook()
    2. Dim xls As Application, wb As Workbook
    3. Set xls = CreateObject("Excel.Application")
    4. Set wb = xls.Workbooks.Open("d:\temp\xxx.xlsm")
    5. xls.Visible = True
    6. Application.Quit
    7. End Sub
    Du musst dir aber bewusst sein, dass sich alle in der alten Instanz geöffneten Workbooks mit verabschieden.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „petaod“ ()

    Und wenn ich es auf diesem Wege machen, dann kann ich die vorige Excel auch schließen, obwohl mit der neuen Excel eine Anwendung startet?
    Er öffnet die neue, aber die alte Anwendung bleibt sichtbar im Hintergrund und sobald ich die neu anwendung beende, schließt sich die alte

    Visual Basic-Quellcode

    1. Private Sub btnProduktionsdaten_Click()
    2. OpenNextWorkbook
    3. CloseMainSheet
    4. End Sub
    5. Sub OpenNextWorkbook()
    6. Dim xls As Application, wb As Workbook
    7. Set xls = CreateObject("Excel.Application")
    8. Set wb = xls.Workbooks.Open("C:\Users\User\Desktop\Sicherungen\Formatierung2.xlsm")
    9. xls.Visible = True
    10. Application.Quit
    11. End Sub
    12. Private Sub CloseMainSheet()
    13. Application.DisplayAlerts = False
    14. Workbooks("MainSheet.xlsm").Close savechanges = no
    15. Application.DisplayAlerts = True
    16. End Sub

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „TeamBob“ ()

    Ich habe es jetzt weggelassen und die excel schließt sich zwar, aber die Benutzeroberfläche (Userform) bleibt irgendwie noch offen.
    Also die neue setzt sich darüber, aber da Sie unterschiedlich groß sind, sieht man das vorige Userform.
    Wie bekomm ich hin, dass sich das noch schließt?

    Wenn man jetzt zwischen den beiden Excel Datei wechselt, dann kommt es vor, dass das die eine Datei Schreibgeschützt geöffnet wird.?
    was meinst du mit das Userform schließen? Wenn ich einfach "Unload Userform" einbaue,
    dann schließt er ja das Userform und führt nicht mehr weitere die Funktion aus und öffnet
    eine andere Excel.

    Habe jetzt in einen Modul folgendes reingepackt:
    In den Userform rufe ich dann die Funktion LoadProduktionsdaten einfach auf.
    Es funktioniert soweit auch nur habe ich noch eine Frage:
    Es wird ja eine neue Excel geöffnet und gleich ein entsprechendes Userform. Im Hintergrund sieht
    man noch das zugehörige Excel Sheet. Wenn ich mit der Maus im Userform bin ist alles ok, aber sobald ich außerhalb des
    UserForms bin (innerhalb des Sheets), dann habe ich keinen Mauspfeil mehr, sondern das Ladesymbol, als wenn er irgendwas läd.
    Woran liegt es? kann man das Sheet ausblenden?

    Visual Basic-Quellcode

    1. Public Sub LoadProduktionsdaten()
    2. ActiveWorkbook.Save
    3. Unload frmNavigation
    4. OpenProduktionsdaten
    5. End Sub
    6. 'Schließen und öffnen einer neuen Anwendung
    7. Sub OpenProduktionsdaten()
    8. Dim xls As Application, wb As Workbook
    9. Set xls = CreateObject("Excel.Application")
    10. Set wb = xls.Workbooks.Open("C:\Users\User\Desktop\Sicherungen\Formatierung2.xlsm")
    11. xls.Visible = True
    12. Application.Quit
    13. End Sub

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „TeamBob“ ()

    Irgendwo hast du wohl ein frmNavigation.Load, das die Form lädt.
    Solange die Form geladen ist, ist jegliche Aktivität im Sheet gesperrt.
    Du musst aus der Form heraus ein Unload Me absetzen und danach geht's mit dem Code im Aufrufenden Modul weiter.
    Dort kannst du das neue Workbook öffnen und die alte Instanz zerstören.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Also ich finde den Fehler leider nicht so wirklich. Ich habe jetzt ein Navigations-Excel aus welchen ich du der jweiligen Excel Datei navigieren möchte. Wenn ich dort eine Datei auswähle, soll die sich öffnen und die NavigationsExcel sich schließen.

    In der Navigations Excel habe ich jetzt folgende Code in einen Modul geschrieben:

    Visual Basic-Quellcode

    1. Public Sub LoadProduktionsdaten()
    2. ActiveWorkbook.Save
    3. Unload frmNavigation
    4. OpenProduktionsdaten
    5. End Sub
    6. Sub OpenProduktionsdaten()
    7. Dim xls As Application, wb As Workbook
    8. Set xls = CreateObject("Excel.Application")
    9. Set wb = xls.Workbooks.Open("C:\Users\User\Desktop\Sicherungen\Formatierung2.xlsm")
    10. xls.Visible = True
    11. Application.Quit
    12. End Sub


    In einem Userform rufe ich dann durch einen Button_Click die Funktion "LoadProduktionsdaten" auf.
    Jetzt öffnen sich die neue Datei und es startet sofort eine Anwendung und ein Userform. Die alte Navigations-Excel
    ist im Hintergrund noch sichtbar. Man sieht auch einen Ladebalken wenn man mit der Maus vom Userform fährt.
    Wenn ich nun die Userform schließe, dann schließt er mir die alte Excel (Navigation):
    Was ist hier noch falsch?
    Ich lade frmNavigation.show direkt beim workbook_open in der Arbeitsmappe.
    In der nächsten Excel Datei wird die Anwendung auch bei workbook_open geladen.

    Visual Basic-Quellcode

    1. Private Sub Workbook_Open()
    2. 'Damit alles sichtbar ist
    3. With ActiveWindow
    4. .DisplayGridlines = True
    5. .DisplayHeadings = True
    6. .DisplayHorizontalScrollBar = True
    7. .DisplayWorkbookTabs = True
    8. End With
    9. Application.StatusBar = "(c) Test"
    10. frmNavigation.Show
    11. End Sub

    Dann musst du an der Stelle weitermachen.
    Ggf. Daten aus der Form an eine Globale Variable in einem Modul übergeben und dann ein Unload Me.
    Dann geht's weiter an der Stelle nach frmNavigation.Show.
    Dort musst du die Klimmzüge mit dem Öffnen des zweiten Workbooks machen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Hier der Code von der Excel Datei Navigation:
    (Wie gesagt die Excel besteht eigentlich nur aus ein Navigationsfeld. Derzeit befindet sich auch nur 1 Link zu Produktionsdaten
    darin und erst wenn dieser läuft kommen weitere Links/Verweise hinzu.
    Vielen Dank für die Hilfe

    Diese Arbeitsmappe

    Visual Basic-Quellcode

    1. Private Sub Workbook_Open()
    2. 'Damit alles sichtbar ist
    3. With ActiveWindow
    4. .DisplayGridlines = True
    5. .DisplayHeadings = True
    6. .DisplayHorizontalScrollBar = True
    7. .DisplayWorkbookTabs = True
    8. End With
    9. frmNavigation.Show
    10. End Sub


    frmNavigation

    Visual Basic-Quellcode

    1. Option Explicit
    2. Private Sub Image3_Click()
    3. LoadProduktionsdaten
    4. End Sub


    Modul1

    Visual Basic-Quellcode

    1. Public Sub LoadProduktionsdaten()
    2. ActiveWorkbook.Save
    3. Unload frmNavigation
    4. OpenProduktionsdaten
    5. End Sub
    6. 'Schließen und öffnen einer neuen Anwendung
    7. Sub OpenProduktionsdaten()
    8. Dim xls As Application, wb As Workbook
    9. Set xls = CreateObject("Excel.Application")
    10. Set wb = xls.Workbooks.Open("C:\Users\User\Desktop\Sicherungen\Formatierung2.xlsm")
    11. xls.Visible = True
    12. Application.Quit
    13. End Sub
    ThisWorkbook:

    Visual Basic-Quellcode

    1. Private Sub Workbook_Open()
    2. With ActiveWindow
    3. .DisplayGridlines = True
    4. .DisplayHeadings = True
    5. .DisplayHorizontalScrollBar = True
    6. .DisplayWorkbookTabs = True
    7. End With
    8. NextWorkbook = ""
    9. frmNavigation.Show
    10. LoadNextWorkbook
    11. End Sub

    frmNavigation:

    Visual Basic-Quellcode

    1. Private Sub Image3_Click()
    2. NextWorkbook = "C:\Users\User\Desktop\Sicherungen\Formatierung2.xlsm"
    3. Unload Me
    4. End Sub

    Modul1:

    Visual Basic-Quellcode

    1. Public NextWorkbook As String
    2. Sub LoadNextWorkbook()
    3. Dim xls As Application, wb As Workbook
    4. If NextWorkbook <> "" Then
    5. Set xls = CreateObject("Excel.Application")
    6. Set wb = xls.Workbooks.Open(NextWorkbook)
    7. xls.Visible = True
    8. Application.Quit
    9. End If
    10. End Sub

    Idee verstanden?
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --