Excel Makro in Autoit umsetzen

  • Hallo liebe Community,
    Ich möchte gerne ein Makro, welches von einem ehemaligen Mitarbeiter in Excel verfasst wurde, in ein AutoIt Programm einbauen.

    Hier erstmal das Makro

    Spoiler anzeigen

    DIe Exceldatei, die wir mit diesem Makro umwandeln, wird an einen Auftraggeber gesendet und dort verarbeitet.
    Normalerweise würde ich jetzt testen, ob es klappt, aber das geht eben nicht, weil ich nicht weiß wie die datei verarbeitet wird.

    Hier der Code, den ich bis jetzt übersetzen konnte, aber nun komme ich nicht mehr weiter, da ich die Befehle nicht kenne

    Spoiler anzeigen
    [autoit]

    Dim $strTemp = ""

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

    $strMappenpfad = $oExcel.ActiveWorkBook.FullName
    $strMappenpfad = StringReplace($strMappenpfad, ".xls", ".csv")
    $strDateiname = InputBox("CSV-Export", "Wie soll die CSV-Datei heißen (inkl. Pfad)?", $strMappenpfad)
    If $strDateiname = "" Then Return SetError(1, 0, 0)
    $strTrennzeichen = InputBox("CSV-Export", "Welches Trennzeichen soll verwendet werden?", ",")
    If $strTrennzeichen = "" Then Return SetError(2, 0, 0)
    $Bereich = _ExcelSheetUsedRangeGet($oExcel, $vSheet)

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

    Open strDateiname For Output As #1

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

    For $i = 1 To $Bereich[3]
    For $k = 1 To $Bereich[2]
    $Inhalt = _ExcelReadCell($oExcel, $i, $k)
    If StringInStr($Inhalt, $strTrennzeichen) > 0 Then ; Zellen, die ein Trennzeichen beinhalten in Anführungsstriche setzen
    _ExcelWriteCell($oExcel, '"'&$Inhalt&'"'&$strTrennzeichen, $i, $k)
    Else
    _ExcelWriteCell($oExcel, $Inhalt&$strTrennzeichen, $i, $k)
    EndIf
    Next
    For Each Zeile In Bereich.Rows
    For Each Zelle In Zeile.Cells
    If InStr(1, Zelle.Text, strTrennzeichen) > 0 Then
    'Zellen, die ein Trennzeichen beinhalten in Anführungsstriche setzen
    strTemp = strTemp & """" & CStr(Zelle.Text) & """" & strTrennzeichen
    Else
    strTemp = strTemp & CStr(Zelle.Text) & strTrennzeichen
    End If
    Next
    If Right(strTemp, 1) = strTrennzeichen Then strTemp = Left(strTemp, Len(strTemp) - 1)
    Print #1, strTemp
    strTemp = ""
    Next

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

    Close #1
    Set Bereich = Nothing
    MsgBox "Datei wurde exportiert nach" & vbCrLf & strDateiname

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

    End Sub
    ;===============================================================================
    ;
    ; Description: Return the last cell of the used range in the specified worksheet.
    ; Syntax: $array = _ExcelSheetUsedRangeGet($oExcel, $vSheet)
    ; Parameter(s): $oExcel - An Excel object opened by a preceding call to _ExcelBookOpen() or _ExcelBookNew()
    ; $vSheet - The sheet name or number to be checked.
    ; Requirement(s): None
    ; Return Value(s): On Success - Returns an array of used range values:
    ; $array[0] - The last cell used, in A1 format (if 0 is returned, worksheet is blank)
    ; $array[1] - The last cell used, in R1C1 format
    ; $array[2] - The last column used, as an integer
    ; $array[3] - The last row used, as an integer
    ; On Failure - Returns 0 (as non-array numeric value) and sets @error on errors:
    ; @error=1 - Specified object does not exist
    ; @error=2 - Invalid sheet number
    ; @error=3 - Invalid sheet name
    ; Author(s): DaLiMan, MRDev, SEO <locodarwin at yahoo dot com>
    ; Note(s): Upon return, $array[0] will equal numeric value 0 if the worksheet is blank
    ;
    ;===============================================================================
    Func _ExcelSheetUsedRangeGet($oExcel, $vSheet)
    Local $aSendBack[4], $sTemp, $aSheetList, $fFound = 0
    If NOT IsObj($oExcel) Then Return SetError(1, 0, 0)
    If IsNumber($vSheet) Then
    If $oExcel.ActiveWorkbook.Sheets.Count < $vSheet Then Return SetError(2, 0, 0)
    Else
    $aSheetList = _ExcelSheetList($oExcel)
    For $xx = 1 To $aSheetList[0]
    If $aSheetList[$xx] = $vSheet Then $fFound = 1
    Next
    If NOT $fFound Then Return SetError(3, 0, 0)
    EndIf
    $oExcel.ActiveWorkbook.Sheets($vSheet).Select
    $aSendBack[0] = $oExcel.Application.Selection.SpecialCells($xlCellTypeLastCell).Address
    $aSendBack[1] = $oExcel.Application.Selection.SpecialCells($xlCellTypeLastCell).Address(True, True, $xlR1C1)
    $aSendBack[0] = StringReplace($aSendBack[0], "$", "")
    $sTemp = StringRegExp($aSendBack[1], "[RZ]([^CS]*)[CS](.*)",3)
    $aSendBack[2] = Number($sTemp[1])
    $aSendBack[3] = Number($sTemp[0])
    If $aSendBack[0] = "A1" And $oExcel.Activesheet.Range($aSendBack[0]).Value = "" Then $aSendBack[0] = 0
    Return $aSendBack
    EndFunc ;==>_ExcelSheetUsedRangeGet

    [/autoit]

    Ich würde mich über eine Eingebung freuen ;)

  • naja wenns so einfach wäre ;)
    1. Ist das ja nicht das was ich möchte, als csv. speichern liefert für die Weiterverarbeitung etwas falsches zurück, dafür brauchen wir ja das Makro
    2. Ist _ExcelBookSaveAs veraltet (funktioniert nicht mehr mit Office 2007+) durch eine Umstellung der Parameter (FileFormat wurde Pflicht)
    (vgl. _hier)

    Ich möchte das Makro in Autoit ausführen, nicht eine Exceldatei als csv. speichern ;)

  • ahhh ok,
    wir benutzen kein office 2007 oder höher!

    hab derzeit auch einige sachen mit excel gemacht, da hab ich die daten aber aus nen array geschrieben!

    gruß gmmg

  • Falls ihr mal 2007+ benutzen solltet,

    [autoit]

    With $oExcel
    .Application.DisplayAlerts = False
    .ActiveWorkBook.SaveAs("Dateipfad.xls", 56) ; 56 ist das Numberformat für xls Dateien
    .ActiveWorkBook.SaveAs("Dateipfad.csv", 6) ; 6 ist das Numberformat für csv Dateien
    .ActiveWorkbook.Close
    .Quit
    EndWith

    [/autoit]

    aber es hilft mir nicht weiter bei meinem Problem ;)