2016-04-27 7 views
1

Ich habe eine Excel-Datei, sagen Plano.xlsx und ich versuche, ein VBA-Makro-Skript mit Autohotkey darauf folgen die Anweisungen here. Ich möchte nicht das Excel während dieses Prozesses sichtbar sein. Der VBA-Code soll am ersten Blatt den Wert 99 in der Zelle C1 eintragen. Nach Stunden der Versuch und Irrtum, das Autohotkey-Skript läuft reibungslos ohne Fehler, d. H. Es öffnet einen Excel-Prozess im Hintergrund angeblich Bearbeitung der Excel-Datei und dann beendet. Das Problem ist, dass sich die Excel-Datei nicht ändert. Der VBA-Code funktioniert einwandfrei, wenn ich ihn manuell in ein neues VBA-Modul in Excel einfügen, ohne Autohotkey zu verwenden. HierAutohotkey führt Excel VBA-Makro, aber Änderungen werden nicht angewendet

ist der Code:

#SingleInstance force 

#Include Acc.ahk 

VBcode= 
(
Sub myFunction() 
    Worksheets(1).Select 
    Worksheets(1).Range("C1").Select 
    Selection.Value = 99 
End Sub 
) 

Excel_Run("myFunction") 

Excel_Run(sFunction){ 
    FilePath = C:\Users\KostasK\Desktop\Plano.xlsx 
    oExcel := ComObjCreate("Excel.Application") 
    Excel_ImportCode(VBcode) 
    oWorkbook := oExcel.Workbooks.Open(FilePath) 
    Excel_Get().Run(sFunction) 
    oWorkbook.Save 
    oExcel.Quit 
} 

Excel_ImportCode(VBcode){ 
    if fileexist(A_ScriptDir . "\tempvbcode.txt") 
     FileDelete, %A_ScriptDir%\tempvbcode.txt 

    FileAppend, %VBcode%, %A_ScriptDir%\tempvbcode.txt 

    Excel_Get().ActiveWorkbook.VBProject 
     .VBComponents.Import(A_ScriptDir . "\tempvbcode.txt") 
} 

Excel_Get(WinTitle="ahk_class XLMAIN") { ; by Sean and Jethrow, minor modification by Learning one 
    ControlGet, hwnd, hwnd, , Excel71, %WinTitle% 
    if !hwnd 
     return 
    Window := Acc_ObjectFromWindow(hwnd, -16) 
    Loop 
     try 
      Application := Window.Application 
     catch 
      ControlSend, Excel71, {esc}, %WinTitle% 
    Until !!Application 
    return Application 
} 

Um die Acc.ahk Bibliothek zu erhalten, die im Skript enthalten ist, wenden Sie sich bitte here sehen. Meine Autohotkey-Version ist v.1.1.23.05 und ich benutze Excel 2013. Ich habe nicht genauer betrachtet Excel_Get() Funktion, aber ich habe es anstelle von ComObjActive("Excel.Application") verwendet, weil letztere Fehler erzeugt. Dort gibt einige nützliche Informationen darüber here. Beachten Sie bitte, dass ich die folgenden Optionen in Excel Trust Center aktiviert habe: Enable all macros (not recommended, potentially dangerous code can run) und Trust access to the VBA project object model. Außerdem wird im Add-Ins-Bereich in COM-Add-Ins nichts überprüft (ich weiß nicht, ob das wichtig ist). Schließlich führe ich das Skript immer als Administrator aus.

Antwort

0

Dies kann einfach ohne VBA-Makro erreicht werden, während die Datei geschlossen wird.

FilePath = C:\Users\KostasK\Desktop\Plano.xlsx 
oExcel := ComObjGet(FilePath) 
oExcel.Worksheets("Sheet1").Range("C1").VALUE := "99" ; you can put actual sheet name instead "sheet1" 
oExcel.Save 
oExcel.Quit 
oExcel := 
Verwandte Themen