Update der Excel UDF die mit AutoIt ausgeliefert wird - 2014-03-22 - Fünfte Beta verfügbar

  • Ich bin daran, die mit AutoIt ausgelieferte Excel UDF anzupassen/zu erweitern. In den Foren gibt es viele Fragen zu Excel und manchmal sogar etwas Code.
    In diesem Thread auf dem engl. Forum möchte ich die Punkte diskutieren.
    Ich habe ein paar Ideen für die gevoted werden kann, nehme aber auch neue Vorschläge auf. Realisiert wird dann, was die meisten Punkte hat.

    2012-10-28:
    Die zweite Alpha Version der Excel UDF ist nun verfügbar. Diese Alpha ist ein komplettes Rewrite d.h. sie läuft garantiert nicht mit bestehenden Skripten.
    Diese Alpha Version soll zeigen, wie die Skript Breaking Changes aussehen aber auch, welche neuen Möglichkeiten die neu geschriebene UDF bietet.
    Es ist noch sehr viel Platz für Diskussionen bevor die UDF in AutoIt übernommen wird.

    2012-11-03:
    Die dritte Alpha Version der Excel UDF ist nun verfügbar.
    Ein paar neue Funktionen sind hinzugekommen.
    Es ist noch sehr viel Platz für Diskussionen bevor die UDF in AutoIt übernommen wird.

    2013-05-11:
    Die vierte Alpha ist nun verfügbar.

    2013-05-29:
    Die fünfte Alpha ist nun verfügbar.

    2013-06-24:
    Die sechste Alpha ist nun verfügbar.

    2013-07-26:
    Die siebte Alpha ist nun verfügbar.

    2013-08-04:
    Die achte - und letzte - Alpha ist nun verfügbar.

    2013-08-15:
    Die erste Beta ist nun verfügbar.

    2013-09-21:
    Die zweite Beta ist nun verfügbar.

    2013-10-31:
    Die dritte Beta ist nun verfügbar.

    2014-01-06:
    Die vierte Beta ist nun verfügbar.

    2014-03-22:
    Die fünfte Beta ist nun verfügbar.
    Kommentare sind willkommen!

    Link zur neuen Version.

  • Jetzt funzt der Link.

  • Kann es echt sein, dass kein Mensch Wünsche, Anregungen, Beschwerden zum Excel UDF hat?
    Das wäre nun hier die Change lange vermisste Funktionen einbauen zu lassen oder lahme Funktionen durch performantere Versionen zu ersetzen etc.

  • Hi,

    ich hätte da noch 3 Funktionen, die ich mir mal gebastelt hatte. Ob sinnvoll oder nicht, muss jeder selbst entscheiden :D

    Spoiler anzeigen
    [autoit]


    ;Spaltenbuchstabe durch -zahl ersetzen
    ;_ExcelColNum("A") = 1

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

    Func _ExcelColNum($num)
    if isint($num) Then
    return $num
    Else
    $cnt = StringLen($num)
    $plus = 0
    $num = StringUpper($num)
    if $cnt = 2 Then $plus = (asc(stringleft($num,1))-64) * 26
    $str = asc(StringRight($num,1)) -64
    $num = $str + $plus
    EndIf
    return $num
    EndFunc

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

    ;Spalten verschieben
    ;Kombinierbar mit oberer Funktion: _ExcelColMove($ofile,_ExcelColNum("A"),_ExcelColNum("B"))

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

    Func _ExcelColMove($oExcel, $from, $to)
    $ary = _ExcelReadSheetToArray($oExcel,1,$from,0,1)
    _ExcelColumnDelete($oExcel,$from)
    _ExcelColumnInsert($oExcel,$to)
    for $i = 1 to ubound($ary)-1
    _ExcelWriteCell($oExcel,$ary[$i][1],$i,$to)
    Next
    $ary = ""
    EndFunc

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

    ;Textdatei in Excel schreiben
    func _txt2xls($src,$dest)
    local $var = $src
    local $ary
    $ofile = _ExcelBookOpen($dest,0)
    $ary = StringSplit($var,@LF)
    for $i = 1 to $ary[0]
    if StringInStr($ary[$i],chr(9)) Then
    $str = StringSplit($ary[$i],chr(9))
    for $z = 1 to $str[0]
    _ExcelWriteCell($ofile,$str[$z],$i,$z)
    Next
    Else
    _ExcelWriteCell($ofile,$ary[$i],$i)
    EndIf
    Next
    _ExcelBookSave($ofile)
    _ExcelBookClose($ofile)
    EndFunc

    [/autoit]

    Gruß
    x0r

    Simon nörgelt, Simon nervt - aber Simon verbessert die Welt. Glaubt er.

  • Eine Funktion zum import von CSV Daten in Excel wäre echt nice,
    bzw. eine Performantere Lösung von

    [autoit]

    _ExcelWriteSheetFromArray

    [/autoit]
  • x0r,
    Danke für die Funktionen. Ich denke, in der einen oder anderen Form werden wir das in das UDF einbauen.
    Gruß
    water

  • TheLuBu,
    Danke für die Ideen.
    Ich werde versuchen _ExcelBookOpen so aufzubohren, dass es auch CSV etc. akzeptiert.
    Eine schnellere Version von _ExcelWriteSheetFromArray gibt es und muss auf jeden Fall rein in die UDF.

    Gruß
    water

  • Hi,

    Kann es echt sein, dass kein Mensch Wünsche, Anregungen, Beschwerden zum Excel UDF hat?

    Tja, da kann ich eigentlich nicht viel zu beitragen. Ich beschäftige mich erst seit ca. drei Monaten mit Excel und seit ca. sechs Wochen mit VBA.
    Ich versuche immer noch mich an diese hässliche VB-Syntax zu gewöhnen ... :S
    Das ist aber nicht das Problem, sondern der Methoden-Dschungel. :D

    Trotzdem hätte ich eine kleine Anregung.
    Ohne jetzt nach einer bereits vorhandenen zu schauen: eine Suchfunktion wäre was tolles.
    Also Dateien durchsuchen und in diesen nach Werten in bestimmten Zellen/Bereichen zu suchen.
    Wobei auch nach Teilwerten/-strings, Formaten etc. gesucht werden kann.


    Gruß
    Greenhorn


    • Offizieller Beitrag

    Die Umwandlung Spaltenadresse zu Nummer und umgekehrt hatte ich auch mal geschrieben, vllt. hast du Verwendung:

    [autoit]

    ; === Excel - Spaltenadresse zu Nummer
    Func __LetterToColNr($sLetter)
    ; by BugFix
    If Not StringRegExp($sLetter, '[a-zA-Z]{1,2}') Then Return SetError(1,0,-1)
    If StringLen($sLetter) = 1 Then Return Asc(StringUpper($sLetter)) -64
    Return (Asc(StringUpper(StringLeft($sLetter, 1)))-64)*26 + (Asc(StringUpper(StringRight($sLetter, 1)))-64)
    EndFunc

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

    ; === Excel - Spaltennummer zu Adresse
    Func __ColNrToLetter($iColNr)
    ; by BugFix
    If $iColNr <= 26 Then Return Chr($iColNr+64)
    $iColNr -= 26
    Local $1 = 65, $2 = 90, $tmp, $diff = 1
    $tmp = Mod($iColNr,26)
    If $tmp Then
    $2 = 64 +$tmp
    $diff = 0
    EndIf
    $1 += Int($iColNr/26) - $diff
    Return Chr($1) & Chr($2)
    EndFunc

    [/autoit]

    ..und _ExcelBookNew() hatte ich auch mal modifiziert um beim Erstellen die Anzahl der Tabellenblätter gleich festzulegen:

    Spoiler anzeigen
    [autoit]

    ; #FUNCTION# ====================================================================================================================
    ; Name...........: __ExcelBookNew
    ; Description ...: Creates new workbook and returns its object identifier.
    ; Syntax.........: $oExcel = _ExcelBookNew($fVisible = 1, $iSheetsStartup = 1)
    ; Parameters ....: $fVisible - Flag, whether to show or hide the workbook (0=not visible, 1=visible)
    ; $iSheetsStartup - Count of sheets at startup
    ; Return values .: Success - Returns new object identifier
    ; Failure - Returns 0 and Sets @Error:
    ; |1 - Unable to create the Excel COM object
    ; |2 - $fVisible parameter is not a number
    ; Author ........: SEO <locodarwin at yahoo dot com>
    ; Modified.......: litlmike, BugFix
    ; Remarks .......:
    ; Related .......:
    ; Link ..........;
    ; Example .......; Yes
    ; ===============================================================================================================================
    Func __ExcelBookNew($fVisible = 1, $iSheetsStartup = 1)
    ; Original in Excel.au3
    ; modified by BugFix
    Local $oExcel = ObjCreate("Excel.Application")
    If Not IsObj($oExcel) Then Return SetError(1, 0, 0)
    If Not IsNumber($fVisible) Then Return SetError(2, 0, 0)
    If $fVisible > 1 Then $fVisible = 1
    If $fVisible < 0 Then $fVisible = 0
    If $iSheetsStartup < 1 Then $iSheetsStartup = 1
    With $oExcel
    .SheetsInNewWorkbook = $iSheetsStartup
    .Visible = $fVisible
    .WorkBooks.Add
    .ActiveWorkbook.Sheets(1).Select ()
    EndWith
    Return $oExcel
    EndFunc ;==>__ExcelBookNew

    [/autoit]
  • Hallo BugFix,
    danke für die Skripte. Werde ich auf der engl. Seite zur Diskussion stellen.
    Sehe ich das richtig, dass die Umrechnungsfunktionen (Buchstabe<->Spaltennummer) nur mit zwei-stelligen Spalten zurecht kommen? Bei Excel 2010 geht die Spaltennumemr bis "XFD".

  • Ich habe die erste Alpha Version der neuen Excel UDF im engl. Forum gepostet.
    Bitte spielt damit und sagt mir, was passt, was fehlt oder ob es Probleme gibt.

    Je mehr Feedback umso besser!

  • Im engl. Forum habe ich eine Umfrage gestartet.
    Damit will ich sehen, wie häufig die UDF eingesetzt wird, welche Funktionen hauptsächlich verwendet werden und ob "script breaking changes" - also Änderungen die eine Anpassung der Skripte notwendig machen - für die Benutzer ein Problem sind.
    Damit die UDF neue Filetypen und Funktionen unterstützt und besser performed müssen ein paar Designänderungen vorgenommen werden, die leider zu diesen "script breaking changes" führen.

    Bitte nehmt an dieser Umfrage teil, damit ich ein möglichst umfassendes Bild bekomme und darauf dann meine Entscheidungen aubauen kann!
    Danke

  • Die Umfrage soll mir helfen zu entscheiden, ob die nächste Version des mit AutoIt mitgelieferten Excel UDFs kompatibel zur bisherigen Version sein soll/muss oder ob ich einen kompletten rewrite erstellen kann, ohne dass mir dann alle bisherigen Benutzer an den Kragen wollen

    Bitte nehmt an dieser Umfrage teil, damit ich ein möglichst umfassendes Bild bekomme und darauf dann meine Entscheidungen aubauen kann!

    Danke

  • Hi,
    ich nutze die Excel-UDF schon seit Jahren - und habe auch einige Excel-Automatisierungen für z.B. Abrechnungshilfen erstellt. Sollten jetzt 'Script breaking changes' auftreten währe es nicht sooo schlimm, weil die Programme eh Kompiliert wurden. ABER sollten dort iwann Änderungen durchgeführt werden müssen - könnte es einem vor Schwierigkeiten stellen...

    Aber die Geschwindigkeit von Excel selber stellt meiner Meinung das größte Problem dar, wenn ich ein Array in der größe von 10000 Zeilen zu 200 spalten mit '_ExcelWriteSheetFromArray' nach Excel übertragen muß - kannste dir erstmal ´ne Pizza kaufen gehen... Dann MUSS ich den Umweg über eine CSV-Datei nehmen und anschliessend mit (nicht vorhanden UDF-Funktionen) die Formatierung wieder anpassen. Das ist immer etwas Nervig :D --> Ich sehe gerade das du im engl Forum bereits darauf eingingst;)

    Joaaa, wenn du die vielen Codeschnippsel mit in die 'neue' UDF einbringst und dazu die fehlenden Objekt-Befehle (z.B. $Obj.Interior.Color) als Funktionen verfügbar machst - denke ich das die neue UDF wirklich gut werden kann!

    Grüsse!

  • Hi Techmix,

    danke für die Rückmeldung.
    Stimmt, für compilierte Skripte sind die "script breaking changes" kein Problem. Muss die Source aber geändert werden, dann gibt es zwei Möglichkeiten:

    • Skript an die neue UDF anpassen
    • die alte UDF in das Skriptverzeichnis kopieren und weiterverwenden

    Ich hoffe nur, dass ich ein eindeutiges Ergebnis mit ausreichend Beteiligung bekomme, damit ich dann die Entwickler überzeugen kann, dass ein rewrite notwendig ist.

    • Offizieller Beitrag

    Ich habe gerade in einem Hilfethread ein Handling für wahlweises Öffnen oder referenzieren, wenn bereits geöffnete für Workbooks gepostet.
    Nun habe ich daraus noch eine Funktion erstellt, vielleicht auch von Interesse:

    [autoit]

    ;===============================================================================
    ; Function Name....: _ExcelBook_OpenRefer
    ; Description......: - Opens an ExcelBook in existing Excel-Application
    ; .................: - Opens an ExcelBook in new Excel-Application if no Excel runs
    ; .................: - Refers to an always opened ExcelBook
    ; Parameter(s).....: $_sPath Path to the ExcelBook
    ; .................: $_fVisible WorkBook is visible (1=default)
    ; Return Value(s)..: Reference to the Excel object
    ; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
    ;===============================================================================
    Func _ExcelBook_OpenRefer($_sPath, $_fVisible=1)
    Local $oBook, $fOpen = False, $oExcel = ObjGet('', 'Excel.Application')
    If @error Then
    $oExcel = ObjCreate("Excel.Application")
    $oExcel.Visible = $_fVisible
    $oBook = $oExcel.Workbooks.Open($_sPath)
    Else
    $oBook = $oExcel.WorkBooks
    For $book In $oBook
    If $book.Path & '\' & $book.Name = $_sPath Then
    $oBook($book.Name).Activate
    $oExcel.Visible = $_fVisible
    $fOpen = True
    ExitLoop
    EndIf
    Next
    If Not $fOpen Then
    $oExcel.Visible = $_fVisible
    $oBook = $oExcel.Workbooks.Open($_sPath)
    EndIf
    EndIf
    Return $oExcel
    EndFunc ;== _ExcelBook_OpenRefer

    [/autoit]
  • Hi BugFix,
    danke für das Skript!

    Ich hab's bereits so gelöst, dass immer ein _Excel_Open gemacht werden muss (das started Excel oder hängt sich an eine bereits laufende Instanz). Mit _Excel_BookAttach kann man sich dann an ein bestehendes Workbook dranhängen (diese Funktion gab's vorher auch schon).
    Die Funktionen im neuen Excel UDF sollen klar umrissende Aufgaben erfüllen und nicht implizit alle möglichen Aktionen starten. Ein klares Design ist mir wichtig, damit die UDF erweiterbar bleibt und auch mit zukünftigen Excel Versionen klar kommt.

    Die zweite Alpha (sprich den kompletten Rewrite der UDF) habe ich gestern hier gepostet.

    Für Code und/oder Anregungen bin ich jederzeit dankbar!
    Schönes WE
    Water