Excel Macro ausführen (mit ObjGet!)

  • Hallo Leute,

    ich habe hier eine kleine Herausforderung bei der ihr mir vielleicht helfen könnt.

    Ich habe ein Tool in Excel (VBA) geschrieben was jetzt in einer neuen Version mit AutoIT kombiniert werden soll um ggf. Daten aus einem anderen Programm auszulesen.

    Um ein Menü mit erweiterten Befehlen zu genieren habe ich mich für ein Formblatt mit "embedded" Excel entschieden. Somit entfällt für mich die Möglichkeit mit "ObjCreate" zu arbeiten. Stattdessen wird "ObjGet" verwendet.

    Und hier kommt mein Problem:

    Das bekannte funktioniert ohne Probleme

    [autoit]

    $oExcel = ObjCreate("Excel.Application")
    With $oExcel
    .Visible = 1
    .WorkBooks.Open(@DesktopDir & "\test.xls")
    .ActiveWorkBook.ActiveSheet.Cells(1,1).Value="test"
    .Run("Clear")
    EndWith

    [/autoit]

    In meinem Fall wird aber folgendes verwendet (gekürzt auf benötigte Codeanteile):

    [autoit]

    $filepath = @DesktopDir & "\test.xls"
    $excel = ObjGet($filepath)

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

    $pof = GUICreate("XXX - Welcome " & @UserName & " " & "- Today: " & " " & @MDAY & "." & @MON & "." & @YEAR , @DesktopWidth, @DesktopHeight, -1, -1, $WS_CLIPSIBLINGS _
    + $WS_SYSMENU + $WS_CAPTION + $WS_MAXIMIZEBOX + $WS_MINIMIZEBOX + $WS_THICKFRAME + $WS_SIZEBOX + $WS_GROUP + $WS_CLIPCHILDREN + $WS_MAXIMIZE)

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

    $GUI_ActiveX = GUICtrlCreateObj($excel, 0, 180, @DesktopWidth, @DesktopHeight)
    GUISetState(@SW_SHOW)

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

    Func GenerateClick()
    $excel.Run("Clear")
    $excel.Close
    GUIDelete()
    EndFunc

    [/autoit]

    Diese Variante wird dann immer mit folgender Fehlermeldung abgebrochen:
    ==> The requested action with this object has failed.:
    $excel.Run("Clear")
    $excel.Run("Clear")^ ERROR

    Hat von euch noch jemand eine Idee wie man das Macro ausführen kann, wenn ObjGet anstatt von ObjCreate verwendet wird?

    Vielen Dank im Voraus!

    Grüße,

    Robert

    2 Mal editiert, zuletzt von Maniac2000 (19. Juni 2010 um 16:16) aus folgendem Grund: Lösung wurde erbracht

    • Offizieller Beitrag

    Ich hab hier mal ein Bsp. für Embedded gefunden, weiß nicht mehr, wer das mal gepostet hatte:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>

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

    $Form1 = GUICreate('Embedded Excel', 600, 600, -1, -1)
    For $i = 1 To 3
    Switch $i
    Case 1
    $Obj1 = ObjCreate('OWC.Spreadsheet') ; OWC 9.0 = Excel 2000
    Case 2
    $Obj1 = ObjCreate('OWC10.Spreadsheet')
    Case 3
    $Obj1 = ObjCreate('OWC11.Spreadsheet')
    EndSwitch
    If IsObj($Obj1) Then ExitLoop
    Next
    If Not IsObj($Obj1) Then Exit MsgBox(0, 'Fehler', 'Excel-Objekt konnte nicht erstellt werden.')

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

    $Obj1_ctrl = GUICtrlCreateObj($Obj1,50, 50,500,500)

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

    With $Obj1
    .AutoFit=0
    .DisplayGridlines=-1
    .DisplayHorizontalScrollBar=0
    .DisplayTitleBar=0
    .DisplayToolbar=0
    .DisplayVerticalScrollBar=0
    .EnableEvents=-1
    .MoveAfterReturn=-1
    .RightToLeft=0
    .ViewableRange='1:26'
    EndWith
    With $Obj1
    .range("A1:D1").Font.Size = 16
    .range("A1:D1").Font.Color = 0xffffff
    .range("A1:D1").Font.Bold = TRUE
    .range("A1:D1").Interior.Color = 0x8888ff
    .range("C1:D1").Interior.Color = 0xff8888
    #region - NICHT mit Excel 2000:
    ;~ .range("A1:D1").HorizontalAlignment = -4108; -4108 = center, -4131 = left, -4152 = right
    ;~ .range("A1:D1").VerticalAlignment = -4108; -4108 = center, -4107 = bottom, -4130 = justify, -4160 = top
    ;~ .Columns("A:G").ColumnWidth = 14
    ;~ .Rows("1:1").RowHeight = 25
    #endregion - NICHT mit Excel 2000
    .range('A1').value = 'aaa'
    .range('A2').value = '65'
    .range('A3').value = '75'
    .range('B1').value = 'bbb'
    .range('C1').value = 'ccc'
    .range('D1').value = 'ddd'
    .range('A19').value = 'SUM(A2:A18)'
    .range('A20').formula = '=SUM(A2:A18)'
    ; NICHT mit Excel 2000:
    ;~ .range('A1').activate
    Endwith

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

    GUISetState(@SW_SHOW)

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

    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd

    [/autoit]
  • BugFix

    Vielen Dank für das Beispiel aber leider bringt mir das nichts...

    Ich muss auf eine bestehende Tabelle zugreifen und kann nicht wie in diesem Beispiel eine neue erstellen.

    Eine Anpassung auf Öffnen einer bestehenden Tabelle bringt die gleiche Fehlermeldung wie im ersten Post... :(

    • Offizieller Beitrag

    OK, ich hab dir hier ein funktionsfähiges Bsp. erstellt.
    Das Makro in der Arbeitsmappe speichern, dann klappt das.

    Spoiler anzeigen
    [autoit]

    #cs === Das Makro zentriert die ausgewählte Zelle:

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

    Sub Align_Z()
    '
    ' Align_Z Makro
    ' Makro am 18.06.2010 von Standard aufgezeichnet
    '
    ' Tastenkombination: Strg+Umschalt+Z
    '
    Selection.HorizontalAlignment = xlCenter
    End Sub

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

    #ce

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

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

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

    Local $sheet = "C:\test_1\test.xls"
    Local $Obj1 = ObjGet($sheet)
    If Not IsObj($Obj1) Then Exit MsgBox(0, 'Fehler', 'Excel-Objekt konnte nicht erstellt werden.')

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

    GUICreate('Embedded Excel', 800, 600, -1, -1, $WS_MINIMIZEBOX +$WS_SYSMENU + $WS_CLIPCHILDREN)
    $GUI_Excel = GUICtrlCreateObj($Obj1, 10, 60, 780, 470)
    $btMacro = GUICtrlCreateButton('Makro: Zentrieren', 260, 540, 100)

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

    ; Alle Befehlsschaltflächen deaktivieren:
    ;~ For $Bar In $Obj1.CommandBars
    ;~ If $Bar.Enabled = True Then $Bar.Enabled = False
    ;~ If $Bar.Visible = True Then $Bar.Visible = False
    ;~ Next
    $Obj1.Application.DisplayFormulaBar = False
    $Obj1.Application.CommandBars("Shadow Settings").Visible = False
    $Obj1.Application.DisplayScrollBars = True
    $Obj1.Application.DisplayStatusBar = False

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

    GUISetState(@SW_SHOW)

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

    While 1
    Switch GUIGetMsg()
    Case $btMacro
    $Obj1.Application.Run("Align_Z")
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd

    [/autoit]

    Edit:
    Ich hab nochmal geschaut, wo dein Fehler war:
    Du hast die Methoden (.Run / .Close) direkt auf das Objekt angewendet - das geht nicht. Diese globalen Operationen müssen immer auf die Applikation bezogen sein: $ObjVariable.Application.Methode(Parameter)

  • Edit:
    Ich hab nochmal geschaut, wo dein Fehler war:
    Du hast die Methoden (.Run / .Close) direkt auf das Objekt angewendet - das geht nicht. Diese globalen Operationen müssen immer auf die Applikation bezogen sein: $ObjVariable.Application.Methode(Parameter)


    Sag das doch gleich :D So klappt es hervorragend, vielen Dank Du hast ca. 30 Stunden Arbeit gerettet :love:

    Ich wünsche Dir ein schönes restliches Wochenende.

    Grüße,

    Robert