Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Makro und Formeln zusammenführen

Forumthread: Makro und Formeln zusammenführen

Makro und Formeln zusammenführen
14.05.2024 15:38:40
Ocarin
Huhu zusammen :)

Zur Bearbeitung von Auftragslisten erhalten wir jeweils Rohdateien mit Angaben, welche wir nicht benötigen. Wir haben ein Excel mit einem Makro, welches die Listen auf die benötigten Spalten reduziert. Die reduzierte Liste fügen wir anschliessend in ein zweites Excel ein, bei welchem mittels Formeln doppelte Werte zusammengeführt werden. Am Schluss speichern wir die neuen Daten als separate .csv Datei ab, welche so zur weiteren Bearbeitung verwendet wird.

Nun möchten wir die Vorgänge in einem einzelnen Excel File kombinieren, um uns etwas Aufwand zu sparen. Hat jemand eine Ahnung, ob und wie das am besten machbar ist?

Die Rohdatei, die wir erhalten, sieht etwa so aus: https://www.herber.de/bbs/user/169454.xlsx.

Das Excel wird hiermit über das Makro "goprepare" reduziert https://www.herber.de/bbs/user/169455.xlsm

und anschliessend wird die reduzierte Liste hier https://www.herber.de/bbs/user/169456.xlsx eingefügt.

Die Werte aus dieser Liste wird dann als .csv Datei gespeichert und sieht dann so aus. https://www.herber.de/bbs/user/169457.xlsx

Kann mir hierbei jemand weiterhelfen?

Liebe Grüsse
Michi
Anzeige

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Makro und Formeln zusammenführen
14.05.2024 17:05:22
Onur
Schreib einfach mal auf, welche Spalten relevant sind, da brauche ich nicht den "Code" vom Macrorecorder zu analysieren.
AW: Makro und Formeln zusammenführen
14.05.2024 21:39:00
schauan
Hallöchen,

hier mal ein aufgezeichneter code mit minimalen Änderungen. Kann natürlich noch deutlich verbessert werden, aber man sieht auch mal, was in Deinem Fall durch Aufzeichnen geht. ;-) Der Code kommt in Deine Programmdatei und den Button switchst Du dann auf selbiges um.

Vor dem Start musst Du die Quelldatei öffnen. Der Name der Quelle ist hier im Code fest programmiert - das flexibel zu gestalten wäre die erste notwendige Änderung. Gleiches gilt dann für das Ziel bzw. das Zielverzeichnis.

Die gewünschten Spalten werden auf das Blatt Format kopiert, die Spalten neu angeordnet, die Namen beim Leerzeichen getrennt und der erste Teil als Vorname gewertet. Dann werden rechts 5 Spalten gelöscht. Hasst Du zwei Vornamen durch Leerzeichen getrennt, bleibt entsprechend nur der erste.
Anschließend wird das Blatt kopiert und als csv gespeichert. Dann wird die csv und die quelle geschlossen.

Sub Makro1()

'
' Makro1 Makro
'

