Mehrere Exceldateien zu einer zusammenfassen

  • hey,

    ich setzt das thema mal ins offtopic, da ich nicht weiss, in wie weit das mit autoit möglich ist, aber mir würden auch andere vorschläge weiterhelfen.

    also ich habe 5 dateien, die ich zu einer zusammenfügen möchte, am besten so, dass man es anschließend automatisieren könnte?

    hat jmd von sowas schonmal gehört?

    bei mpg files, die kann man zb über die cmd mergen, das wäre easy =)

  • danke, werde ich machen und morgen mal probieren.

    @th.meger, ich brauche es täglich, bzw es soll in den ganzen automatisierten prozess, und dann natürlich auch automatisch =)

    ich hätte ein Add-in für excel, was dies auch macht, aber dieses geht zZ nicht, wg activex probs, und wenn das script jmd an nem anderen rechner nutzt, würde es mit diesem makro auch zu problemen kommen, daher wäre mir ne UDF schon ganz lieb.

    was es nicht alles gibt, bin ja mal gespannt =)

  • Hallo Sc4ry.

    Ich habe cirka 200 Exceltabellen als Vorlage und irgendwo ist da auch eine die heißt 10:1 oder so. Die fügt bis zu 10 Tabellenblätter aus 10 Dateien zusammen. Meine aber, das die Tabellen immer die ersten sein müssen, was aber für dich ja nicht das Problem sein sollte.

    Bei Interesse melde dich einfach mal via PN und ich sende es Dir dann.
    Habe früher ganz ganz viel mit Excel gemacht, da ich ja auch hammer gerne Formeln schreibe. je länger, je besser.

    Gruß Lina

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    k3mrwmIBHejryPvylQSFieDF5f3VOnk6iLAVBGVhKQegrFuWr3iraNIblLweSW4WgqI0SrRbS7U5jI3sn50R4a15Cthu1bEr

  • Hallo.

    Habe die Datei auf die schnelle nicht finden können, aber ich habe Dir eine Datei gesendet, wo alles drinne ist. Nur noch im VB die Quellen Deiner Dateien ändern. Bei mir ist es F:\ (zählt für die andere Lösung, die ich hier nicht poste, da beide erfolgreich sind.

    Habe es Dir so gemacht, das Du ein Button hast, den Du drückst und dann öffnen sich die fünf Dateien, aus den wird herauskopier und in die Grunddatei geschrieben.
    Wenn Frage kommt, ob Sachen in der Zwischenablage noch zur Verwendung stehen sollen, würde ich nein machen und am Ende fragt er, ob die Daten in Grundmaske.xls gespeichert werden sollen. Klaro, soll es das ;)

    Vielleicht hilft Dir diese Datei ja. Bei Änderungswünschen bitte via PN Melden.

    Nachtrag und Schreibfehler Berichtigung:
    Lösungsweg vergessen hier zu posten. Sorry. Ausgang ist die Grundmaske.xls , wo alles reinkopiert wird und die fünf Dateien Mappe1.xls, Mappe2.xls, usw.
    Alle Mappen müssen geöffnet sein!!!

    Spoiler anzeigen
    Code
    Sub test() 
      For i = 1 To 5 
        Workbooks("mappe" & i & ".xls").Activate 
        Sheets(1).Select 
        Cells.Copy 
        Workbooks("grundmaske.xls").Activate 
        Sheets(i).Select 
        Range("A1").PasteSpecial 
      Next i 
    End Sub


    Gruß Lina

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    k3mrwmIBHejryPvylQSFieDF5f3VOnk6iLAVBGVhKQegrFuWr3iraNIblLweSW4WgqI0SrRbS7U5jI3sn50R4a15Cthu1bEr

    4 Mal editiert, zuletzt von Alina (4. Mai 2007 um 10:18)

  • nochmal danke für deine hilfe alina.
    werd das auf jeden fall am we auch testen =)

    hab mich aber auch mal nach excel UDF umgeschaut.
    gefunden habe ich dabei das

    _ExcelSheetMove($oExcel, $vMoveSheet, $vRelativeSheet= 1, $fBefore = True)

    hat da jmd erfahrung mit?
    also excel öffnen und speichern/schließen kann ich jetzt *g*
    aber sheetmove will irgendwie nicht =(

    PS2: habs jetzt so, aber es klappt nicht =(

    Spoiler anzeigen
    [autoit]

    #include <ExcelCOM_UDF.au3>

    [/autoit] [autoit][/autoit] [autoit]

    $oExcel = _ExcelBookNew(1)
    $1 = _ExcelBookOpen("C:\Produkte.xls",0)
    $1sheet = _ExcelSheetNameGet($1)
    _ExcelSheetMove($oExcel, $1sheet)
    _ExcelBookClose($1)

    [/autoit] [autoit][/autoit] [autoit]

    $2 = _ExcelBookOpen("C:\Kam Kunden.xls",0)
    $2sheet = _ExcelSheetNameGet($2)
    _ExcelSheetMove($oExcel, $2sheet)
    _ExcelBookClose($2)

    [/autoit] [autoit][/autoit] [autoit]

    $3 = _ExcelBookOpen("C:\Gebiete.xls",0)
    $3sheet = _ExcelSheetNameGet($3)
    _ExcelSheetMove($oExcel, $3sheet)
    _ExcelBookClose($3)

    [/autoit] [autoit][/autoit] [autoit]

    $4 = _ExcelBookOpen("C:\Top Kunden.xls",0)
    $4sheet = _ExcelSheetNameGet($4)
    _ExcelSheetMove($oExcel, $4sheet)
    _ExcelBookClose($4)

    [/autoit] [autoit][/autoit] [autoit]

    $5 = _ExcelBookOpen("C:\Marken.xls",0)
    $5sheet = _ExcelSheetNameGet($5)
    _ExcelSheetMove($oExcel, $5sheet)
    _ExcelBookClose($5)

    [/autoit] [autoit][/autoit] [autoit]

    _ExcelBookSaveAs($oExcel, "C:\blaaaa.xls")
    _ExcelBookClose($oExcel)

    [/autoit] [autoit][/autoit] [autoit][/autoit]
  • hey, ich bins nochmal.

    nachdem ich jetzt _ExcelSheetMove($oExcel, $vMoveSheet, $vRelativeSheet= 1, $fBefore = True) verstanden habe, weiss ich, dass es mir nicht bei meinem prob weiterhelfen wird, da es nur für 1 datei gilt.
    man müsste also irgendwie die funktion umschreiben ... was aber (für mich) nicht so leicht sein würde.

    leider habe ich sonst keine passendes UDF gefunden. (ausser vllt. a la c&p, wobei ich das irgendwie nicht so gut finde).

    das wäre die funktion, meint ihr das ist möglich für 2 exceldateien anzupassen, so dass man 1 sheet aus der einen datei in die andere verschieben/kopieren kann?

    Spoiler anzeigen
    [autoit]

    ;
    ; Description: Move the specified sheet before another specified sheet.
    ; Syntax: _ExcelSheetMove($oExcel, $vMoveSheet, $vBeforeSheet)
    ; Parameter(s): $oExcel - An Excel object opened by a preceding call to _ExcelBookOpen() or _ExcelBookNew()
    ; $vMoveSheet - The name or number of the sheet to move (a string or integer)
    ; $vRelativeSheet - The moved sheet will be placed before or after this sheet (a string or integer, defaults to first sheet)
    ; $fBefore - The moved sheet will be placed before the relative sheet if true, after it if false (True or False) (default=True)
    ; Requirement(s): None
    ; Return Value(s): On Success - Returns 1
    ; On Failure - Returns 0 and sets @error on errors:
    ; @error=1 - Specified object does not exist
    ; @error=2 - Specified sheet number to move does not exist
    ; @error=3 - Specified sheet name to move does not exist
    ; @error=4 - Specified relative sheet number does not exist
    ; @error=5 - Specified relative sheet name does not exist
    ; Author(s): SEO <locodarwin at yahoo dot com>
    ; Note(s): None
    ;
    ;===============================================================================
    Func _ExcelSheetMove($oExcel, $vMoveSheet, $vRelativeSheet = 1, $fBefore = True)
    Local $aSheetList, $iFoundMove = 0, $iFoundBefore = 0
    If NOT IsObj($oExcel) Then Return SetError(1, 0, 0)
    If IsNumber($vMoveSheet) Then
    If $oExcel.ActiveWorkbook.Sheets.Count < $vMoveSheet Then Return SetError(2, 0, 0)
    Else
    $aSheetList = _ExcelSheetList($oExcel)
    For $xx = 1 To $aSheetList[0]
    If $aSheetList[$xx] = $vMoveSheet Then $iFoundMove = $xx
    Next
    If NOT $iFoundMove Then Return SetError(3, 0, 0)
    EndIf
    If IsNumber($vRelativeSheet) Then
    If $oExcel.ActiveWorkbook.Sheets.Count < $vRelativeSheet Then Return SetError(4, 0, 0)
    Else
    $aSheetList = _ExcelSheetList($oExcel)
    For $xx = 1 To $aSheetList[0]
    If $aSheetList[$xx] = $vRelativeSheet Then $iFoundBefore = $xx
    Next
    If NOT $iFoundBefore Then Return SetError(5, 0, 0)
    EndIf
    If $fBefore Then
    $oExcel.Sheets($vMoveSheet).Move($oExcel.Sheets($vRelativeSheet))
    Else
    $oExcel.Sheets($vMoveSheet).Move(Default, $oExcel.Sheets($vRelativeSheet))
    EndIf
    Return 1
    EndFunc ;==>_ExcelSheetMove

    [/autoit] [autoit][/autoit] [autoit][/autoit]
    • Offizieller Beitrag

    Hi,möchtest du erst mal selber probieren ?

    Hier der Weg den ich gehen würde:
    - $oExcel_1 erstellen für erste Exceldatei
    - $oExcel_2 erstellen für zweite Exceldatei

    Die verwendeten Methoden kannst du dann analog einsetzen, immer in Relation zu dem gewünschten Objekt.

    Hoffe, der Ansatz hilft dir weiter.

    • Offizieller Beitrag

    So, habs nun doch noch gemacht. Ist ja nicht so viel.
    Habe keine Sicherheitsabfragen drin (z.B. ob $Anzahl > Anzahl der vorhandenen Sheets). Ging mir nur drum zu zeigen wie ( und dass :D ) es geht.

    Spoiler anzeigen
    [autoit]

    $sFilePath1 = "D:\Mappe1.xls" ; Quelle
    $sFilePath2 = "D:\Mappe2.xls" ; Ziel
    $Anzahl = 5 ; Anzahl der zu verschiebenden Sheets
    $oExcel = ObjCreate("Excel.Application")
    $oWBook1 = $oExcel.Workbooks.Open($sFilePath1)
    $oWBook2 = $oExcel.Workbooks.Open($sFilePath2)
    For $i = 1 To $Anzahl
    $oWBook1.Sheets(1).Move($oWBook2.Sheets(1))
    Next
    $oExcel.DisplayAlerts = False
    $oExcel.Save
    $oExcel.Application.Quit
    $oExcel = ''

    [/autoit]


    $oWBook1.Sheets(1) : Es wird immer von vorn verschoben (Index 1).
    $oWBook2.Sheets(1) : Es wird immer vorn angefügt (Index 1).
    Die Indexe sind 1-basiert. Du kannst natürlich auch einen Zähler setzen und dann an bestimmter Position einfügen.

    In dieser Einstellung läuft alles 'Hide' ab. Die Aufforderung zum Speichern habe ich unterdrückt.

    Viel Spaß!

  • also die sheets, die ich verschiebe, da ist je nur 1 blatt drin.
    in der datei wo es dann hingeht (da muss ich ne neue datei erstellen), habe ich dann die üblichen 3 sheets, da nacher hinten dran sind.
    wollte die tage mal probieren ob ich die löschen kann, aber stören tuts auch keinen.

    hab aber das ganze script heut schon getestet und es läuft alles rund, im grunde kanns auch so bleiben =)