Absturz beim Selektieren der Spalten einer Word Tabelle | Access <--> Word

  • Access

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    Absturz beim Selektieren der Spalten einer Word Tabelle | Access <--> Word

    Hallo Zusammen,

    vielleicht könnte mir Jemand von Euch weiterhelfen.

    Ich habe aktuell die folgende Problematik. Ich erstelle über VBA ein Word Dokument aus einem Template und fülle dieses mit Inhalt.

    Meiner Methode übergebe ich das aus dem Template erstellte Dokument und möchte das Dokument nach Abschluss der Bearbeitung auf einem Netzwerkpfad speichern.

    Den groben Aufbau der Methoden seht Ihr unten. Ich habe ein paar der Variablen und für die Darstellung des Problems irrelevanten Codezeilen entfernt.

    Aufruf der Export-Methode

    Visual Basic-Quellcode

    1. Set app = New Word.Application
    2. If app Nothing Then
    3. ....
    4. Exit Function
    5. End If
    6. Set document = app.Documents.Add(Template:=Template, NewTemplate:=False, DocumentType:=0)
    7. Dim settings As settings
    8. settings = exportWord (document,...)


    Export Methode

    Visual Basic-Quellcode

    1. Private Function exportWord (oDoc As Word.Document, ...) As settings
    2. On Error GoTo Err_WordExport
    3. Dim sets As settings
    4. With sets
    5. .export = False
    6. End With
    7. exportWord = sets
    8. Dim objRange As Word.Range
    9. Dim objTable As Word.Table
    10. With oDoc
    11. Set objRange = .Bookmarks("tbl").Range
    12. .Tables.Add objRange, positionen.Count + 1, 6
    13. Set objTable = .Bookmarks("tbl").Range.Tables(1)
    14. End With
    15. With objTable
    16. With .Rows(1)
    17. .Cells(1).Range.Text = ""
    18. .Cells(2).Range.Text = ""
    19. .Cells(3).Range.Text = ""
    20. .Cells(4).Range.Text = ""
    21. .Cells(5).Range.Text = ""
    22. .Cells(6).Range.Text = ""
    23. .Cells(1).Range.Font.Bold = True
    24. .Cells(2).Range.Font.Bold = True
    25. .Cells(3).Range.Font.Bold = True
    26. .Cells(4).Range.Font.Bold = True
    27. .Cells(5).Range.Font.Bold = True
    28. .Cells(6).Range.Font.Bold = True
    29. End With
    30. End With
    31. Dim i As Long
    32. i = 2
    33. For Each ItemPos In Positionen
    34. 'Füllen des Inhaltes....
    35. Next ItemPos
    36. With objTable.Rows(1).Borders(wdBorderBottom)
    37. .Visible = True
    38. .LineStyle = wdLineStyleDouble
    39. End With
    40. objTable.Columns(4).Select
    41. Selection.ParagraphFormat.Alignment = wdAlignParagraphRight
    42. objTable.Columns(5).Select
    43. Selection.ParagraphFormat.Alignment = wdAlignParagraphRight
    44. objTable.Columns(6).Select
    45. Selection.ParagraphFormat.Alignment = wdAlignParagraphRight
    46. objTable.Columns.AutoFit
    47. oDoc.SaveAs2 pathToSave
    48. With sets
    49. .export = True
    50. .PathToFile = pathToSave
    51. End With
    52. exportWord = sets
    53. Set objTable = Nothing
    54. End Function


    Der erste Durchlauf klappt auch noch ohne Probleme. Sobald man das Ganze nochmal ausführt stürzt er beim Selektieren der Spalten ab.
    Im Taskmanager habe ich mal geprüft, ob noch Word Prozesse laufen, welche den Zugriff blockieren, allerdings ist das nicht der Fall.

    Die einzige Vermutung, welche ich noch habe, ist, dass das Ganze im Zusammenhang mit der Instanz der Word.Application zusammenhängt.

    Hättet Ihr noch eine Idee für mich, da ich langsam ein wenig verzweifel ||

    Vielen Dank

    Gruß
    DerFr0sch :thumbup:

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

    Willkommen im Forum.

    Wenn Du die Word-Instanz in Verdacht hast, warum sorgst Du nicht dafür, dass sie nur einmal instanziiert wird? Ich weiß zwar nicht, wie man in Access-VBA eine Variable global macht, aber das ungeprüfte Erstellen der Word-Instanz ließe sich eben so verhindern. Also app global machen und dann eben so ungefähr: If app Is Nothing Then Set app = New Word.Application
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Vollzitat des direkten Vorposts an dieser Stelle entfernt ~VaporiZed

    Hi,

    erstmal lieben Dank für die Begrüßung und Deine Antwort.

    Das ist das merkwürdige an der Geschichte.

    Wenn ich das Ganze so prüfe, dann bekomme ich zwar als Resultat, dass die Word Instanz bereits am laufen ist, aber sobald damit versucht wird weiter zu arbeiten laufe ich in den nächsten Fehler.
    Dann bekomme ich den Fehler, dass der Remote-Server-Computer nicht existiert oder nicht verfügbar (Fehler 462) ist.

    €dit: Es wirkt fast so als würde hier irgendetwas nicht richtig aufgeräumt werden.
    Da ich den gleichen Fehler erhalte, bei der Selektion der Spalten erhalte. Allerdings setze ich alles nach Beendigung auf Nothing und eigentlich würde ich gerne das Word Dokument offen haben, nach Abschluss.


    Gruß
    DerFr0sch :thumbup:

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „DerFr0sch“ ()

    Ganz kurz:

    VB.NET-Quellcode

    1. objTable.Columns(4).Select
    2. Selection.ParagraphFormat.Alignment = wdAlignParagraphRight

    Selection ist hier (und an anderen Stellen) aber ggf. implizit für die Access-Selection, nicht für die Word-Selection. Gib da mal den Wordbezug noch mit. Nicht, dass es an sowas liegt.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    In deinem Fall so:

    Visual Basic-Quellcode

    1. objTable.Columns(4).Select
    2. app.Selection.ParagraphFormat.Alignment = wdAlignParagraphRight


    Ich persönlich würde .Select vermeiden, das macht meistens nur Probleme.
    Das bedeutet in deinem Fall aber eine kleine Codeumstellung.
    1. Tabelle nur mit einer Zeile einfügen
    2. Spaltenausrichtung zuweisen
    3. Beim Befüllen immer eine neue Zeile einfügen
    4. Zeile 1 Rahmen- und Textformat zuweisen
    Beispiel

    Visual Basic-Quellcode

    1. Option Explicit
    2. Dim app As Word.Application
    3. Dim Document As Word.Document
    4. Const Template As String = "C:\Temp\Test.dotx"
    5. Sub start()
    6. Set app = New Word.Application
    7. app.Visible = True
    8. If app Is Nothing Then
    9. Exit Sub
    10. End If
    11. Set Document = app.Documents.Add(Template:=Template, NewTemplate:=False, DocumentType:=0)
    12. exportWord Document
    13. End Sub
    14. Private Sub exportWord(oDoc As Word.Document)
    15. Dim Positionen(8) As Variant
    16. Dim Item(5) As Variant
    17. Dim ItemPos As Variant
    18. Item(0) = 1
    19. Item(1) = 22
    20. Item(2) = 333
    21. Item(3) = 4444
    22. Item(4) = 55555
    23. Item(5) = 666666
    24. Positionen(0) = Item
    25. Positionen(1) = Item
    26. Positionen(2) = Item
    27. Positionen(3) = Item
    28. Positionen(4) = Item
    29. Positionen(5) = Item
    30. Positionen(6) = Item
    31. Positionen(7) = Item
    32. Positionen(8) = Item
    33. Dim objTable As Word.Table
    34. Set objTable = oDoc.Tables.Add(oDoc.Bookmarks("tbl").Range, 1, 6)
    35. With objTable.Rows(1)
    36. .Cells(1).Range.Text = "a"
    37. .Cells(2).Range.Text = "b"
    38. .Cells(3).Range.Text = "c"
    39. .Cells(4).Range.Text = "d"
    40. .Cells(5).Range.Text = "e"
    41. .Cells(6).Range.Text = "f"
    42. .Cells(4).Range.ParagraphFormat.Alignment = wdAlignParagraphRight
    43. .Cells(5).Range.ParagraphFormat.Alignment = wdAlignParagraphRight
    44. .Cells(6).Range.ParagraphFormat.Alignment = wdAlignParagraphRight
    45. End With
    46. Dim r As Word.Row
    47. For Each ItemPos In Positionen
    48. Set r = objTable.Rows.Add
    49. 'Füllen des Inhaltes....
    50. r.Cells(1).Range.Text = ItemPos(0)
    51. r.Cells(2).Range.Text = ItemPos(1)
    52. r.Cells(3).Range.Text = ItemPos(2)
    53. r.Cells(4).Range.Text = ItemPos(3)
    54. r.Cells(5).Range.Text = ItemPos(4)
    55. r.Cells(6).Range.Text = ItemPos(5)
    56. Next ItemPos
    57. With objTable.Rows(1)
    58. .Borders(wdBorderBottom).Visible = True
    59. .Borders(wdBorderBottom).LineStyle = wdLineStyleDouble
    60. .Cells(1).Range.Font.Bold = True
    61. .Cells(2).Range.Font.Bold = True
    62. .Cells(3).Range.Font.Bold = True
    63. .Cells(4).Range.Font.Bold = True
    64. .Cells(5).Range.Font.Bold = True
    65. .Cells(6).Range.Font.Bold = True
    66. End With
    67. objTable.Columns.AutoFit
    68. Set objTable = Nothing
    69. End Sub
    Hi,

    auch Dir vielen Dank für die nette Antwort!

    Ich habe meinen Code angepasst, leider greift das Right Alignment nur für die erste Zeile.

    In deinem Beispiel waren jedoch trotzdem praktische Tipps, wie ich meinen Code noch etwas schöner machen konnte, diese habe ich natürlich gerne übernommen :)

    Bei Spalte 4-6 handelt es sich nämlich um Zahlen im Währungsformat, weswegen ich diese gerne rechtsbündig haben würde.

    Danke

    €dit: Ich habe das ganze nochmal über die Word-Selection gerade ausprobiert und siehe da, ich bekomme keinen Fehler mehr :)
    Gruß
    DerFr0sch :thumbup:

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

    HenryV schrieb:

    Dim app As Word.Application
    Dim Document As Word.Document
    Const Template As String = "C:\Temp\Test.dotx"
    Sub start()
    Set app = New Word.Application
    app.Visible = True

    If app Is Nothing Then
    Exit Sub
    End If

    Set Document = app.Documents.Add(Template:=Template, NewTemplate:=False, DocumentType:=0)
    exportWord Document
    End Sub

    Ich mach das immer so

    Visual Basic-Quellcode

    1. Private WordApp_ As Word.Application
    2. Dim Document As Word.Document
    3. Const Template As String = "C:\Temp\Test.dotx"
    4. Property Get WordApp As Word.Application
    5. If WordApp_ Is Nothing Then
    6. Set WordApp_ = New Word.Application
    7. WordApp_.Visible = True
    8. End If
    9. Set WordApp = WordApp_
    10. End Property
    11. Sub Start
    12. Set Document = WordApp.Documents.Add(Template:=Template, NewTemplate:=False, DocumentType:=0)
    13. ' ...
    14. End Sub

    Die WordApp kann beliebig oft aufgerufen werden, wird aber nur einmal instanziiert.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --