Announcement

Collapse
No announcement yet.

Excel öffnen und Markos starten

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Excel öffnen und Markos starten

    Ich entwickle mit MS Developer Studio 6.0.
    Das Problem ist, daß wenn ich *.xls oder *.xlt Dateien öffne, wird das Makro auto_open nicht getstartet.
    Ich hab es schon mit beiden Funktionen ExecuteExcel4Macro und Run probiert.
    Es passiert nichts.
    Wenn ich mit einen Doppelklick die Datei öffne bekomme ich den Hinweis, daß Makros enthalten sind. Wenn ich sie über C++ öffne bekomm ich kein Hinweis.
    Warum?
    <PRE>
    void COfficeThread::start() // Message handler function.

    {
    char buf[1024]; // General purpose message buffer.
    _Application1 oExcel; // oExcel is an _Application object.
    Workbooks oBooks;
    _Workbook oBook;
    LPDISPATCH lpDisp;
    ::CoInitialize(NULL);

    // Common OLE-variants... Easy variants to use for calling arguments.

    COleVariant
    covTrue((short)TRUE),
    covFalse((short)FALSE),
    covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);

    // Start Excel and get Application object.
    if(!oExcel.CreateDispatch("Excel.Application"))
    {
    AfxMessageBox("Couldn't CreateDispatch on Excel");
    return;
    }

    // Set visible.
    oExcel.SetVisible(TRUE);
    oExcel.SetUserControl(TRUE); // This is a property of the
    // _Application object. Set it so you
    // can Release the oExcel and
    // oBooks objects without killing
    // Excel.

    // Get Workbooks collection...
    lpDisp = oExcel.GetWorkbooks(); // Get an IDispatch pointer
    ASSERT(lpDisp); // or fail.
    oBooks.AttachDispatch( lpDisp ); // Attach IDispatch pointer to
    // oBooks object.

    // Open a workbook...
    lpDisp = oBooks.Open(file, // Change for your .xls.
    covOptional, covOptional, covOptional, covOptional,
    covOptional, covOptional, covOptional, covOptional,
    covOptional, covOptional, covOptional, covOptional // Excel 2000
    );

    ASSERT(lpDisp); // It better have worked?
    oExcel.ExecuteExcel4Macro("liefer_abr.xls!auto_ope n");
    oExcel.Run(COleVariant("liefer_abr.xls!auto_open") ,covOptional,covOptional,covOptional,covOptional,c ovOptional,covOptional,
    covOptional,covOptional,covOptional,covOptional,co vOptional,covOptional,covOptional,
    covOptional,covOptional,covOptional,covOptional,co vOptional,covOptional,covOptional,
    covOptional,covOptional,covOptional,covOptional,co vOptional,covOptional,covOptional,
    covOptional,covOptional,covOptional);

    HWND hWnd;
    hWnd = ::FindWindow("XLMain", // Pointer to class name.
    NULL // Pointer to window name option.
    );
    if(NULL==hWnd)
    {
    long lErr = GetLastError();
    sprintf(buf, "FindWindow error code = %d", lErr);
    AfxMessageBox(buf);
    }

    DWORD pid; // Variable to hold the process ID.
    DWORD dThread; // Variable to hold (unused) thread ID.
    dThread = GetWindowThreadProcessId(hWnd, // Handle to window.
    &pid // Address of variable
    // for process identifier.
    );
    HANDLE hProcess; // Handle to existing process

    hProcess = OpenProcess(SYNCHRONIZE | PROCESS_ALL_ACCESS, // access flag
    TRUE, // handle inheritance flag
    pid // process identifier
    );

    oBooks.ReleaseDispatch(); // Release the object-IDispatch binding.
    oExcel.ReleaseDispatch();
    oBooks = NULL; // Destroy the object references.
    oExcel = NULL;

    DWORD dwReason; // Variable to receive signal.

    dwReason = WaitForSingleObject(hProcess, // Handle to object to wait for its end.
    INFINITE // Time-out interval in milliseconds.
    );

    //sprintf(buf, "Reason for Wait to terminate is %d", dwReason); // Zero is good.
    //AfxMessageBox(buf);
    }
    </PRE>
Working...
X