2 Excel zusammenfügen / Merge Kopfzeile soll verschwinden

  • VB.NET

Es gibt 40 Antworten in diesem Thema. Der letzte Beitrag () ist von Engelchen.

    Neu

    Hast Du geprüft, ob vor dem Paste die richtige Zielstelle angewählt wurde? Ggf. musst Du vorher noch ein wk2.Sheets(1).Activate ausführen. Ist zwar m.E. nicht für Hintergrundausführung geeignet, aber zur Optimierung können sicherlich z.B. @petaod oder @mumpel was sagen.
    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.

    Neu

    Nuja, da bei mir der Code funktioniert, musst Du wohl schauen, wo bei Dir der Fehler Unterschied ist.

    Visual Basic-Quellcode

    1. MyExcel.Visible = True
    2. Dim wk1, wk2 As Workbook
    3. Dim row1, row2 As Integer
    4. Dim path1, path2 As String
    5. path1 = "\\Liste1.xlsx"
    6. path2 = "\\Liste2.xlsx"
    7. wk1 = MyExcel.Workbooks.Open(path1)
    8. wk2 = MyExcel.Workbooks.Open(path2)
    9. MyExcel.Visible = True
    10. row1 = wk1.Sheets(1).Cells(wk1.Sheets(1).Rows.Count, 1).End(-4162).Row
    11. row2 = wk2.Sheets(1).Cells(wk2.Sheets(1).Rows.Count, 1).End(-4162).Row + 1
    12. wk1.Sheets(1).Rows("2:" & row1).Copy
    13. wk2.Sheets(1).Activate
    14. wk2.Sheets(1).Cells(row2, 1).Select
    15. wk2.Sheets(1).Paste
    16. MyExcel.CutCopyMode = False

    Vielleicht falsche Reihenfolge mit Activate und Cells(x, y).Select?
    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.

    Neu

    WIe kriege ich das MyExcel gesichert im Pfad xy?

    MyExcel.SaveAs steht der öffentliche Member SaveAs für den Typ ApplicationCLass wurde nicht gefunden

    wk2.SaveAs("Liste1undListe2.xlsx") haben es getan.


    Eine Frage hätte ich noch:

    MyExcel.SaveAs("\Liste1undListe2_nachDerMakro_" + StartDatum + "_" + EndDatum + ".xlsx")
    Passt das so?



    <Insert funny signature here>

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

    Neu

    Vollzitat eines Vorposts durch Anredefunktion ersetzt ~VaporiZed
    @VaporiZed

    Irgendwie kopiert er mir nur da einen Teil von dem ganzen und zwar geht er mitten drin rein und kopiert mir das bis zum Ende, weißt du was ich meine?

    Er kopiert mir nicht das gesamte Dokument sondern nur einen Teil.
    Wie muss ich denn das einstellen, sodass er mir ab Zeile 2 alles kopiert?


    Es geht mir um den Code hier, der kopiert da nicht alles anscheinend, wonach muss ich auf Google suchen, dass das klappt?

    VB.NET-Quellcode

    1. row1 = wk1.Sheets(1).Cells(wk1.Sheets(1).Rows.Count, 1).End(-4162).Row
    2. row2 = wk2.Sheets(1).Cells(wk2.Sheets(1).Rows.Count, 1).End(-4162).Row + 1
    3. wk2.Sheets(1).Rows("2:" & row1).Copy
    4. wk1.Sheets(1).Activate
    5. wk1.Sheets(1).Cells(row2, 1).Select
    6. wk1.Sheets(1).Paste
    7. MyExcel.CutCopyMode = False


    CodeTags korrigiert ~VaporiZed
    <Insert funny signature here>

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

    Neu

    VB.NET-Quellcode

    1. Dim Row1 = wk1.Sheets(1).Cells(wk1.Sheets(1).Rows.Count, 1).End(-4162).Row
    2. Dim Row2 = wk2.Sheets(1).Cells(wk2.Sheets(1).Rows.Count, 1).End(-4162).Row + 1
    3. Dim Rng1 = Intersect(wk1.UsedRange, wk1.Sheets(1).Range("2:" & Row1))
    4. Dim Rng2 = wk2.Sheets(1).Range("A" & Row2).ReSize(Rng1.Rows.Count, Rng1.Columns.Count)
    5. Rng2.Value = Rng1.Value
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

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

    Neu

    Engelchen schrieb:

    soll ich das löschen?
    und was heißt intersect? das hab ich gar nicht deklariert.

    Stimmt Doppelt deklarieren brauchst du nicht.
    Entweder unten das Dim entfernen oder oben die Zeile ​Dim row1, row2 As Integer löschen.
    Intersect kannst du durch MyExcel.Intersect ersetzen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Neu

    System.MissingMemberException: "Der öffentliche Member UsedRange für den Typ Workbook wurde nicht gefunden."

    Kommt bei MyExcel.Intersect


    VB.NET-Quellcode

    1. Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
    2. Dim MyExcel As New Microsoft.Office.Interop.Excel.Application
    3. MyExcel.Visible = True
    4. Dim wk1, wk2 As Workbook
    5. ' Dim row1, row2 As Integer
    6. Dim path1, path2 As String
    7. path1 = "\Liste1.xlsx"
    8. path2 = "\Liste2.xlsx"
    9. wk1 = MyExcel.Workbooks.Open(path1)
    10. wk2 = MyExcel.Workbooks.Open(path2)
    11. wk2.Unprotect()
    12. ' Row1 = wk1.Sheets(1).Cells(wk1.Sheets(1).Rows.Count, 1).End(-4162).Row
    13. 'Row2 = wk2.Sheets(1).Cells(wk2.Sheets(1).Rows.Count, 1).End(-4162).Row + 1
    14. Dim Row1 = wk1.Sheets(1).Cells(wk1.Sheets(1).Rows.Count, 1).End(-4162).Row
    15. Dim Row2 = wk2.Sheets(1).Cells(wk2.Sheets(1).Rows.Count, 1).End(-4162).Row + 1
    16. Dim Rng1 = MyExcel.Intersect(wk1.UsedRange, wk1.Sheets(1).Range("2:" & Row1))
    17. Dim Rng2 = wk2.Sheets(1).Range("A" & Row2).ReSize(Rng1.Rows.Count, Rng1.Columns.Count)
    18. Rng2.Value = Rng1.Value
    19. wk1.SaveAs("\\A_B_C_StartJJJJMMTT_EndJJJJMMTT.xlsx")
    20. MyExcel.Workbooks.Open("\\A_B_C_StartJJJJMMTT_EndJJJJMMTT.xlsx")
    21. MyExcel.Visible = True
    22. Dim StartDatum As String
    23. Dim EndDatum As String
    24. StartDatum = InputBox("Start-Datum:", "Eingabe", Format(Now, "YYYYMMDD"))
    25. EndDatum = InputBox("End-Datum:", "Eingabe", Format(Now, "YYYYMMDD"))
    26. MyExcel.Range("D:D").Replace(("Startdatum im Format JJJJMMTT"), StartDatum)
    27. MyExcel.Range("E:E").Replace(("Enddatum im Format JJJJMMTT"), EndDatum)
    28. MyExcel.Range("F:F").Replace(("_*"), "")
    29. Dim loLetzte As Long
    30. With MyExcel.Worksheets("Sheet1")
    31. loLetzte = .Cells(.Rows.Count, "A").End(-4162).Row
    32. If MyExcel.WorksheetFunction.CountBlank(.Range("H2:H" & loLetzte)) > 0 Then
    33. .Range("H2:H" & loLetzte).SpecialCells(4) = 0
    34. End If
    35. End With
    36. MyExcel.Range("A:AZ").Replace(("Keine Eintragung..."), "")
    37. MyExcel.Range("A:AZ").Replace(("Keine Ei"), "")
    38. MyExcel.SaveAs("\A_B_C_" + StartDatum + "_" + EndDatum + ".xlsx") 'funktioniert nicht
    39. End Sub
    40. End Class


    Das ist bisher mein Code.
    <Insert funny signature here>

    Neu

    Engelchen schrieb:

    wk1.UsedRange
    wk1.Sheets(1).UsedRange
    Bei deiner Art zu adressieren kann man da schon mal durcheinander kommen.
    Aber wenn du versuchst, das Objektmodell zu verstehen, sollte das offensichtlich sein, welche Property in welchem Objekt enthalten ist.
    Ich schreibe das alles aus dem Kopf und will eigentlich nur Ansatzpunkte liefern, da kann so was schon mal durchgehen.
    Sorry.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Neu

    Sieht gut aus!
    Schick, danke.

    Ach, das passt schon alles. Ich bin dir überaus dankbar, dass du mir voran hilfst.


    MyExcel.SaveAs("\\A_B_C_" + StartDatum + "_" + EndDatum + ".xlsx")
    Funktioniert leider nicht so wie beim Java, was macht man da am Besten?
    <Insert funny signature here>

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

    Neu

    Engelchen schrieb:

    MyExcel.SaveAs("\\A_B_C_" + StartDatum + "_" + EndDatum + ".xlsx")
    SaveAs sollte man in deinem Fall auf das Workbook anwenden.

    VB.NET-Quellcode

    1. wk2.SaveAs($"\A_B_C_{StartDatum}_{EndeDatum}.xlsx")


    Für die Eingabe von Start- und EndeDatum würde ich keine InputBox nehmen, sondern einen DateTimePicker und dann dessen Ergebnis mit ToString in einen String verwandeln.
    Sonst hast du am Ende alles mögliche drin stehen, nur kein Datum.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Neu

    Heißt das, dass es auch darauf ankommt statt MyExcel ein wk2 ERsatz zu finden?
    Weil er ersetzt mir nämlich nichts bei

    VB.NET-Quellcode

    1. MyExcel.Range("F:F").Replace(("_*"), "")


    Korreliert das irgendwo? und muss ich da ein neues Sub einfügen?


    DateTimePicker


    Wie mache ich das? Soweit ich weiß braucht man dafür ein Add-On? Das stimmt aber nicht oder?

    Habe gerade gesehen, dass das doch irgendwie geht.
    Allerdings steht dort ich müsste eine neu Classe und ein neues Sub einfügen, kann ich das einfachso machen innerhalb meines Codes und wenn ja wie macht man das?

    <Insert funny signature here>

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

    Neu

    Versuche, das Excel-Objektmodell zu verstehen.
    MyExcel ist die Application
    Eine Application hat Workbooks geöffnet
    wk2 ist bei dir das Workbook
    Darin hat es Sheets
    und in den Sheets hat es Ranges.

    Speichern willst du das Workbook und nicht die Anwendung (obwohl die Anwendung dummerweise das gerade aktive Workbook als Default verwendet und es unter bestimmten Voraussetzungen deshalb sogar funktionieren könnte).

    Deine Adressierung über die Application
    MyExcel.Range("A:AZ").Replace(("Keine Eintragung..."), "")
    ist ungesund und bezieht sich auf das zufällig aktive Arbeitsblatt.
    Adressiere die Objekte nach der tatsächlichen Hierarchie.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Neu

    Ich habe eine Frage, wenn ich jetzt um den Dreh rum, das selbst machen würde - also ich würde es mit wk3 machen wo der Pfad spezifiziert wird.
    Wie soll ich dann das machen?

    Hab jetzt wk3 klassifiziert, deklariert, den Pfad angegeben und das so gemacht, was muss noch geändert werden?


    VB.NET-Quellcode

    1. wk3 = MyExcel.Workbooks.Open(path3)
    2. Dim StartDatum As String
    3. Dim EndDatum As String
    4. StartDatum = InputBox("Start-Datum:", "Eingabe", Format(Now, "YYYYMMDD"))
    5. EndDatum = InputBox("End-Datum:", "Eingabe", Format(Now, "YYYYMMDD"))
    6. MyExcel.Range("D:D").Replace(("Startdatum im Format JJJJMMTT"), StartDatum)
    7. MyExcel.Range("E:E").Replace(("Enddatum im Format JJJJMMTT"), EndDatum)
    8. MyExcel.Range("F:F").Replace(("_*"), "")
    9. Dim loLetzte As Long
    10. With MyExcel.Worksheets("Sheet1")
    11. loLetzte = .Cells(.Rows.Count, "A").End(-4162).Row
    12. If MyExcel.WorksheetFunction.CountBlank(.Range("H2:H" & loLetzte)) > 0 Then
    13. .Range("H2:H" & loLetzte).SpecialCells(4) = 0
    14. End If
    15. End With
    16. MyExcel.Range("A:AZ").Replace(("Keine Eintragung..."), "")
    17. MyExcel.Range("A:AZ").Replace(("Keine Ei"), "")


    Und was ist aus der DatePicker Sache geworden? :)

    <Insert funny signature here>

    Neu

    Da ist ja schon wieder alles über die Application (MyExcel) adressiert.

    VB.NET-Quellcode

    1. ​Dim wb = MyExcel.Workbooks.Open(path3) 'Workbook
    2. Dim ws = wb.Sheets(1) 'Worksheet
    3. ws.Range("D:D").Replace(("Startdatum im Format JJJJMMTT"), StartDatum)

    Engelchen schrieb:

    Und was ist aus der DatePicker Sache geworden?
    Die Frage geht an dich.
    Ich sehe in deinem Code nichts davon.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Neu

    Genau, das war die Frage, die ich hatte, ob ich MyExcel ersetzen soll..

    Ich tue ja - ich schaue dass ich das selbst hinbekomme - aber bisher nichts gefunden wo ich ansetzen kann..


    Ich habe jetzt mal ein bisschen was verändert, nämlich wk1 und wk2 verändert. weil es muss ja in wk2 rein diese Liste soll dann bearbeitet werden mit dem Replace command.

    siehe hier:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports Microsoft.Office.Interop.Excel
    2. Class MainWindow
    3. Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
    4. Dim MyExcel As New Microsoft.Office.Interop.Excel.Application
    5. MyExcel.Visible = True
    6. Dim wk1, wk2, wk3 As Workbook
    7. ' Dim row1, row2 As Integer
    8. Dim path1, path2, path3 As String
    9. path1 = "Liste1.xlsx"
    10. path2 = "Liste2.xlsx"
    11. path3 = "Liste1undListe2"
    12. wk1 = MyExcel.Workbooks.Open(path1)
    13. wk2 = MyExcel.Workbooks.Open(path2)
    14. wk2.Unprotect()
    15. wk1.Unprotect()
    16. ' Row1 = wk1.Sheets(1).Cells(wk1.Sheets(1).Rows.Count, 1).End(-4162).Row
    17. 'Row2 = wk2.Sheets(1).Cells(wk2.Sheets(1).Rows.Count, 1).End(-4162).Row + 1
    18. Dim Row1 = wk1.Sheets(1).Cells(wk1.Sheets(1).Rows.Count, 1).End(-4162).Row
    19. Dim Row2 = wk2.Sheets(1).Cells(wk2.Sheets(1).Rows.Count, 1).End(-4162).Row + 1
    20. Dim Rng1 = MyExcel.Intersect(wk1.Sheets(1).UsedRange, wk1.Sheets(1).Range("2:" & Row1))
    21. Dim Rng2 = wk2.Sheets(1).Range("A" & Row2).ReSize(Rng1.Rows.Count, Rng1.Columns.Count)
    22. Rng2.Value = Rng1.Value
    23. wk2.SaveAs("\\Liste1undListe2.xlsx")
    24. MyExcel.Workbooks.Open("\\Liste1undListe2.xlsx")
    25. MyExcel.Visible = True
    26. Dim wb = MyExcel.Workbooks.Open(path3) 'Workbook
    27. Dim ws = wb.Sheets(1) 'Worksheet
    28. wk3 = MyExcel.Workbooks.Open(path3)
    29. Dim StartDatum As String
    30. Dim EndDatum As String
    31. StartDatum = InputBox("Start-Datum:", "Eingabe", Format(Now, "YYYYMMDD"))
    32. EndDatum = InputBox("End-Datum:", "Eingabe", Format(Now, "YYYYMMDD"))
    33. MyExcel.Range("D:D").Replace(("Startdatum im Format JJJJMMTT"), StartDatum)
    34. MyExcel.Range("E:E").Replace(("Enddatum im Format JJJJMMTT"), EndDatum)
    35. ws.Range("D:D").Replace(("Startdatum im Format JJJJMMTT"), StartDatum)
    36. Dim loLetzte As Long
    37. 'With MyExcel.Worksheets("Sheet1")
    38. 'loLetzte = .Cells(.Rows.Count, "A").End(-4162).Row
    39. 'If MyExcel.WorksheetFunction.CountBlank(.Range("H2:H" & loLetzte)) > 0 Then
    40. '.Range("H2:H" & loLetzte).SpecialCells(4) = 0
    41. 'End If
    42. 'End With
    43. MyExcel.Range("A:AZ").Replace(("Keine Eintragung..."), "")
    44. MyExcel.Range("A:AZ").Replace(("Keine Ei"), "")
    45. wk2.SaveAs($"\\A_B_C_{StartDatum}_{EndDatum}.xlsx")
    46. End Sub
    47. End Class


    Damit du ihn mal siehst.


    Leider noch nicht dazu gekommen, dass mit dem DateTImePicker zu erledigen.


    Wie schaffe ich es denn jetzt, so meine Frage, bei der Liste1undListe2 eine Kürzung bzw. die Replace Funktion zu erreichen?
    Ich blick da nicht mehr so ganz durch.

    VIelleicht kann man den Code auch etwas kürzen bzw. vereinfachen - mit wk1 wk2 wk3 und so weiter.
    MyExcel soll weiterhin bestehen bleiben?

    Ist leider "mein" erster Code den ich schreibe und ich habe nur in der Schule Java und komme nicht so ganz zu recht mit dem Programmieren.
    Habe den einen Code auscommentiert, da ich ihn erstmal nicht mehr brauche.
    <Insert funny signature here>

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Engelchen“ ()

    Neu

    In Zeile 28 hast du doch schon das Workbook, das du brauchst.
    Zeilen 29-35 sind doch völlig überflüssig und kannst du löschen.
    Mach danach weiter mit
    Dim ws = wk2.Sheets(1)
    und dieses Worksheetobjekt verwendest du als Basisobjekt für den Rest.
    ws.Range("D:D").Replace("Startdatum im Format JJJJMMTT", StartDatum)
    usw.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --