Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

.xls Exel Datei Splitten nach Kundennummer mit batch

Frage Entwicklung Batch & Shell

Mitglied: Underdog81

Underdog81 (Level 1) - Jetzt verbinden

17.08.2011, aktualisiert 11:50 Uhr, 4659 Aufrufe, 15 Kommentare

Mir wurde schon viel geholfen hier im Forum und ich würde gerne mehr über verschiedene möglichkeiten lernen um nicht ständig zu fragen.
Doch leider muss ich wieder nerven

Hallo an alle die diesen Beitrag lesen und im besten Fall auch noch hilfreich sein kann.


Es geht um eine .xls Datei die in verschiedenen Dateien aufgelistet werden muss.
Hier soll er dann die Kundennummer der Spalte A nehmen, um eine neue Datei anzulegen (gerne eine .xls)
Als Bezeichnung der neuen Datei soll er dann den Inhalt der Spalte B nehmen.
Die restlichen Spalten soll er so in die neue Datei Schreiben und die Spalte A und B eben Weglassen.
In Zeile 1 soll er dann in jeder Datei Artikelnummer, Bezeichnung und Menge anzeigen.
cih weiss nicht ob es wichtig ist aber einige Artikelnummern fangen mit einem Buchstaben an. (nicht alle)

Hier ein Beispiel des Aufbau der Exportierten Datei.

A B C D E
1 Kundennummer Kunde Artikelnummer Bezeichnung Menge
2 12345 12345 Hans Wurst, Wohnort 12309 Zucker 150
3 12345 12345 Hans Wurst, Wohnort 8520 Ball 10
4 67890 67890 Max Mustermann, Wohnort G1234 Limoade 900
5 67890 67890 Max Mustermann , Wohnot 222111 Beton 1


Ich habe leider keinen Plan obdas mit Batch geht, sorry.
Aber ich bin guter Dinge hier hilfe zu bekommen.

Hier eine besser Ansicht

a250f9994bc69a6b9d3974e38e34cd5b - Klicke auf das Bild, um es zu vergrößern
Mitglied: bastla
17.08.2011 um 11:33 Uhr
Hallo Underdog81 (wie Du siehst, ist eine Begrüßung gar nicht so schwierig)!

Wenn Du jetzt auch noch das gewünschte Ergebnis darstellst, sollten alle Klarheiten beseitigt sein ...

Grüße (geht auch ganz leicht)
bastla
Bitte warten ..
Mitglied: Underdog81
17.08.2011 um 11:47 Uhr
Klar gehört sich eine nette Berüßung hatte ich leider vergessen ( editiert im ersten Beitrag)

Nun zu dem Ergebnis............
Spalte A soll er nur zum identifizieren nutzen und dann löschen

Datei 1 hat den Namen "hans wurst, wohnort" und der Inhalt ist alles an Spalten nach B.
Datei 2 hat den gleichen inhaltsaufbau aber den namen " max mustermann, wohnort".

Bild kommt gleich...


Diese Ansicht wäre dann die Datei mit dem namen "hans wurst, wohnort"
33a5d19a3cf7051861e56988a1ae7597 - Klicke auf das Bild, um es zu vergrößern
Bitte warten ..
Mitglied: Skyemugen
17.08.2011 um 12:13 Uhr
Aloha,

Frage: .xls-Zwang? Oder könntest du auch mit .csv arbeiten? Denn Ersteres dürfte wohl nur mit VBS umsetzbar sein und Letzteres auch mit Batch.

greetz André
Bitte warten ..
Mitglied: Underdog81
17.08.2011 um 12:16 Uhr
Mir wäre am liebsten eine .xls wegen der Tabellenansicht.
Denn es soll später gegebenfalls ausgedruckt werden um diese den Kunden zu übergeben.
Bitte warten ..
Mitglied: bastla
17.08.2011 um 17:26 Uhr
Hallo Underdog81!

Dann versuch es mit folgendem VBA-Script:
01.
Option Base 1 
02.
Sub Aufteilen() 
03.
'Quelle 
04.
Const AbZeileQuelle As Integer = 2 'erste Datenzeile 
05.
Const SpalteQuelleKNr As String = "A" 
06.
Const SpalteQuelleName As String = "B" 
07.
Const AbSpalteDaten As String = "C" 
08.
 
09.
'Ziel 
10.
Const Zielpfad As String = "D:\Einzeldateien\" 'Pfad muss mit "\" enden 
11.
Const AbZeileZiel As Integer = 1 'Kopfzeile 
12.
Const AbSpalteZiel As String = "A" 
13.
Dim Kopfzeile() As Variant 
14.
Kopfzeile = Array("Artikelnummer", "Bezeichnung", "Menge") 'Kopfzeile = Spaltenüberschriften in Zieldatei 
15.
 
