Word & Excel Datenaustausch

  • Excel

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Pandora.

    Word & Excel Datenaustausch

    Hallo!
    Dank eurem Forum kam ich eigentlich super zurecht, doch gerade scheitere ich.

    Kurz zum Projekt:
    Ich möchte in meinem Unternehmen (bin in Gründung) eine Datenbank u.a. mit Kundennamen und einer Auflistung der für die jeweiligen Kunden geleisteten Arbeit führen.
    Eine Word Vorlage greift nun auf diese Daten zu, es ploppt n Fenster auf das die jeweiligen Kunden listet und automatisch die erbrachten Stunden in Rechnung stellt. Da ich von meinem anderen Job so ein altes Word & Excel 2003 (in denen ich kleinere Projekte durchgeführt hab), hatte ich hierfür auch auf diese 2 Programme zurückgegriffen. Ich hatte es eigentlich auch soweit dass es funktionierte.

    Jetzt wollte ich die Dateien auf dem OneDrive Laufwerk über die Cloud von verschiedenen PCs aus verwalten. Zeitweise hat es auch geklappt, nun hatte ich aber gleichzeitig das Script auch um die Funktion automatisch eine PDF als Kopie speichern erweitert...
    Kurzum ich hab 2 Dinge gleichzeitig geändert und nun geht nicht mal mehr die Initialisierung.

    Das Problem:
    Wenn Word geöffnet wird hängt es in diesem Mini-Startfenster. Lt Task Manager ist Excel geöffnet, aber es geht nicht weiter. Weder arbeitet er das Script bis zum Ende ab, noch kommt irgendwas.

    Meine Vermutung:
    • Es gibt im OneDrive Laufwerk Beschränkungen, die ein automatisches speichern unterbinden?
      • Eigentlich untypisch, da es ja bereits in der Initialisieren Sub hängt
    • Das Nachladen dauert ewig?
      • N normales öffnen ist jedoch problemlos möglich
    Weis jemand Bescheid und mag mir bei diesem Problem helfen? Bzw. kann jemand was zu meiner herangehensweise sagen? Da es ja funktioniert hatte, dacht ich es wär ok. Hier werden mir grad deutliche Grenzen aufgezeigt....

    Der Initialisieren Code:

    Visual Basic-Quellcode

    1. Dim oExcelApp As Object
    2. Dim oExcelWorkbook As Object
    3. Dim lZeile As Long
    4. MsgBox sAdressDatei 'dieses Popup kommt noch, irgendwo hiernach muss er sich aufhängen
    5. Set oExcelApp = CreateObject("Excel.Application")
    6. Set oExcelWorkbook = oExcelApp.Workbooks.Open(sAdressDatei)
    7. ListBox1.Clear
    8. lZeile = 3
    9. With oExcelWorkbook.sheets(sTabellenblatt2)
    10. Do While .Cells(lZeile, 2) <> ""
    11. ListBox1.AddItem CStr(.Cells(lZeile, 2).Value)
    12. lZeile = lZeile + 1
    13. Loop
    14. End With
    15. oExcelWorkbook.Close False
    16. oExcelApp.Quit
    17. Set oExcelWorkbook = Nothing
    18. Set oExcelApp = Nothing

    Hallo!

    Danke für die schnelle Antwort.

    Hab den Debug mit allen Variablen ausprobiert, aber es hing sich ständig auf. Dann hab ich entnervt Msgboxes mit den werten 1, 2, 3, ... hinter jede Aktion gebaut und plötzlich lief das ganze Script!!!!

    Nun hab ich die einzelnen Msgboxen durch Schleifen die je 1 Sekunde brauchen um durchzulaufen ersetzt und es lief auch. Diese hab ich nun reduziert und 2 Punkte gefunden, bei denen diese Schleifen wohl benötigt werden - es sind natürlich die Zeilen in denen die Objekte angesprochen werden.

    Visual Basic-Quellcode

    1. Set oExcelApp = CreateObject("Excel.Application")
    2. Pause (1) ' nicht wegmachen
    3. Set oExcelWorkbook = oExcelApp.Workbooks.Open(sAdressDatei)
    4. Pause (1) ' nicht wegmachen


    wobei ich diese funktion für pause im internet gefunden hab:

    Visual Basic-Quellcode

    1. Public Function Pause(NumberOfSeconds As Variant)
    2. On Error GoTo Error_GoTo
    3. Dim PauseTime As Variant
    4. Dim Start As Variant
    5. Dim Elapsed As Variant
    6. PauseTime = NumberOfSeconds
    7. Start = Timer
    8. Elapsed = 0
    9. Do While Timer < Start + PauseTime
    10. Elapsed = Elapsed + 1
    11. If Timer = 0 Then
    12. ' Crossing midnight
    13. PauseTime = PauseTime - Elapsed
    14. Start = 0
    15. Elapsed = 0
    16. End If
    17. DoEvents
    18. Loop
    19. Exit_GoTo:
    20. On Error GoTo 0
    21. Exit Function
    22. Error_GoTo:
    23. Debug.Print Err.Number, Err.Description, Erl
    24. GoTo Exit_GoTo
    25. End Function


    war gestern wohl einfach zu vollgeballert mit krams... 8|
    Vielen Dank für den Tipp!
    Sorry, wenn ich deine aufwendige Pause-Funktion etwas niedermache.
    Es geht wesentlich einfacher:
    In die erste Zeile:
    Declare Sub Sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Long)
    Und statt den Aufrufen Pause(1) (was richtigerweise eigentlich ohne Klammern als Pause 1 geschrieben werden müsste) kannst du einfach Sleep 1000 aufrufen.

    Aber vielleicht würde sogar anstatt Pause oder Sleep einfach ein DoEvents reichen?
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Hmm wollte es natürlich direkt einbauen.
    Aber er meckert grad rum.

    Da ich hier n 64bit Office laufen hab, müsse ich irgendwas am Code ändern. Komischerweise markiert er mir den "Sub" Teil deines Codes. Versteh ich nicht und darum bleib ich mal vorerst bei dem komplizierten Part.

    Da ich den Code ja auch auf versch. PCs laufen lassen möcht, also auch auf 32 bit Office Paketen, stell ich das mal ganz ans Ende meines Projekts.
    Dennoch vielen Dank für die Tipps.

    Ne Ahnung warum der dazwischen ne Pause braucht?

    Pandora schrieb:

    Ne Ahnung warum der dazwischen ne Pause braucht?
    Keine Ahnung.
    Ich hatte auch schon mit mehreren Office-Verschachtelungen gearbeitet und nie Probleme.

    Hast du's mal mit einem einfachen DoEvents anstatt der Pause versucht?


    Win64:
    Ja, da hat sich MS wirklich selbst übertroffen.
    Um externe Deklarationen kompatibel zu halten, wird Conditional Compiling benötigt:

    Visual Basic-Quellcode

    1. ​#if VBA7 then
    2. Declare PtrSafe Sub Sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Long)
    3. #else
    4. Declare Sub Sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Long)
    5. #end if

    Die ganze Wahrheit kannst du hier nachlesen, falls du es mal benötigst:
    msdn.microsoft.com/en-us/libra…e691831(v=office.14).aspx
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --