2 Excel zusammenfügen / Merge Kopfzeile soll verschwinden
- VB.NET
Sie verwenden einen veralteten Browser (%browser%) mit Sicherheitsschwachstellen und können nicht alle Funktionen dieser Webseite nutzen.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Es gibt 51 Antworten in diesem Thema. Der letzte Beitrag () ist von Engelchen.
-
-
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. -
-
Nuja, da bei mir der Code funktioniert, musst Du wohl schauen, wo bei Dir der
FehlerUnterschied ist.
Visual Basic-Quellcode
- MyExcel.Visible = True
- Dim wk1, wk2 As Workbook
- Dim row1, row2 As Integer
- Dim path1, path2 As String
- path1 = "\\Liste1.xlsx"
- path2 = "\\Liste2.xlsx"
- wk1 = MyExcel.Workbooks.Open(path1)
- wk2 = MyExcel.Workbooks.Open(path2)
- MyExcel.Visible = True
- row1 = wk1.Sheets(1).Cells(wk1.Sheets(1).Rows.Count, 1).End(-4162).Row
- row2 = wk2.Sheets(1).Cells(wk2.Sheets(1).Rows.Count, 1).End(-4162).Row + 1
- wk1.Sheets(1).Rows("2:" & row1).Copy
- wk2.Sheets(1).Activate
- wk2.Sheets(1).Cells(row2, 1).Select
- wk2.Sheets(1).Paste
- MyExcel.CutCopyMode = False
Vielleicht falsche Reihenfolge mitActivate
undCells(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. -
-
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“ ()
-
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
CodeTags korrigiert ~VaporiZed
<Insert funny signature here>
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VaporiZed“ ()
-
VB.NET-Quellcode
- Dim Row1 = wk1.Sheets(1).Cells(wk1.Sheets(1).Rows.Count, 1).End(-4162).Row
- Dim Row2 = wk2.Sheets(1).Cells(wk2.Sheets(1).Rows.Count, 1).End(-4162).Row + 1
- Dim Rng1 = Intersect(wk1.UsedRange, wk1.Sheets(1).Range("2:" & Row1))
- Dim Rng2 = wk2.Sheets(1).Range("A" & Row2).ReSize(Rng1.Rows.Count, Rng1.Columns.Count)
- Rng2.Value = Rng1.Value
--
If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
--Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „petaod“ ()
-
-
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 dasDim
entfernen oder oben die ZeileDim row1, row2 As Integer
löschen.
Intersect kannst du durchMyExcel.Intersect
ersetzen.--
If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
-- -
System.MissingMemberException: "Der öffentliche Member UsedRange für den Typ Workbook wurde nicht gefunden."
Kommt bei MyExcel.Intersect
VB.NET-Quellcode
- Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
- Dim MyExcel As New Microsoft.Office.Interop.Excel.Application
- MyExcel.Visible = True
- Dim wk1, wk2 As Workbook
- ' Dim row1, row2 As Integer
- Dim path1, path2 As String
- path1 = "\Liste1.xlsx"
- path2 = "\Liste2.xlsx"
- wk1 = MyExcel.Workbooks.Open(path1)
- wk2 = MyExcel.Workbooks.Open(path2)
- wk2.Unprotect()
- ' Row1 = wk1.Sheets(1).Cells(wk1.Sheets(1).Rows.Count, 1).End(-4162).Row
- 'Row2 = wk2.Sheets(1).Cells(wk2.Sheets(1).Rows.Count, 1).End(-4162).Row + 1
- Dim Row1 = wk1.Sheets(1).Cells(wk1.Sheets(1).Rows.Count, 1).End(-4162).Row
- Dim Row2 = wk2.Sheets(1).Cells(wk2.Sheets(1).Rows.Count, 1).End(-4162).Row + 1
- Dim Rng1 = MyExcel.Intersect(wk1.UsedRange, wk1.Sheets(1).Range("2:" & Row1))
- Dim Rng2 = wk2.Sheets(1).Range("A" & Row2).ReSize(Rng1.Rows.Count, Rng1.Columns.Count)
- Rng2.Value = Rng1.Value
- wk1.SaveAs("\\A_B_C_StartJJJJMMTT_EndJJJJMMTT.xlsx")
- MyExcel.Workbooks.Open("\\A_B_C_StartJJJJMMTT_EndJJJJMMTT.xlsx")
- MyExcel.Visible = True
- Dim StartDatum As String
- Dim EndDatum As String
- StartDatum = InputBox("Start-Datum:", "Eingabe", Format(Now, "YYYYMMDD"))
- EndDatum = InputBox("End-Datum:", "Eingabe", Format(Now, "YYYYMMDD"))
- MyExcel.Range("D:D").Replace(("Startdatum im Format JJJJMMTT"), StartDatum)
- MyExcel.Range("E:E").Replace(("Enddatum im Format JJJJMMTT"), EndDatum)
- MyExcel.Range("F:F").Replace(("_*"), "")
- Dim loLetzte As Long
- With MyExcel.Worksheets("Sheet1")
- loLetzte = .Cells(.Rows.Count, "A").End(-4162).Row
- If MyExcel.WorksheetFunction.CountBlank(.Range("H2:H" & loLetzte)) > 0 Then
- .Range("H2:H" & loLetzte).SpecialCells(4) = 0
- End If
- End With
- MyExcel.Range("A:AZ").Replace(("Keine Eintragung..."), "")
- MyExcel.Range("A:AZ").Replace(("Keine Ei"), "")
- MyExcel.SaveAs("\A_B_C_" + StartDatum + "_" + EndDatum + ".xlsx") 'funktioniert nicht
- End Sub
- End Class
Das ist bisher mein Code.
<Insert funny signature here>
-
Engelchen schrieb:
wk1.UsedRangewk1.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
-- -
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“ ()
-
Engelchen schrieb:
MyExcel.SaveAs("\\A_B_C_" + StartDatum + "_" + EndDatum + ".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
-- -
Heißt das, dass es auch darauf ankommt statt MyExcel ein wk2 ERsatz zu finden?
Weil er ersetzt mir nämlich nichts bei
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“ ()
-
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
-- -
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
- wk3 = MyExcel.Workbooks.Open(path3)
- Dim StartDatum As String
- Dim EndDatum As String
- StartDatum = InputBox("Start-Datum:", "Eingabe", Format(Now, "YYYYMMDD"))
- EndDatum = InputBox("End-Datum:", "Eingabe", Format(Now, "YYYYMMDD"))
- MyExcel.Range("D:D").Replace(("Startdatum im Format JJJJMMTT"), StartDatum)
- MyExcel.Range("E:E").Replace(("Enddatum im Format JJJJMMTT"), EndDatum)
- MyExcel.Range("F:F").Replace(("_*"), "")
- Dim loLetzte As Long
- With MyExcel.Worksheets("Sheet1")
- loLetzte = .Cells(.Rows.Count, "A").End(-4162).Row
- If MyExcel.WorksheetFunction.CountBlank(.Range("H2:H" & loLetzte)) > 0 Then
- .Range("H2:H" & loLetzte).SpecialCells(4) = 0
- End If
- End With
- MyExcel.Range("A:AZ").Replace(("Keine Eintragung..."), "")
- MyExcel.Range("A:AZ").Replace(("Keine Ei"), "")
Und was ist aus der DatePicker Sache geworden?
<Insert funny signature here>
-
Da ist ja schon wieder alles über die Application (MyExcel) adressiert.
Engelchen schrieb:
Und was ist aus der DatePicker Sache geworden?
Ich sehe in deinem Code nichts davon.--
If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
-- -
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
- Imports Microsoft.Office.Interop.Excel
- Class MainWindow
- Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
- Dim MyExcel As New Microsoft.Office.Interop.Excel.Application
- MyExcel.Visible = True
- Dim wk1, wk2, wk3 As Workbook
- ' Dim row1, row2 As Integer
- Dim path1, path2, path3 As String
- path1 = "Liste1.xlsx"
- path2 = "Liste2.xlsx"
- path3 = "Liste1undListe2"
- wk1 = MyExcel.Workbooks.Open(path1)
- wk2 = MyExcel.Workbooks.Open(path2)
- wk2.Unprotect()
- wk1.Unprotect()
- ' Row1 = wk1.Sheets(1).Cells(wk1.Sheets(1).Rows.Count, 1).End(-4162).Row
- 'Row2 = wk2.Sheets(1).Cells(wk2.Sheets(1).Rows.Count, 1).End(-4162).Row + 1
- Dim Row1 = wk1.Sheets(1).Cells(wk1.Sheets(1).Rows.Count, 1).End(-4162).Row
- Dim Row2 = wk2.Sheets(1).Cells(wk2.Sheets(1).Rows.Count, 1).End(-4162).Row + 1
- Dim Rng1 = MyExcel.Intersect(wk1.Sheets(1).UsedRange, wk1.Sheets(1).Range("2:" & Row1))
- Dim Rng2 = wk2.Sheets(1).Range("A" & Row2).ReSize(Rng1.Rows.Count, Rng1.Columns.Count)
- Rng2.Value = Rng1.Value
- wk2.SaveAs("\\Liste1undListe2.xlsx")
- MyExcel.Workbooks.Open("\\Liste1undListe2.xlsx")
- MyExcel.Visible = True
- Dim wb = MyExcel.Workbooks.Open(path3) 'Workbook
- Dim ws = wb.Sheets(1) 'Worksheet
- wk3 = MyExcel.Workbooks.Open(path3)
- Dim StartDatum As String
- Dim EndDatum As String
- StartDatum = InputBox("Start-Datum:", "Eingabe", Format(Now, "YYYYMMDD"))
- EndDatum = InputBox("End-Datum:", "Eingabe", Format(Now, "YYYYMMDD"))
- MyExcel.Range("D:D").Replace(("Startdatum im Format JJJJMMTT"), StartDatum)
- MyExcel.Range("E:E").Replace(("Enddatum im Format JJJJMMTT"), EndDatum)
- ws.Range("D:D").Replace(("Startdatum im Format JJJJMMTT"), StartDatum)
- Dim loLetzte As Long
- 'With MyExcel.Worksheets("Sheet1")
- 'loLetzte = .Cells(.Rows.Count, "A").End(-4162).Row
- 'If MyExcel.WorksheetFunction.CountBlank(.Range("H2:H" & loLetzte)) > 0 Then
- '.Range("H2:H" & loLetzte).SpecialCells(4) = 0
- 'End If
- 'End With
- MyExcel.Range("A:AZ").Replace(("Keine Eintragung..."), "")
- MyExcel.Range("A:AZ").Replace(("Keine Ei"), "")
- wk2.SaveAs($"\\A_B_C_{StartDatum}_{EndDatum}.xlsx")
- End Sub
- 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“ ()
-
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
--
-
Ähnliche Themen
-
KassiKraemerly - - Sonstige Problemstellungen