'
Windows("169454.xlsx").Activate
Range("D:D,J:J,N:O").Select
Range("N1").Activate
Selection.Copy
Windows("169455.xlsm").Activate
Range("A1").Select
ActiveSheet.Paste
Application.CutCopyMode = False
ActiveSheet.Range("$A$1:$D$227").RemoveDuplicates Columns:=4, Header:=xlYes
Columns("B:B").Select
Selection.Cut
Columns("E:E").Select
Selection.Insert Shift:=xlToRight
Range("A1").Select
ActiveCell.FormulaR1C1 = "code1"
Range("B1").Select
ActiveCell.FormulaR1C1 = "Language"
Range("D1").Select
ActiveCell.FormulaR1C1 = "first_name"
Columns("D:D").Select
Selection.TextToColumns Destination:=Range("D1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=True, _
Semicolon:=False, Comma:=False, Space:=True, Other:=False, FieldInfo _
:=Array(Array(1, 1), Array(2, 1)), TrailingMinusNumbers:=True
Columns("E:H").Select
Selection.Delete Shift:=xlToLeft
Sheets("Format").Copy
ChDir "C:\Test"
ActiveWorkbook.SaveAs Filename:="C:\Test\169455.csv", _
FileFormat:=xlCSV, CreateBackup:=False
ActiveWindow.Close
Windows("169454.xlsx").Activate
ActiveWindow.Close
End Sub

Anzeige
AW: Makro und Formeln zusammenführen
15.05.2024 01:29:25
Piet
Hallo

ich denke ich habe ein wesentlich kürzes Makro geschrieben das diesen Vorgang automatisiert. - Man kann es verbessern!
Fehlerhaft ist der -csv- Speichervorgang, weil die csv Datei nur in einer Spalte => A, statt vier Spalten gespeichert wird.

Da mache ich was falsch, hier reicht mein bescheidenes Wisssen aber nicht aus um den Fehler zu erkennen.
Vielleicht kann ein Kollege den Datei Öffnen Teil und den -csv- Speichern Teil verbessern. Danke im voraus.
https://www.herber.de/bbs/user/169465.xls

Diese Beispieldatei dient nur zum Datei Öffnen und bearbeiten der Rohdatei. Ich benötigte keine weiteren Dateien!
Man ist erstaunt wie kurz ein Makro sein kann, wenn man lange genug logisch überlegt wie man es optimieren kann.

mfg Piet
Anzeige
AW: Makro und Formeln zusammenführen
16.05.2024 10:51:16
schauan
Hallo Piet,

mal verschiedenes. Das eine oder andere habe ich vielleicht auch anders aufgefasst...

1) Datei Öffnen Dialog
Sehr gut.

2) Datenspalten
hab ich alternativ nur die 4 in die Programmdatei geholt. Geht so aber auch sehr gut :-)

3) Vornamen
hatte ich über Text in Spalten gelöst. Hatte der TE glaube auch schon so gemacht. Die Varianten haben aber beide Nachteile. (S)(M)einen hatte ich beschrieben, in Deinem Code hätte unsere europäische Ursula wohl 3 Vornamen ...

4) Zusammenfassen
Laut den Formeln werden, wenn ich nichts übersehen habe, anhand der EMail die Duplikate entfernt.
Zusammenfassen hatte ich da nicht gesehen - war ganz gut, dass ich Deinen Code und darauf hin die Formeln nochmal genau angeschaut habe. Da werde ich wohl nochmal ran müssen :-(
Die Formel macht das ganz gut, da kann ich x Links haben und die werden zusammengefasst :-)

5) CSV Trennzeichen
Problem ist hier ggf. das Komma. Ob der TE ein Komma oder Semikolon verlangt, sei mal dahingestellt. Ein Semikolon könntest Du durch die Option , Local:=True erreichen, sofern es auf dem System als Trennzeichen so eingetragen ist.

6) Sortieren
Ich hatte das bei mir weggelassen. Für 4) mit der Formellösung macht das natürlich Sinn. Für's VBA-Zusammenfassen könnte man das auch ohne lösen, wobei es bei großen Datenmengen mit einer vorsortierten Liste wohl schneller gehen würde ...
Anzeige
AW: Makro und Formeln zusammenführen
16.05.2024 12:43:11
schauan
So, jetzt habe ich mal meinen ersten code vervollständigt - weiterhin mit dem Anspruch, was per Aufzeichnen geht.

Lediglich beim Sortieren und dem Ausfüllen der Formeln habe ich eingegriffen. Bei beiden habe ich die Bereich bis Zeile 200 ausgedehnt - beim Aufzeichnen wird das auf vorhandene Größen eingeschränkt - und ActiveWorkbook.Worksheets("Tabelle_xx") habe ich durch ActiveSheet ersetzt. Das mit dem Blattnamen könnte man sich sparen, wenn man ein vorhandenes Blatt verwendet - im Original das Blatt Format oder bei Dir, Piet, die Quelldatei.
Und dann noch ,local:=true beim Speichern als csv wg. der Semikola....

Duplikate entfernen ist noch drin - diesmal aber über alle Spalten - falls doch mal ein "komplettes" Duplikat dabei ist.
Für's Zusammenfassen hab ich die vorhandene Formellösung beibehalten bzw. benutzt. Ich habe aber noch FILTER verwendet, um Leerzeilen auszuschließen - sonst kommt 1x als Ergebnis 0.

Sub Makro1()

'
' Makro1 Makro
'

'
Windows("169454.xlsx").Activate
Range("D:D,J:J,N:O").Select
Range("N1").Activate
Selection.Copy
Windows("169455.xlsm").Activate
Sheets.Add After:=ActiveSheet
' Range("A1").Select
ActiveSheet.Paste
Application.CutCopyMode = False
ActiveSheet.Range("$A$1:$D$7").RemoveDuplicates Columns:=Array(1, 2, 3, 4), _
Header:=xlYes
Columns("B:B").Select
Selection.Cut
Columns("E:E").Select
Selection.Insert Shift:=xlToRight
Range("A1").Select
ActiveCell.FormulaR1C1 = "code1"
Range("B1").Select
ActiveCell.FormulaR1C1 = "Language"
Range("D1").Select
ActiveCell.FormulaR1C1 = "first_name"
Columns("D:D").Select
Selection.TextToColumns Destination:=Range("D1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=True, _
Semicolon:=False, Comma:=False, Space:=True, Other:=False, FieldInfo _
:=Array(Array(1, 1), Array(2, 1)), TrailingMinusNumbers:=True
Columns("E:M").Select
Selection.Delete Shift:=xlToLeft
ActiveSheet.Sort.SortFields.Clear
ActiveSheet.Sort.SortFields.Add2 Key:=Range( _
"B2:B200"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortNormal
With ActiveSheet.Sort
.SetRange Range("A1:D200")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Range("K2").Select
ActiveCell.Formula2R1C1 = "=UNIQUE(FILTER(RC[-8]:R[198]C[-8],RC[-8]:R[198]C[-8]>""""))"
Range("J2").Select
ActiveCell.FormulaR1C1 = _
"=IFERROR(INDEX(R2C2:R2000C2,MATCH(RC[1],R2C3:R2000C3,0)),"""")"
Selection.AutoFill Destination:=Range("J2:J200"), Type:=xlFillDefault
Range("I2").Select
ActiveCell.Formula2R1C1 = _
"=IFERROR(TEXTJOIN("", "",TRUE,FILTER(R2C1:R2000C1,R2C3:R2000C3=RC[2])),"""")"
Selection.AutoFill Destination:=Range("I2:I200"), Type:=xlFillDefault
Range("L2").Select
ActiveCell.FormulaR1C1 = _
"=IFERROR(VLOOKUP(RC[-1],R2C3:R[1998]C[-8],2,0),"""")"
Selection.AutoFill Destination:=Range("L2:L200"), Type:=xlFillDefault
Range("I2:L200").Select
Selection.Copy
Range("A2").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Columns("E:M").Select
Selection.Delete Shift:=xlToLeft
ActiveSheet.Move
ChDir "C:\Test"
ActiveWorkbook.SaveAs Filename:="C:\Test\169455.csv", _
FileFormat:=xlCSV, CreateBackup:=False, local:=True
ActiveWindow.Close
Windows("169454.xlsx").Activate
ActiveWindow.Close
End Sub
Anzeige
AW: Makro und Formeln zusammenführen
16.05.2024 17:44:12
Piet
Hallo Schauan

ich sehe du hast dir viel Arbeit gemacht, leider kann ich deinen Code nicht prüfen. Es gibt Befehle und Formeln die Excel 2003 nicht kennt!
Es gibt aber viele Select, die man zusammenfassen könnte. Mein Code hat einen kleinen Schönheitsfehler, der leicht zu beheben ist.
InStrRev(AC, " "))) - muss nur in - InStr(AC, " "))) - geändert werden, dann stimmt der First Name.

Leider gibt es bisher keine AW von Ocarin. - Mal abwarten ob er noch antwortet??

mfg Piet

    

For Each AC In .Range("D2:D" & lz1)
AC.Value = Trim(Left(AC, InStrRev(AC, " ")))
Next AC
Anzeige
AW: Makro und Formeln zusammenführen
17.05.2024 10:40:32
schauan
Hallo Piet,

