1

У меня есть приложение VB.NET, которое использует Microsoft.Office.Interop.Excel, чтобы просто открыть электронную таблицу, перекачать некоторые данные в нее, обновить данные в сводных таблицах и затем представить пользователю таблицу.При вызове Excel из приложения VB.NET как сделать Excel перед приложением?

код довольно прост (обработка ошибок не показана):

' Start Excel Application 
    xlApp = New Excel.ApplicationClass 

    ' Get Excel Workbooks 
    xlWorkBooks = xlApp.Workbooks 

    ' Open workbook 
    xlWorkBook = xlWorkBooks.Open(Filename:=sExcelDocFullPath, IgnoreReadOnlyRecommended:=blnIgnoreReadOnly) 

    If Not xlWorkBook Is Nothing Then 

     ' Pump some data over (code not shown) 
     ' Make the first worksheet in the document active 
     CType(xlWorkBook.Worksheets(1), Excel.Worksheet).Activate() 

     'Return control of Excel to the user 
     xlApp.Visible = True 
     xlApp.UserControl = True 

     ' Refresh workbooks (with alerts off, so as not to hassle user) 
     xlApp.DisplayAlerts = False 
     xlWorkBook.RefreshAll() 
    End If 

Что происходит, когда этот код выполняется, то, что Excel открывается сзади приложение вызова и потому, что мы освежающие соединения данных, за вызывающим приложением также отображается маленький диалог Excel «Вход в SQL Server», и, таким образом, пользователю требуется ALT + TAB в Excel или нажать «Excel» в панели задач - ни один из них не является отличным опытом для пользователя. Нам нужно, чтобы диалоговое окно Login появилось в обратном направлении вызывающего приложения.

Может ли кто-нибудь предложить, как это может быть достигнуто? Я попытался переместить настройки свойств Visible & UserControl после RefreshAll, но это не имеет никакого значения.

Cheers,

Chris.

+0

У нас схожие проблемы и мы пробовали разные подходы. Во-первых, вы можете установить свойство windowState для XlMaximized (или XlNormal). Для других опций вам нужен дескриптор окна и, когда он есть, сообщает ему, что он включен. Но найти дескриптор непросто ... В приложении Excel есть свойство hwnd. Кроме того, вы могли бы получить окна из книги –

ответ

2

К сожалению для C#, я не знаю, VB, так что я не могу перевести себя, но основная идея заключается в том, чтобы использовать WinAPI:

[DllImport("user32.dll", SetLastError = true)] 
public static extern bool BringWindowToTop(IntPtr hWnd); 

Вы можете получить HWND от xlApp:

BringWindowToTop((INtPtr)XlApp.Hwnd); 
+0

Спасибо, Алекс - вот и все! В VB это просто BringWindowToTop (CType (xlApp.Hwnd, IntPtr)) –

 Смежные вопросы

  • Нет связанных вопросов^_^