16.
Spalten = UBound(Kopfzeile) 'Anzahl der Datenspalten lt festgelegter Kopfzeile 
17.
Set Quelle = ActiveWorkbook.ActiveSheet 
18.
ZeileQuelle = AbZeileQuelle 
19.
With Quelle 
20.
    KNr = .Cells(ZeileQuelle, SpalteQuelleKNr).Value  'KNr auslesen 
21.
    KNrZuletzt = "" 
22.
    Do While KNr <> "" 'solange Daten vorhanden (KNr-Spalte nicht leer) 
23.
        If KNr <> KNrZuletzt Then 'neuer Kunde? 
24.
            If Not KNrZuletzt = "" Then 'Wenn nicht allererster Datensatz, 
25.
                Zieldatei.ActiveSheet.Cells.EntireColumn.AutoFit 'optimale Spaltenbreite festlegen, 
26.
                Zieldatei.SaveAs Zielpfad & Dateiname 'Zieldatei speichern und 
27.
                Zieldatei.Close 'schließen 
28.
            End If 
29.
            Dateiname = .Cells(ZeileQuelle, SpalteQuelleName).Value 'Dateinamen auslesen 
30.
            Set Zieldatei = Workbooks.Add 'neue Datei erstellen 
31.
            ZeileZiel = AbZeileZiel 
32.
            Zieldatei.ActiveSheet.Cells(ZeileZiel, AbSpalteZiel).Resize(1, Spalten).Value = Kopfzeile 'Kopfzeile eintragen 
33.
            KNrZuletzt = KNr 
34.
        End If 
35.
        ZeileZiel = ZeileZiel + 1 'nächste Zeile in Zieltabelle 
36.
        .Cells(ZeileQuelle, AbSpalteDaten).Resize(1, Spalten).Copy Zieldatei.ActiveSheet.Cells(ZeileZiel, AbSpalteZiel) 'Datenspalten in Zieldatei kopieren 
37.
         
38.
        ZeileQuelle = ZeileQuelle + 1 'nächste Zeile in Quelltabelle 
39.
        KNr = Quelle.Cells(ZeileQuelle, SpalteQuelleKNr).Value 'KNr auslesen 
40.
    Loop 
41.
 
42.
    If Not KNrZuletzt = "" Then 'Wenn nicht allererster Datensatz, 
43.
        Zieldatei.ActiveSheet.Cells.EntireColumn.AutoFit 'optimale Spaltenbreite festlegen, 
44.
        Zieldatei.SaveAs Zielpfad & Dateiname 'Zieldatei speichern und 
45.
        Zieldatei.Close 'schließen 
46.
    End If 
47.
End With 
48.
End Sub
Vorausgesetzt habe ich, dass alle Kundennamen sich unterscheiden und somit kein Dateiname doppelt vorkommt - sicherer wäre (als Zeile 29)
Dateiname = KNr & "_" & .Cells(ZeileQuelle, SpalteQuelleName).Value 'Dateinamen aus KNr und Namen erstellen
Grüße
bastla
Bitte warten ..
Mitglied: Underdog81
17.08.2011 um 17:40 Uhr
boaa das ist ja eine mega Datei!!!
ich teste es gleich mal aus.
Die Kundennamen sind definitiv immer anders, da die Kundennummer jetzt in der Datei auch imk Feld Kunde anführend drin steht.

Ich danke schon mal
Underdog81
Bitte warten ..
Mitglied: Underdog81
17.08.2011 um 21:50 Uhr
Syntaxfehler
zeile1 Zeichen 8....
also das B von Base in der ersten Zeile??
Bitte warten ..
Mitglied: bastla
17.08.2011 um 21:58 Uhr
Hallo Underdog81!

Welche Excel-Version verwendest Du? In der 2007er funktioniert die Zeile ...

Grüße
bastla
Bitte warten ..
Mitglied: Underdog81
17.08.2011 um 22:02 Uhr
ne leider ist es die 2003er Version

Gibt es hier so extreme unterschiede?
hoffe mal, dass es dennoch irgendwie geht.
Dumm nur, dass die Suchmaschiene mit dem G nix ausspuckt.
Bitte warten ..
Mitglied: bastla
17.08.2011 um 22:03 Uhr
Hallo Underdog81!

Lass die erste Zeile weg und ändere die (derzeitige) Zeile 16 auf
Spalten = UBound(Kopfzeile) + 1 'Anzahl der Datenspalten lt festgelegter Kopfzeile
Grüße
bastla
Bitte warten ..
Mitglied: Underdog81
17.08.2011 um 22:13 Uhr
Hab ich gemacht aber jetzt kommt der nächste Fehler
Zeile3 Zeichen21
fehler `=` erwatet
Bitte warten ..
Mitglied: bastla
17.08.2011 um 22:19 Uhr
Na schön, dann hangeln wir uns weiter ...

Tausche den ersten Teil gegen
01.
Sub Aufteilen() 
02.
AbZeileQuelle = 2 
03.
SpalteQuelleKNr = "A" 
04.
SpalteQuelleName = "B" 
05.
AbSpalteDaten = "C" 
06.
 
07.
Zielpfad = "D:\Einzeldateien\" 'Pfad muss mit "\" enden  
08.
AbZeileZiel = 1 
09.
AbSpalteZiel = "A" 
10.
Dim Kopfzeile()
aus ...

Grüße
bastla

[Edit] Zeile 7 angepasst [/Edit]
Bitte warten ..
Mitglied: Underdog81
17.08.2011 um 22:35 Uhr
hmmm.. nun bekomme ich keine Fehlermeldung und es passiert nix...?
Bitte warten ..
Mitglied: Underdog81
22.08.2011 um 09:19 Uhr
So nun läuft es und ich will euch auch verraten wie

Erst mal ein Danke an Bastla der mir über gut geholfen hat.

Ich öffne also Excel und gehe unten auf Tabelle1 und mache einen rechtsklick. Hier wähle ich Code anzeigen aus!
Dann öffnet sich Visual Basic. Dort wähle ich "Diese Arbeitsmappe" mit doppelklick aus.

Jetzt füge ich noch folgendes hinzu in dem rechten Feld.
Alles was zwischen den ## und den ### steht steht oben schon.
01.
Sub Workbook_Open() 
02.
Aktualisieren 
03.
End Sub 
04.
 
05.
Sub Aktualisieren() 
06.
   Dim varItem As Variant 
07.
   Dim strName As String 
08.
    
09.
   On Error GoTo ErrHandler 
10.
    
11.
   Application.EnableEvents = True 'Makros einschalten ! 
12.
    
13.
   For Each varItem In Array("C:\Ordner_der_zu_bearbeitenden_Datei\") 'Pfad muss mit "\" enden 
14.
      strName = Dir(varItem & "*.xls") 
15.
      Do While Len(strName) > 0 
16.
         Workbooks.Open varItem & strName, UpdateLinks:=True 
17.
         'MsgBox ActiveWorkbook.FullName 
18.
'## 
19.
'Quelle 
20.
Const AbZeileQuelle As Integer = 2 'erste Datenzeile 
21.
Const SpalteQuelleKNr As String = "A" 
22.
Const SpalteQuelleName As String = "B" 
23.
Const AbSpalteDaten As String = "C" 
24.
 
25.
'Ziel 
26.
Const Zielpfad As String = "C:\Zielordner\" 'Pfad muss mit "\" enden 
27.
Const AbZeileZiel As Integer = 1 'Kopfzeile 
28.
Const AbSpalteZiel As String = "A" 
29.
Dim Kopfzeile() As Variant 
30.
Kopfzeile = Array("Artikelnummer", "Bezeichnung", "Menge") 'Kopfzeile = Spaltenüberschriften in Zieldatei 
31.
 
32.
Spalten = UBound(Kopfzeile) + 1 'Anzahl der Datenspalten lt festgelegter Kopfzeile 
33.
Set Quelle = ActiveWorkbook.ActiveSheet 
34.
ZeileQuelle = AbZeileQuelle 
35.
With Quelle 
36.
    KNr = .Cells(ZeileQuelle, SpalteQuelleKNr).Value  'KNr auslesen 
37.
    KNrZuletzt = "" 
38.
    Do While KNr <> "" 'solange Daten vorhanden (KNr-Spalte nicht leer) 
39.
        If KNr <> KNrZuletzt Then 'neuer Kunde? 
40.
            If Not KNrZuletzt = "" Then 'Wenn nicht allererster Datensatz, 
41.
                Zieldatei.ActiveSheet.Cells.EntireColumn.AutoFit 'optimale Spaltenbreite festlegen, 
42.
                Zieldatei.SaveAs Zielpfad & Dateiname 'Zieldatei speichern und 
43.
                Zieldatei.Close 'schließen 
44.
            End If 
45.
            Dateiname = .Cells(ZeileQuelle, SpalteQuelleName).Value 'Dateinamen auslesen 
46.
            Set Zieldatei = Workbooks.Add 'neue Datei erstellen 
47.
            ZeileZiel = AbZeileZiel 
48.
            Zieldatei.ActiveSheet.Cells(ZeileZiel, AbSpalteZiel).Resize(1, Spalten).Value = Kopfzeile 'Kopfzeile eintragen 
49.
            KNrZuletzt = KNr 
50.
        End If 
51.
        ZeileZiel = ZeileZiel + 1 'nächste Zeile in Zieltabelle 
52.
        .Cells(ZeileQuelle, AbSpalteDaten).Resize(1, Spalten).Copy Zieldatei.ActiveSheet.Cells(ZeileZiel, AbSpalteZiel) 'Datenspalten in Zieldatei kopieren 
53.
 
54.
        ZeileQuelle = ZeileQuelle + 1 'nächste Zeile in Quelltabelle 
55.
        KNr = Quelle.Cells(ZeileQuelle, SpalteQuelleKNr).Value 'KNr auslesen 
56.
    Loop 
57.
 
58.
    If Not KNrZuletzt = "" Then 'Wenn nicht allererster Datensatz, 
59.
        Zieldatei.ActiveSheet.Cells.EntireColumn.AutoFit 'optimale Spaltenbreite festlegen, 
60.
        Zieldatei.SaveAs Zielpfad & Dateiname 'Zieldatei speichern und 
61.
        Zieldatei.Close 'schließen 
62.
    End If 
63.
End With 
64.
 
65.
'### 
66.
         strName = Dir 
67.
      Loop 
68.
   Next 
69.
    
70.
   Application.EnableEvents = True 
71.
 
72.
ErrHandler: 
73.
   If Err.Number Then 
74.
      MsgBox Err.Description, vbCritical, Err.Number 
75.
      Resume Next 
76.
   End If 
77.
End Sub



Nun speichern wir alles ab und schliessen das ganze einmal.
Beim nächsten öffnen kommt die Frage ob makros aktiviert werden sollen. Wähle jetzt Ja aus und er fängt an die Datei zu splitten.
Sollte die Abfrage nicht kommen geh auf "Extras-Makro-Sicherheit" Sicherheitsstufe auf Mittel setzen.

[Edit Biber] Codefomatierung, falls zu den einen oder anderen Zeilennummern noch Anmerkungen kommen sollten. [/Edit]
Bitte warten ..
Mitglied: bastla
22.08.2011 um 15:29 Uhr
Hallo Underdog81!

Schön, wenn es funktioniert - das tut es (ohne Fehlermeldungen) aber sicher nur, wenn sich nur eine einzige Datei im Ordner "C:\Ordner_der_zu_bearbeitenden_Datei" befindet; anderenfalls würde jede "Const"-Zeile (Zeilen 20 bis 28) einen Fehler bewirken ...

Wenn es aber nur um eine einzelne Datei geht, sind die beiden Schleifen (Zeilen 13 und 15) zu hinterfragen - dort wird nämlich festgelegt, dass alle der (per "Array" in Zeile 13) angegebenen Ordner (ist aber nur einer ) bearbeitet werden sollen, bzw dass der folgende Code auf alle sich in diesen Ordnern befindlichen ".xls"-Dateien angewendet werden soll (wobei Letzteres tatsächlich aber auch für eine einzelne Datei sinnvoll sein kann, wenn deren Name nicht konstant ist). Jedenfalls wären aber die Zeilen 19 bis 32 vor der Zeile 13 zu platzieren.
Dass der Kommentar in der Zeile 11 nicht dem davor stehenden Befehl entspricht, ist zu vernachlässigen (wenngleich dieser Befehl aber eigentlich nur mit einem "False" Sinn ergäbe; ansonsten könntest Du diese Zeile zusammen mit Zeile 70 entsorgen) ...
Noch kurz (für Interessierte) zur Erklärung, warum die beschriebene Vorgangsweise gewählt wurde: Da die zu bearbeitende Datei regelmäßig (per Export) neu erstellt wird, kann das Script nicht in dieser Datei selbst gespeichert werden - als Alternative blieben dann nur die "Persönliche Makroarbeitsmappe" oder eben das (hier verwendete) Ablegen in einer weiteren Excel-Datei ...

Grüße
bastla

P.S.: Thx @Biber (und dass der Konjunktiv nicht ernst gemeint war, ist auch klar )
Bitte warten ..
Neuester Wissensbeitrag
CPU, RAM, Mainboards

Angetestet: PC Engines APU 3a2 im Rack-Gehäuse

(1)

Erfahrungsbericht von ashnod zum Thema CPU, RAM, Mainboards ...

Ähnliche Inhalte
Batch & Shell
gelöst Splitten in Batch. Wo liegt der Fehler!? (4)

Frage von Todybear zum Thema Batch & Shell ...

Batch & Shell
Ungewöhnliche Txt.Datei-Abfrage mit Batch (3)

Frage von DaTobsn zum Thema Batch & Shell ...

Batch & Shell
Neuere Datei per Batch ausfinding machen (2)

Frage von chattie zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (13)

Frage von JayyyH zum Thema Switche und Hubs ...

DSL, VDSL
DSL-Signal bewerten (13)

Frage von SarekHL zum Thema DSL, VDSL ...

Backup
Clients als Server missbrauchen? (9)

Frage von 1410640014 zum Thema Backup ...

Windows Server
Mailserver auf Windows Server 2012 (9)

Frage von StefanT81 zum Thema Windows Server ...