Tool | Problem beim öffnen und speichern | Excel

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von n33d.

    Tool | Problem beim öffnen und speichern | Excel

    Hallo Leute,
    ich versuche im Moment ein Tool zu entwickeln, welches unteranderem auch Daten aus Excel-Tabellen benötigt.

    VB.NET-Quellcode

    1. Private Sub ExcelAuslesen()
    2. MaterialTable.application.workbooks.Open(root & "\" & ComboBox1.SelectedItem.ToString & "\" & MaterialLabel.Text & "_Daten.xlsx")
    3. MaterialTable.Visible = False 'False die Tabelle wird im Hintergrung geöffnet.
    4. MaterialTable.application.sheets(1).Activate()
    5. MaterialTable.Range("A1").Select()
    6. ...
    7. '-------------------Median und Summe auslesen----------------------------------------------------------------------------------
    8. MedianLabel.Text = MaterialTable.Range("C" & intZähler).Value() 'schreiben des ausgelesenen Median Werts
    9. SummenLabel.Text = MaterialTable.Range("D" & intZähler).Value() 'schreiben des ausgelesenen Median Werts
    10. '---------------------------------------------------------------------------------------------------------------------------------------
    11. End Sub



    Das reine auslesen funktioniert ohne Probleme!
    Ich habe allerdings das Problem, dass gleichzeitig eine weitere Tabelle geöffnet werden soll in die gewisse Daten abgelegt werden sollen [nur Strings und Integer]. Die Datei soll bei jedem öffnen weiter geschrieben werden und dürfen sich nicht überschreiben.
    Des Weiteren will ich möglichst ohne extra Importes arbeiten.

    Mein erster Gedanke:

    VB.NET-Quellcode

    1. Imports Microsoft.Office.Interop
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. Dim xlApp As Excel.Application
    4. Dim xlBook As Excel.Workbook
    5. Dim xlSheet As Excel.Worksheet
    6. xlApp = New Excel.Application
    7. xlBook = xlApp.Workbooks.Add
    8. xlSheet = xlBook.Worksheets.Add
    9. xlApp.Application.Workbooks.Open("C:\Users\***\Desktop\test\testtabelle.xlsx")
    10. xlSheet.Cells(1, "a") = "Test1"
    11. xlSheet.Cells(2, "a") = "Test2"
    12. xlSheet.Cells(3, "a") = "Test3"
    13. xlBook.Close(SaveChanges:=True)
    14. xlApp.Quit()
    15. End Sub


    Bitte um Hilfe.
    Wie kann ich es das Excel File öffnen und etwas in es schreiben und es dann speichern...

    Danke :thumbsup:
    Hi, so kannsts z.B. machen:

    Quellcode

    1. Imports Microsoft.Office.Interop
    2. Public Class Form1
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. Dim oXL As Excel.Application
    5. Dim oWB As Excel.Workbook
    6. Dim oSheet As Excel.Worksheet
    7. ' Start Excel and get Application object.
    8. oXL = CreateObject("Excel.Application")
    9. oXL.Visible = True
    10. oWB = oXL.Workbooks.Add() 'Hier den kompletten Pfad und Dateiname + Endung deiner Datei eingeben.
    11. oSheet = oWB.ActiveSheet
    12. oSheet.Cells(4, 2).Value = TextBox1.Text
    13. oWB.Close(SaveChanges:=1)
    14. oXL.Quit()
    15. End Sub
    16. End Class

    VriL schrieb:

    oXL = CreateObject("Excel.Application")

    Vorsicht: Das ist Late Binding und damit nicht "Strict On"-fähig.

    n33d schrieb:

    xlApp.Application.Workbooks.Open("C:\Users\***\Desktop\test\testtabelle.xlsx")
    xlSheet.Cells(1, "a") = "Test1"
    War schon fast der richige Ansatz.

    Visual Basic-Quellcode

    1. ​xlBook=xlApp.Application.Workbooks.Open("C:\Users\***\Desktop\test\testtabelle.xlsx"
    2. xlSheet=xlBook.Sheets(1)
    3. xlSheet.Cells(1, "a").Value = "Test1"

    Evtl musst du noch typecasten.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim xlAppB As Object
    3. Dim g As Double
    4. Dim xlBookB As Object
    5. Dim Vorhanden As Boolean = True
    6. Dim path As String = "C:\Users\****\Desktop\test"
    7. xlAppB = CreateObject("Excel.Application")
    8. If My.Computer.FileSystem.FileExists(path & "\testtabelle.xlsx") Then
    9. Vorhanden = True
    10. Else
    11. Vorhanden = False
    12. End If
    13. If Vorhanden = True Then
    14. xlAppB.application.workbooks.Open(path & "\testtabelle.xlsx")
    15. xlAppB.Visible = False
    16. xlBookB = xlAppB.Workbooks.Add
    17. Else
    18. xlAppB.Visible = False
    19. xlBookB = xlAppB.Workbooks.Add
    20. xlBookB.SaveAs(path & "\testtabelle.xlsx")
    21. End If
    22. For g = 1 To 200
    23. xlBookB.Worksheets(1).Cells(1, g) = g
    24. Next g
    25. xlBookB.Worksheets(1).Cells(1, 1) = "test"
    26. Label1.Text = "Geschrieben"
    27. 'If Not xlBookB.Saved Then
    28. ' MsgBox("This workbook contains unsaved changes.")
    29. 'End If
    30. xlBookB.SaveAs(path & "\test2tabelle.xlsx")
    31. xlAppB.Quit()
    32. My.Computer.FileSystem.DeleteFile(path & "\testtabelle.xlsx")
    33. My.Computer.FileSystem.RenameFile(path & "\test2tabelle.xlsx", "testtabelle.xlsx")
    34. Label1.Text = "Der GEHT"
    35. End Sub


    Mein Problem is das Speichern! Die Scheiße speichert sich immer irgendwo weil es die alte Datei nicht überschreiben kann.
    Mit dem oben gezeigten Code kann ich es umgehen, allerdings kann es vorkommen, dass die dateien von anderen prozessen genutzt werden und damit sind

    VB.NET-Quellcode

    1. My.Computer.FileSystem.DeleteFile(path & "\testtabelle.xlsx")
    2. My.Computer.FileSystem.RenameFile(path & "\test2tabelle.xlsx", "testtabelle.xlsx")

    nicht umsetzbar.

    VB.NET-Quellcode

    1. xlBookB.Save()

    Hat nicht zuverlässig funktioniert.

    VB.NET-Quellcode

    1. xlBookB.Close(SaveChanges:=True)

    Ebenfalls nicht. [evt. DefaultFilePath = "C:\Users\****\Documents"]

    Die Datei muss immer weiter geschrieben werden können, daher ist es unverzichtbar den Dateinamen beizubehalten.

    Danke für die Antworten



    speichern geht jetzt! Ich musste den Pfad ändern.

    VB.NET-Quellcode

    1. xlAppB.Application.DefaultFilePath = path


    Der Name des Files passt manchmal nicht.
    Mappe1.xlsx Wie kann ich das ändern?

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

    Leider funktioniert das Laden der Tabelle auch nicht. Es wird immer nur eine neu erstellt.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. 'Imports Microsoft.Office.Interop.Excel
    2. Imports Microsoft.Office.Interop
    3. Public Class Form1
    4. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    5. Dim xlAppB As Object
    6. Dim g As Double
    7. Dim xlBookB As Object
    8. Dim Vorhanden As Boolean = True
    9. Dim path As String = "C:\Users\*****\Desktop\test"
    10. xlAppB = CreateObject("Excel.Application")
    11. If My.Computer.FileSystem.FileExists(path & "\testtabelle.xlsx") Then
    12. Vorhanden = True
    13. Else
    14. Vorhanden = False
    15. End If
    16. If Vorhanden = True Then
    17. xlBookB = xlAppB.application.workbooks.Open(path & "\testtabelle.xlsx")
    18. xlAppB.Visible = False
    19. Else
    20. xlAppB.Visible = False
    21. xlBookB = xlAppB.Workbooks.Add
    22. xlBookB.SaveAs(path & "\testtabelle.xlsx")
    23. End If
    24. For g = 1 To 200
    25. xlBookB.Worksheets(1).Cells(1, g) = g
    26. Next g
    27. xlBookB.Worksheets(1).Cells(1, 1) = "test"
    28. Label1.Text = "Geschrieben"
    29. 'If Not xlBookB.Saved Then
    30. ' MsgBox("This workbook contains unsaved changes.")
    31. 'End If
    32. Dim i As Integer
    33. Dim intZähler As Integer
    34. Dim Such_Server As String
    35. For i = 1 To 5000 Step 1 'wird bis max. zeile 5000 durchsucht
    36. Such_Server = xlBookB.Worksheets(1).Cells(i.ToString, 1).Value
    37. 'Such_Server = xlAppB.Range("A" & i.ToString).Value() 'Zuweisung der ZellValue
    38. intZähler = intZähler + 1
    39. If "" = Such_Server Then
    40. i = 5000 '5000 um die Schleife zu verlassen
    41. End If
    42. Next
    43. xlBookB.Worksheets(1).Cells(intZähler, 1) = "test"
    44. xlAppB.Application.DefaultFilePath = path
    45. xlBookB.Save()
    46. 'xlBookB.Close(SaveChanges:=1)
    47. xlBookB.Close()
    48. xlAppB.Quit()
    49. Label1.Text = "Fertig"
    50. End Sub
    51. End Class


    Zusätzliche Informationen: 'testtabelle.xlsx' ist schreibgeschützt. Um eine Kopie zu speichern, klicken Sie auf 'OK'. Geben Sie der Arbeitsmappe im Dialog 'Speichern unter' einen neuen Namen.

    Ich habe die Tabelle nie geschützt. Wie kann ich sie schleißen um sie zu speichern?

    Benötige Hilfe bei:
    • Namengebung beim speichern.
    • ....
    Danke

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

    n33d schrieb:

    VB.NET-Quellcode

    1. If My.Computer.FileSystem.FileExists(path & "\testtabelle.xlsx") Then
    2. Vorhanden = True
    3. Else
    4. Vorhanden = False
    5. End If
    Das schreibst Du so als logischen Ausdruck und kannst gleich die Attribute richten, falls nötig:

    VB.NET-Quellcode

    1. Dim fi = New IO.FileInfo(path & "\testtabelle.xlsx")
    2. Vorhanden = fi.Exists
    3. If Vorhanden Then
    4. If fi.Attributes.HasFlag(IO.FileAttributes.ReadOnly) Then
    5. fi.Attributes = fi.Attributes And Not IO.FileAttributes.ReadOnly
    6. End If
    7. End If
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Quellcode

    1. ReadOnly
    ? Ich will was schreiben. Das sind nur Schönheitsfehler, die man beheben kann wenn alles geht. ^^
    Mein Problem ist, dass ich die Originaldatei nicht Speichern kann sondern immer nur eine neue Datei erstellt werden kann.

    Ich will nicht einfach alle Prozesse killen und dann die alte Datei löschen und die neue Umbenennen.

    VB.NET-Quellcode

    1. For Each prozess As Process In Process.GetProcessesByName("EXCEL")
    2. If prozess.MainWindowHandle = 0 Then prozess.Kill()
    3. Next
    4. My.Computer.FileSystem.DeleteFile(path & "\testtabelle.xlsx")
    5. My.Computer.FileSystem.RenameFile(path & "\test2tabelle.xlsx", "testtabelle.xlsx")

    Mein Programm muss ALLE daten in ein Tabelle schreiben.

    Bitte helft mir eine andere lösung zu finden.
    Die mit dem Kill is sooooo scheiße!

    Danke

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

    Mach ich doch nicht!
    Nur wenn die Tabelle nicht vorhanden ist.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. If Vorhanden = True Then
    2. xlBookB = xlAppB.application.workbooks.Open(path & "\testtabelle.xlsx", , True)
    3. xlAppB.Visible = False
    4. Else
    5. xlAppB.Visible = False
    6. xlBookB = xlAppB.Workbooks.Add
    7. xlBookB.SaveAs(path & "\testtabelle.xlsx")
    8. End If


    Des Oben is komplett veraltet des war nur mal ne erste Idee mit vielen Fehlern!

    Bitte versucht mir bei meinem Problem zu helfen. :) Mein ein einziges Problem is im Moment, dass ich die absolute Deppenlösung verwende.
    Bitte helft mir die Holzhammermethode in was schöneres zu verwandeln. Also ist NUR das Speicher das Problem.

    Holzhammermethode:

    VB.NET-Quellcode

    1. For Each prozess As Process In Process.GetProcessesByName("EXCEL")
    2. If prozess.MainWindowHandle = 0 Then prozess.Kill()
    3. Next
    4. My.Computer.FileSystem.DeleteFile(path & "\testtabelle.xlsx")
    5. My.Computer.FileSystem.RenameFile(path & "\test2tabelle.xlsx", "testtabelle.xlsx")



    Danke
    (wenn ich dein Problem richtig verstanden habe)

    Sorry hast leider nicht ich will einfach nur das geöffnete Excel unter dem selben Namen im selben Ordener speichern.

    Was ich in die Tabellen speichere spielt ja keine Rolle. Es sind lediglich strings oder integer.

    sonst nichts! Das sind doch Basics?! ;(

    Ich muss die Daten nur bei jedem ProgrammStart weiter schreiben können.

    Danke


    Spoiler anzeigen

    Antwort eines MicrosoftMitarbeiters:
    Hi,

    You can use
    Workbook.Save Method (Excel).

    I have tested in Excel 2007, it will not display any prompts.

    VB.NET-Quellcode

    1. Sub testSave()
    2. Range("A1") = "test"
    3. ActiveWorkbook.Save
    4. End Sub

    The first time you save a workbook, use the SaveAs method to specify a name for the file.

    Hope this helps.


    Warum zum Teufel geht die Scheiße nicht?
    msdn.microsoft.com/en-us/libra…f197585(v=office.15).aspx




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

    n33d schrieb:

    ich will einfach nur das geöffnete Excel unter dem selben Namen im selben Ordener speichern.

    Das geht ganz einfach mit Workbook.Save.
    Dein Problem ist, dass du nicht mit dem Original, sondern mit einem neu hinzugefügten Workbook arbeitest.
    Sobald du die Excel-Application abschießt, killst du dich selbst, weil beide Workbooks in derselben Anwendung offen sind.
    Wenn du schon blödsinnigerweise die Kopie speichern willst, dann schließ einfach das Original.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    OH DANKE!! ^^
    Ich weiß doch was ich mach. Ich kann das Original nicht direckt speichern!
    Das bugt wie Scheiße!!!!

    Schleißen dann Speichern geht?

    Aber mit dem normalen code so wie oben geschrieben gehts!

    Ich muss dir recht geben es ist verdammt umständlich.

    Danke für die Antworten.

    Falls möglich würde ich gerne eine elegantere Speichermethode haben. (ohne Umwege nur mit .save() )

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