wie gesagt, es ging mir zuerst darum, zu zeigen, was da mit Aufzeichnen möglich ist. Der Code vom TE deutet ja darauf hin, dass er da auch einiges so gemacht hat und es gab ja hier auch einen Hinweis darauf. Daher z.B. die Selects usw.

Manuell programmiert - und mit reichlich Kommentaren versehen - könnte es so aussehen. Die Daten werden nur im code verarbeitet und ausgegeben. Sortieren habe ich hier wieder bewusst weggelassen. Die Ausgabe ist ebenso wieder fest programmiert, diesmal unter C:\Test\Test.csv und nun auch das Trennzeichen Semikolon. Das könnte man z.B. am Anfang als Konstanze :-) setzen, damit man es bei Änderung nicht suchen und 3fach ändern muss ...
Beim Array hätte ich auch den kompletten Bereich D2:Ox nehmen können statt 4 einzelner Arrays. Bei den einzelnen hätte ich auch auf das transponieren verzichten können, so ist es ein "echtes" 1D-Array (arr1(1), arr1(2), arr1(3)...). Anderenfalls wäre es ein "einspaltiges" 2D-Array (arr1(1,1), arr1(2,1), aar1(3,1)...)
Die Ausgabe könnte man weiter beschleunigen, wenn man die "Zeilen" zusammenfasst und dann den Text komplett ausgibt.
usw....

Sub test()

Dim arr1, arr2, arr3, arr4
Dim colTest As New Collection
Dim iFiNum%, lRow&, strDatei$
'Oeffnen mit Dialog
strDatei = Application.Dialogs(xlDialogOpen).Show("*.xls*")
'Falls abgebrochen wurde, beenden
If strDatei = False Then Exit Sub
'letzte Zeile feststellen
lRow = Cells(Rows.Count, 11).End(xlUp).Row
'Daten der 4 Spalten uebernehmen
arr1 = WorksheetFunction.Transpose(Range("D2:D" & lRow).Value)
arr2 = WorksheetFunction.Transpose(Range("N2:N" & lRow).Value)
arr3 = WorksheetFunction.Transpose(Range("O2:O" & lRow).Value)
arr4 = WorksheetFunction.Transpose(Range("J2:J" & lRow).Value)
'Datei schliessen
ActiveWindow.Close False
'Auf mehrfache email per collection-key pruefen (keine Mehrfachverwendung von keys moeglich)
'und mit Fehlerbehandlung auf Fehler 457 reagieren / arr1(x) zusammenfassen. iCnt entspricht dem Index des Array-Eintrages
On Error GoTo errorhandler
For icnt = 1 To UBound(arr1)
colTest.Add icnt, arr3(icnt)
Next
On Error Resume Next
'Ausgabe csv
'Datei zur Ausgabe oeffnen
iFiNum = FreeFile()
Open "C:\Test\Test.csv" For Output As #iFiNum
'alle eintraege uebernehmen die in arr1 etwas enthalten
'Beim Namen nur das Wort vor dem ersten Leerzeichen als Vorname
For icnt = 1 To UBound(arr1)
If arr1(icnt) > "" Then
Print #iFiNum, arr1(icnt) & ";" & arr2(icnt) & ";" & arr3(icnt) & ";" & Split(arr4(icnt), " ")(0)
End If
'Ende alle eintraege uebernehmen die in arr1 etwas enthalten
Next
'Ausgabedatei schliessen
Close #iFiNum
'Fehlerbehandlung fuer Fehler 457
errorhandler:
If Err.Number = 457 Then
'Hyperlink: vorigen Arrayeintrag anhand des collection Eintrages mit dem key feststellen,
'mit aktuellem Eintrag ergaenzen und aktuellen Arrayeintrag auf leer setzen (Ausgabesteuerung)
arr1(colTest.Item(arr3(icnt))) = arr1(colTest.Item(arr3(icnt))) & ", " & arr1(icnt)
arr1(icnt) = ""
Resume Next
End If
MsgBox "Erledigt!"
End Sub
Anzeige
AW: Makro und Formeln zusammenführen
14.05.2024 17:06:51
Onur
Und was "code1" sein soll. In der Importdatei ist nix ähnliches.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige