Excel & AutoIt

  • Moin Moin zusammen.

    Ich habe eine Telefon und Geburtstagsliste in Excel: Name;Telefon;Geburtstag.

    Wenn ich nach dem Namen in Spalte-A suche, soll er mir die Telefonnummer und das Geburtsdatum in eine MsgBox ausgeben.

    Hat jemand ein Beispiel, wie man das machen kann?

    Lieben Gruß,
    Alina

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

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Warum den Umweg über Autoit?

    Weil im Grunde macht man das pur in Excel oder mit _ExcelReadSheetToArray und du arbeitest dann nur noch mit dem Array.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Moin Chip.

    Ich habe zum Verständnis versucht das Beispielscript auf der Hilfe zu staren, aber schon da kommt ich nicht weiter, da das nicht funktioniert. Sonst wollte ich mich da durcharbeiten.

    Ich wollte ja dann mit den Arrays arbeiten, wie DU gesagt hast.
    .
    Mir würde es reichen, wenn ich ein Beispiel hätte. Hat jemand ein Solches?

    Lieben Gruß,
    Alina

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

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Mit Office 2013 läuft das Beispiel auch problemlos.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Ich verwende Excel 2007

    Ich habe die "_ExcelReadSheetToArray" ein zu ein kopiert und in SciTE eingefügt und dann gestartet und er sagt: undefined Funktion.

    "C:\Users\alina_hl_danmark\Desktop\test.au3"(4,31) : error: _ExcelBookNew(): undefined function.
    Local $oExcel = _ExcelBookNew()
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
    "C:\Users\alina_hl_danmark\Desktop\test.au3"(9,71) : error: _ExcelWriteCell(): undefined function.
    _ExcelWriteCell($oExcel, Round(Random(1000, 10000), 0), $x, $y)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
    "C:\Users\alina_hl_danmark\Desktop\test.au3"(13,47) : error: _ExcelReadSheetToArray(): undefined function.
    Local $aArray = _ExcelReadSheetToArray($oExcel)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
    "C:\Users\alina_hl_danmark\Desktop\test.au3"(34,62) : error: _ExcelBookSaveAs(): undefined function.
    _ExcelBookSaveAs($oExcel, @TempDir & "\Temp.xls", "xls", 0, 1)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
    "C:\Users\alina_hl_danmark\Desktop\test.au3"(35,24) : error: _ExcelBookClose(): undefined function.
    _ExcelBookClose($oExcel)
    ~~~~~~~~~~~~~~~~~~~~~~~^


    Stehe da irgendwie auf einem Schlauch ! :(

    Lieben Gruß,
    Alina

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

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Hi,
    schau mal beim User water in die Signatur, dort ist ein Link für die "neue" Excel-UDF!

    Ausserdem habe ich festgestellt, dass eine SQL-Datenbankabfrage auf ein Excel-File
    1. sauschnell
    2. flexibel
    ist, und
    3. bei Bedarf auch alle Daten in einem Array zurückgibt!

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    Einmal editiert, zuletzt von Andy (15. Dezember 2014 um 17:21)

  • @Andy der Hinweis ist unnötig ;). Sie nutzt Version 3.3.12.0 und da ist die neue Excel-UDF bereit drin. Zitat: "This UDF is now part of AutoIt since 3.3.12.0."

    Sieht eher so aus als wäre ihre Autoit-Installation zerschossen. Neu Installieren sollte das Problem beheben.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Hey Alina

    wenn du tatsächlich die aktuelle excel-udf verwendest, dann sind deine Funktionen einfach nur falsch geschrieben.

    mach mal aus: _ExcelBookNew()
    folgendes: _Excel_BookNew()

    Das gilt für alle Excelfunktionen. Also aus jedem _ExcelBlablabla ein _Excel_blabla machen.
    Vermutlich verwendest du die deutsche Hilfe? In der wurde das noch nicht geändert.

  • Eine genaue Gegenüberstellung der beiden UDF Versionen findet sich hier.

  • Moin Moin-

    Habe meinen Fehler bereits bemerkt.
    Ich arbeite ja so, das ich bei einem deutschen Forum die deutsche Hilfe nutze, bei einem englischen dann die englische und da war das Problem wie oben schon vermutet.
    Wenn ich was im deutschen nicht verstehe, dann schaue ich eigentlich auch in der englischen Hilfe nach, nur verstand ich den Text und hielt es nicht für notwenig, noch mal auf englisch das gleich zu lesen.

    Da wir ein neues Rechtsprojekt reinbekommen haben, werde ich wohl die nächsten Tage schauen müssen, wie ich mich um das Thema Excel-AutoIt kümmern kann, aber ich bleibe am Ball. ;) Ein Rechtsprojekt mal wieder mit Hotelaufenthalt. Planzeit sechs mal sechs Tage in Folge. Also sechs Wochen, Sonne am siebten Tag. ;)

    Lieben Gruß,
    Alina

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

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Moin Moin zusammen.

    Jetzt bin ich schon so weit mit der Testdatei die ich erstellt habe, das eigentlich nur noch ZWEI Fragen offen sind.

    Das Script schaut derzeitig so aus und ich weiß, das es ein heiles durcheinander ist.

    Spoiler anzeigen
    [autoit]


    #include <Excel.au3>
    #include <MsgBoxConstants.au3>

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

    ; Create application object and open an example workbook
    Local $sWorkbook = @ScriptDir & "\test.xlsx"
    Local $oAppl = _Excel_Open()
    If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_BookAttach Example", "Error creating the Excel application object." & @CRLF & "@error = " & @error & ", @extended = " & @extended)
    Local $oWorkbook = _Excel_BookOpen($oAppl, $sWorkbook)
    If @error Then
    MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_BookAttach Example", "Error opening workbook '" & $sWorkbook & "'." & @CRLF & "@error = " & @error & ", @extended = " & @extended)
    _Excel_Close($oAppl)
    Exit
    EndIf

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

    ; *****************************************************************************
    ; Attach to the first Workbook where the file path matches
    ;DIREKT EINE ZELLE ANSPRECHEN
    ; *****************************************************************************
    $oWorkbook = _Excel_BookAttach($sWorkbook)
    If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_BookAttach Example 1", "Error attaching to '" & $sWorkbook & "'." & @CRLF & "@error = " & @error & ", @extended = " & @extended)
    MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_BookAttach Example 1", "Search by 'filepath':" & @CRLF & @CRLF & "Successfully attached to Workbook '" & $sWorkbook & "'." & @CRLF & @CRLF & "Ausgelesener Wert aus A3: " & $oWorkbook.Activesheet.Range("A3").Value)

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

    ; *****************************************************************************
    ; Display a list of all worksheets for a specific Workbook
    ; TABELLENBLATTNAME
    ; *****************************************************************************
    Local $aWorkSheets = _Excel_SheetList($oWorkbook)
    If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_SheetList Example 1", "Error listing Worksheets." & @CRLF & "@error = " & @error & ", @extended = " & @extended)
    _ArrayDisplay($aWorkSheets, "Excel UDF: _Excel_SheetList Example 1")

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

    ; *****************************************************************************
    ; Find all occurrences of value "Adelbybek" (partial match)
    ; SUCHT NACH "ADELBYBEK"
    ; *****************************************************************************
    Local $aResult = _Excel_RangeFind($oWorkbook, "Adelbybek")
    If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_RangeFind Example 1", "Error searching the range." & @CRLF & "@error = " & @error & ", @extended = " & @extended)
    MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_RangeFind Example 1", "Find all occurrences of value 'Adelbybek' (partial match)." & @CRLF & "Data successfully searched.")
    _ArrayDisplay($aResult, "Excel UDF: _Excel_RangeFind Example 1", "", 0, "|", "Sheet|Name|Cell|Value|Formula|Comment")
    MsgBox(0,"Adelbybek", $aResult[0][2])

    [/autoit]


    Die Excel-Test-Daten sind Nacholgende. die Originalen kann ich auf Grund von Datenschutzbestimmungen nicht verwenden. Name;Telefon;Geburtstag habe ich paar Daten aus einer Falk-Liste genommen.
    Es geht ja auch um das Prinzip und nicht um die Daten.

    Spoiler anzeigen
    [autoit]


    Straßenname Falkplan|links|rechts
    Abt-Nikolaus-Pfad|A|M3
    Adelbybek|A|T6
    Adelbyer Kirchenweg|K|5W

    [/autoit]

    1. Frage:
    Wie mache ich das, das die Exceldatei sogesagt im Hintergrund geöffnet wird, also das man es verstelt macht. Habe es in der Hilfe gesehen, aber ich bekomme das irgendwie nicht hin.

    2. Frage:
    In der letzten MsgBox wird ausgegeben wo die gesuchte Celle gefunden wird, also $A$3. Okay, das ist ja auch richtig. Nun aber ist in der Excel-Datei ja rechts neben $A$3 zwei weitere Angaben, nämlich $B$3 und $C$3. Wie bekomme ich diese untereinander in eine MsgBox ausgegeben?
    Mein Kopf sagt mir nun, einfach den Buchstaben der zwischen den beiden $-Zeichen steht austauschen. EInmal mit den B und einmal mit dem C. Theo sagt "Das sollte gehen", aber wie gesagt, das sagt Theo(retisch). Nur wie? Eigentlich doch ein klarer Fall für Oscar und StringRegExp?  :D

    Mir fällt gerade so ein, das man ja das "$aResult" wie folgt splitten könnte, aber wie dann dazu kommen, das er aus dem A ein B macht und dann das aus der Celle rechts daneben einlesen?

    Spoiler anzeigen
    [autoit]


    -Gedanke war Müll. Habe besseres gefunden in meinen Hirnwindungen. ;)

    [/autoit]

    Habe etwas besseres gefunden: StringReplace

    Spoiler anzeigen
    [autoit]


    Local $text = StringReplace($aResult[0][2], "$A$", "$B$")
    Local $numreplacements = @extended
    Local $text2 = StringReplace($aResult[0][2], "$A$", "$C$")
    Local $numreplacements2 = @extended
    MsgBox(0, "Die beiden neuen Strings, die nun aus der Excel-Tabelle ausgelesen werden soll: ", $text & @CR & $text2)

    [/autoit]

    Ja, jetzt brummt mein Kopf, wobei er wo ganz anders brummen sollte. oh manno.

    Lieben Gruß,
    Alina

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

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

    5 Mal editiert, zuletzt von Alina (17. Dezember 2014 um 15:09)

  • 1) _Excel_Open hat einen $bVisible Parameter
    2) $RechteZelle = $oWorbkook.ActiveSheet.Range("$A$3").Ofset(0, 1) ; Gibt $B$4 zurück (Range Objekt)

  • BTW: Du verwendest _Excel_BookOpen UND _Excel_BookAttach.
    Nur eines davon wird benötigt (sonst gibt es Probleme beim Ende des Skriptes).
    Der zweite Befehl ist notwendig, wenn Du das Excel Workbook nicht selbst öffnest sondern Dich an ein bereits geöffnetes dranhängen möchtest.

  • :party: O le oleeeeeeeeeee. Ich glaub ich tanz gleich in Berlin oder doch lieber gleich in Wieeeeeen. :party:


    Gute Laune.

    Ich glaube ich habe die Lösung selber gefunden. Aber schmeißt selber ein Blick drauf. Wie ich das hin bekommen habe?
    Es gibt doch die Hilfe-Datei, da habe ich dann ordentlich gelesen und ausprobiert. Dieser kleine Tritt in den Popo mit dem Hinweis auf den Beitrag der hier am Montag, 22:11 und Montag, 23:50 gepostet wurde behob den grundsätzlichen Fehler und der Rest war viel lesen und verstehen und überlegen.

    Und hier nun das Script:

    Spoiler anzeigen
    [autoit]


    #include <Excel.au3>
    #include <MsgBoxConstants.au3>

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

    ; Create application object and open an example workbook
    Local $sWorkbook = @ScriptDir & "\test.xlsx"
    Local $oAppl = _Excel_Open()
    If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_BookAttach Example", "Error creating the Excel application object." & @CRLF & "@error = " & @error & ", @extended = " & @extended)
    Local $oWorkbook = _Excel_BookOpen($oAppl, $sWorkbook)
    If @error Then
    MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_BookAttach Example", "Error opening workbook '" & $sWorkbook & "'." & @CRLF & "@error = " & @error & ", @extended = " & @extended)
    _Excel_Close($oAppl)
    Exit
    EndIf

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

    ; *****************************************************************************
    ; Attach to the first Workbook where the file path matches
    ;DIREKT EINE ZELLE ANSPRECHEN
    ; *****************************************************************************
    $oWorkbook = _Excel_BookAttach($sWorkbook)
    If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_BookAttach Example 1", "Error attaching to '" & $sWorkbook & "'." & @CRLF & "@error = " & @error & ", @extended = " & @extended)
    MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_BookAttach Example 1", "Search by 'filepath':" & @CRLF & @CRLF & "Successfully attached to Workbook '" & $sWorkbook & "'." & @CRLF & @CRLF & "Ausgelesener Wert aus A15: " & $oWorkbook.Activesheet.Range("A15").Value)

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

    ; *****************************************************************************
    ; Display a list of all worksheets for a specific Workbook
    ; TABELLENBLATTNAME
    ; *****************************************************************************
    Local $aWorkSheets = _Excel_SheetList($oWorkbook)
    If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_SheetList Example 1", "Error listing Worksheets." & @CRLF & "@error = " & @error & ", @extended = " & @extended)
    _ArrayDisplay($aWorkSheets, "Excel UDF: _Excel_SheetList Example 1")

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

    ; *****************************************************************************
    ; Find all occurrences of value "Alsterbogen" (partial match)
    ; SUCHT NACH "Alsterbogen"
    ; *****************************************************************************
    Local $aResult = _Excel_RangeFind($oWorkbook, "Alsterbogen")
    If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_RangeFind Example 1", "Error searching the range." & @CRLF & "@error = " & @error & ", @extended = " & @extended)
    MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_RangeFind Example 1", "Find all occurrences of value 'Alsterbogen' (partial match)." & @CRLF & "Data successfully searched.")
    _ArrayDisplay($aResult, "Excel UDF: _Excel_RangeFind Example 1", "", 0, "|", "Sheet|Name|Cell|Value|Formula|Comment")

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

    Local $text = StringReplace($aResult[0][2], "$A$", "$B$")
    Local $numreplacements = @extended
    Local $text2 = StringReplace($aResult[0][2], "$A$", "$C$")
    Local $numreplacements2 = @extended
    MsgBox(0, "Der neue String, der nun aus der Exycel-Tabelle ausgelesen werden soll: ", $text & @CR & $text2)

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

    $sCellValue = _Excel_RangeRead($oWorkbook, Default, $text)
    $sCellValue2 = _Excel_RangeRead($oWorkbook, Default, $text2)
    MsgBox(0, "", "Die beiden Zellwerte sind: " & @CRLF & $sCellValue & @CRLF & "und" & @CRLF & $sCellValue2, 2)

    [/autoit]

    Lieben Gruß,
    Alina

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

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

    2 Mal editiert, zuletzt von Alina (17. Dezember 2014 um 16:24)

  • Local $oAppl = _Excel_Open(False)

  • BTW: Du verwendest _Excel_BookOpen UND _Excel_BookAttach.
    Nur eines davon wird benötigt (sonst gibt es Probleme beim Ende des Skriptes).
    Der zweite Befehl ist notwendig, wenn Du das Excel Workbook nicht selbst öffnest sondern Dich an ein bereits geöffnetes dranhängen möchtest.

    Jetzt frage ich mich, wie ich das umsetzen soll? ?(

    Lieben Gruß,
    Alina

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

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Du must erst mal die in Post #14 gestellt Frage beantworten.
    Willst Du das Workbook selbst durch Dein Skript öffnen oder auf ein vom Benutzer geöffnetes Workbook zugreifen?

  • water.
    Die Excel-Datei liegt geschlossen im gleichen Verzeichnis und wird nur durch das Script genutzt. Eine GUI scripte ich dann später noch, wo ich dann das erlerte dann anwenden möchte. Dazu soll eine Autovervollständigung auf den $A$ & si erfolgen.

    Das Script soll die Excel-Datei versteckt öffnen, dann ja auch das Workbook, wenn ich die Frage nun richtig verstehe. ABER es kann sein, das auf dem PC bereits Excel läuft, nur halt mit ganz anderen Dateien, als die in dem Script verwendeten.

    Frage beantwortet? ?(;(?(

    Lieben Gruß,
    Alina

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

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • [autoit]

    Global $sFilePath = "xxxx"
    $oExcel = _Excel_Open(False, False, True, True, True) ; Startet ein neue unsichtbare Instanz von Excel
    $oWorkBook = _Excel_BookOpen($oExcel, $sFilePath) ; Öffnet das Workbook
    ; Workbook verarbeiten
    _Excel_Close($oExcel, False) ; Beendet die Excel Instanz ohne das WOrkbook zu sichern

    [/autoit]