2006 г.
Excel.Application
- Как загрузить новый экземпляр Excel или подключиться к запущенному экземпляру EXCEL.EXE? Как отсоединиться от Excel и закрыть его экземпляр?
- Как запустить Excel из консольного приложения или в отдельном потоке (TThread)
- Как получить и настроить папки Excel по умолчанию?
- Чем отличается TExcelApplication от ExcelApplication, TExcelWorkbook от ExcelWorkbook?
- Как узнать локализацию Excel (русская версия или нет)?
- Как сделать, чтобы Excel работал быстрее?
- Как вывести приложение Excel на передний план?
- Как сделать так, чтоб работали английские формулы и форматы чисел в ячейках?
- Что такое Selection?
- Почему не нужно использовать ExcelApplication.Range, а следует ExcelWorksheet.Range?
- Если приложение Excel работает и пользователь выполняет в Excel, одновременно, какие либо действия, то попытка подключится к Excel и вносить в него данные, вызывает ошибку. Как этого избежать?
- Экспорт в Excel длится довольно долго. Как можно уведомлять пользователя о ходе выполнения работы?
- Переношу записанный VBA макрос рисования границы в Excel, но Delphi не знает что такое xlContinuous. Где взять значение этой константы?
- Почему я не могу найти описание компонентов палитры Delphi «Servers» в Help? Где найти документацию по работе с Excel?
- Полезные ссылки
Excel.Application
Excel Range Object
Как загрузить новый экземпляр Excel или подключиться к запущенному экземпляру EXCEL.EXE? Как отсоединиться от Excel и закрыть его экземпляр?
Для определения, будет ли запущен новый экземпляр Excel.Application или присоединение к уже запущенному, используется свойство TExcelApplication.ConnectKind. По умолчанию это свойство имеет значение ckRunningOrNew (константы определены в unit OleServer). Однако рекомендуется, если нет на то особой надобности, всегда запускать новый экземпляр Excel.Application во избежание конфликтов с запущенным раннее экземпляром Excel.Application. Свойство TExcelApplication.AutoQuit в конструкторе устанавливается по умолчанию в False (только в модуле ExcelXP в True) — это значит, что если вы хотите при отсоединении завершить работу Excel (закрыть), то нужно вызвать метод TExcelApplication.Quit или установить свойство TExcelApplication.AutoQuit равным True.
Delphi:
var XL: TExcelApplication; begin // запускаем новый экземпляр Excel'я XL := TExcelApplication.Create(nil); try XL.ConnectKind := ckNewInstance; XL.Connect; // подключение XL.AutoQuit := False; // по умолчанию это свойство True только в unit ExcelXP XL.Visible[lcid] := True; // здесь работаем с Excel'ем finally // отсоединяемся XL.UserControl := True; // отдадим управление пользователю XL.Quit; // закрыть Excel XL.Disconnect; FreeAndNil(XL); end;
C#:
private Excel.Application StartExcel(bool asNewInstance)
{
Excel.Application XL = null;
if (!(asNewInstance)) {
try {
XL = System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application")
as Excel.Application;
}
catch {
// XL = null;
}
}
if (XL == null) XL = new Excel.Application();
if (XL.Workbooks.Count == 0) XL.Workbooks.Add(Type.Missing);
XL.Visible = true;
return XL;
}
private void FinishExcel(Excel.Application XL)
{
if (XL != null) {
XL.ScreenUpdating = true;
if (! XL.Interactive) XL.Interactive = true;
XL.UserControl = true;
if (XL.Workbooks.Count == 0) {
XL.Quit();
}
else {
if (! XL.Visible) XL.Visible = true;
XL.ActiveWorkbook.Saved = true;
}
// System.Runtime.InteropServices.Marshal.ReleaseComObject(XL);
XL = null;
GC.GetTotalMemory(true); // вызов сборщика мусора
// Пока не закрыть приложение EXCEL.EXE будет висеть в процессах
}
}
How to automate Microsoft Excel from Microsoft Visual C# .NET
How to use Visual C# to automate a running instance of an Office program
GC.GetTotalMemory Method
GC Class
Как запустить Excel из консольного приложения или в отдельном потоке (TThread)
Консольное приложение и дочерний поток (класс TThread) не предполагают работу с COM сервером, как это сделано в главном потоке для Application в VCL. Для того чтобы все работало, необходим вызов функции WinAPI CoInitialize.
{$APPTYPE CONSOLE} // для консольного приложения var NeedToUninitialize: Boolean; … begin // NeedToUninitialize := Succeeded(CoInitialize(nil)); NeedToUninitialize := Succeeded(CoInitializeEx(nil, COINIT_MULTITHREADED)); try // здесь работаем с Excel'ем finally if NeedToUninitialize then CoUninitialize; end; end.
Отличие при работе в Thread — весь код работы должен быть помещен в метод TThread.Execute.
Для C# ничего дополнительно вызывать не нужно — все работает, что для WinForms, что для Console, что для объекта класса Thread().
CoInitializeEx
OleInitialize
Как получить и настроить папки Excel по умолчанию?
По умолчанию все открываемые и сохраняемые документы находятся в папке «%USERPROFILE%Мои документы» (Personal). Ссылка на эту папку содержится в свойстве TExcelApplication.DefaultFilePath (read/write). Для чтения и записи в другие папки используйте полный путь к файлу книги.
Delphi:
(XL.ActiveSheet as _Worksheet).Range['A1', EmptyParam].Formula := Format('DefaultFilePath: %s', [XL.DefaultFilePath[lcid]]);
DefaultFilePath Property
How to: Set the Default Save Path for Workbooks
Чем отличается TExcelApplication от ExcelApplication, TExcelWorkbook от ExcelWorkbook?
Все отличие TExcelApplication от ExcelApplication в том, что первый — наследник TOleServer. Это расширяет возможности для выбора способа подключения/отключения COM-сервера Excel и упрощает работу с событиями Excel.Application. Получить интерфейс ExcelApplication всегда можно из свойства TExcelApplication.DefaultInterface (DefaultInterface — штатное свойство всех наследников класса ToleServer).
Как узнать локализацию Excel’я (русская версия или нет)?
Для Delphi это можно почитать здесь.
C#:
oSheet.get_Range("A1", Type.Missing).Value2 =
XL.LanguageSettings.get_LanguageID(
Microsoft.Office.Core.MsoAppLanguageID.msoLanguageIDUI);
LanguageSettings Object
Как сделать, чтобы Excel работал быстрее?
Для ускорения работы с Excel’ем можно сделать следующие шаги:
Delphi:
// запретить перерисовку экрана XL.ScreenUpdating[lcid] := False; // отменить автоматическую калькуляцию формул XL.Calculation[lcid] := xlManual; // отменить проверку автоматическую ошибок в ячейках (для XP и выше) with XL.ErrorCheckingOptions do begin BackgroundChecking := False; NumberAsText := False; InconsistentFormula := False; end;
Не использовать метод Select, и, как следствие, свойство Selection (смотрите дальше).
Существенно повышается скорость, если вместо записи в каждую ячейку использовать запись из VarArray (смотрите дальше про объект Range). В Demo-проекте есть тест затраченного времени для различных методов записи.
Так как основное время работы с Excel’ем затрачивается на перерисовку (установка отступов для страницы, размеров строк и столбцов, атрибуты шрифтов и т.д.), то лучше всего использовать заранее подготовленный шаблон.
Как вывести приложение Excel на передний план?
Для «выноса» приложения Excel на передний план просто вызовите метод Visible объекта ExcelApplication.
Delphi:
XL.Visible[lcid] := True;
// Этот способ только для Excel версии XP и выше
SetForegroundWindow(XL.Hwnd);
C#:
XL.Visible = true;
Как сделать так, чтоб работали английские формулы и форматы чисел в ячейках?
Решение для Delphi здесь «Русский Excel и установка NumberFormat»
К сожалению, при работе с русским Excel’ем из C# проблемы те же, но, к счастью, решаются проще — через CultureInfo:
C#:
int savedCult = Thread.CurrentThread.CurrentCulture.LCID;
try {
// установим английскую "культуру"
Thread.CurrentThread.CurrentCulture = new CultureInfo(0x0409, false);
Thread.CurrentThread.CurrentUICulture = new CultureInfo(0x0409, false);
// здесь работаем с Excel'ем, при чем работают английские формулы, DataFormat
// и колонтитулы в PageSetup
finally {
// восстановим пользовательскую "культуру" для отображения всех данных в
// привычных глазу форматах
Thread.CurrentThread.CurrentCulture = new CultureInfo(savedCult, true);
Thread.CurrentThread.CurrentUICulture = new CultureInfo(savedCult, true);
}
Русский Excel и установка NumberFormat
How to: Set the Culture and UI Culture for Windows Forms Globalization
Что такое Selection?
Как пишут в «Best Practices for Setting Range Properties»: «Код, использующий Selection, сгенерирован записью макроса Excel, часто используется для обнаружения объекта или метода, который будет работать. Это хорошая идея, за исключением того, что записанный макрос не оптимизирован для пользователя. Обычно Excel при записи макроса использует Selection и изменяет выбор объекта при записи какой либо задачи».
Т.е. использование Selection не является обязательным и даже не рекомендуется для разработчика. Цитата оттуда же: «На практике вызывайте метод Select объекта только тогда, когда твердо намерены изменить выбранный пользователем элемент. Вы можете никогда не использовать метод Select просто потому, что это вам удобно, как разработчику. Если вы устанавливаете свойства объекта Range, у вас всегда есть альтернатива. Отказ от метода Select не только делает ваш код быстрее, но и порадует пользователей вашей программы (it makes your users happier)». Эта тема еще затронута здесь.
Selection Property
Почему не нужно использовать Excel.Application.Range, а следует ExcelWorksheet.Range?
Использование ExcelApplication.Range позволяет работать только с активным листом активной книги. Если вы открываете по ходу работы еще одну книгу или делаете активным другой лист в книге (например, добавляете новый лист), то данные будут вноситься именно в активный в данный момент лист. Чтоб не попасть в неудобную ситуациюб всегда используйте объект Range объекта ExcelWorksheet. Это не только обезопасит ваш код от попадания «куда Бог пошлет», но и позволит записывать данные сразу в несколько листов и даже книг без изменения ActiveSheet и ActiveCell.
Если приложение Excel работает и пользователь выполняет в Excel, одновременно, какие либо действия, то попытка подключится к Excel и вносить в него данные, вызывает ошибку. Как этого избежать?
При работе с запущенным приложением Excel, он может быть занят, если в это время пользователь редактирует значение в ячейке, или в нем открыто какое-либо модальное диалоговое окно (например, «Открытие документа»). Чтобы обойти эту ситуациюб всегда запускайте новую копию Excel.Application и устанавливайте свойство Interactive в False, что запретит пользователю что-либо делать в Excel’е или закрыть запущенный экземпляр Excel.Application:
Delphi:
XL := TExcelApplication.Create(nil); try XL.ConnectKind := ckNewInstance; XL.Connect; XL.Interactive[lcid] := False; // запрещаем работу пользователю с нашим экземпляром Excel'я XL.Visible[lcid] := True; // работать здесь finally // не забыть разрешить пользователю доступ к Excel'ю! XL.UserControl := True; XL.Interactive[lcid] := True; XL.Disconnect; FreeAndNil(XL); end;
The action cannot be completed because Microsoft Office Excel is busy
Interactive Property
Экспорт в Excel длится довольно долго. Как можно уведомлять пользователя о ходе выполнения работы?
Чтобы пользователь не подумалб что во время экспорта данных в Excel ваша программа и Excel «висит», лучше уведомлять его о ходе работы. Т.к. обновление экрана занимает довольно много времени и так довольно длительного процесса экспорта (хотя все же стоит подумать, как этот процесс оптимизировать и ускорить), то лучшим выходом из этой ситуации является показ этапов работы в свойстве ExcelApplication.StatusBar:
Delphi:
XL.DisplayStatusBar[lcid] := True; // покажем StatusBar, если его не было видно XL.StatusBar[lcid] := 'Читаем'; // XL.StatusBar[lcid] := 'Пишем'; // XL.StatusBar[lcid] := 'Считаем'; // XL.StatusBar[lcid] := False; // уберем наше последнее сообщение
C#:
XL.DisplayStatusBar = true; // XL.StatusBar = "Текст в статусбаре"; // XL.StatusBar = false; // "Готово"
DisplayStatusBar Property
StatusBar Property
Переношу записанный VBA макрос рисования границы в Excel, но Delphi не знает что такое xlContinuous. Где взять значение этой константы?
Это всего лишь значит, что вы пользуетесь в Delphi поздним связыванием. Добавьте в uses ExcelXP или Excel2000. Для C# нужно полностью указывать namespace, тип и имя этой константы, например Excel.XlLineStyle.xlContinuous.
Microsoft.Office.Interop.Excel Namespace
Почему я не могу найти описание компонентов палитры Delphi «Servers» в Help’е? Где найти документацию по работе с Excel’ем?
Компоненты на палитре «Servers» — это «обертка» (wrapper) популярных COM-серверов Microsoft. Для описания их объектной модели, свойств и методов используйте поставляемый с Microsoft Office VBA Help или ищите информацию на MSDN (также смотрите «Полезные ссылки» в конце).
Полезные ссылки
Microsoft Excel Object Model
Automating Excel Using the Excel Object Model
Office Development — Excel
Migrating Excel VBA Solutions to Visual Studio 2005 Tools for Office
Converting Microsoft Office VBA Macros to Visual Basic .NET and C#
Microsoft Excel 2003 Language Reference
Understanding the Excel Object Model from a .NET Developer’s Perspective
Microsoft.Office.Interop.Excel Namespace
Excel Objects
Code Examples for Excel (C#)
← →
ixen ©
(2010-05-13 19:24)
[0]
Здраствуйте! Формирую отчеты в MS Excel и MS Word. Использую позднее связывание. В конце формирования отчета делаю Word видимым W.Visible:=true; , но он открывается за окном программы, приходится кликать на панели задач чтобы отобразить отчет. Как его отобразить сразу на переднем плане? Искал в инете… но не нашел толком ответа…
← →
Омлет ©
(2010-05-13 19:36)
[1]
SetForegroundWindow
← →
ixen ©
(2010-05-13 19:48)
[2]
если использовать SetForegroundWindow нужно найти хэндл Word, а хэндл своего приложения всегда известен.. тогда может сделать проще… отодвинуть окно своего приложения на один уровень назад?
← →
Омлет ©
(2010-05-13 20:00)
[3]
> отодвинуть окно своего приложения на один уровень назад?
За твоим окном может оказаться не ворд. (Прям эпиграф к мистическому рассказу.)
← →
Омлет ©
(2010-05-13 20:17)
[4]
Попробуй так:
MsWord.Visible := true;
MsWord.Activate;
← →
ixen ©
(2010-05-13 20:31)
[5]
> Попробуй так:
>
> MsWord.Visible := true;
> MsWord.Activate;
спасибо… это помогло..
|
W 115 / 115 / 33 Регистрация: 16.04.2013 Сообщений: 748 |
|
|
1 |
|
|
10.02.2016, 10:04. Показов 3894. Ответов 19
Вывожу из Access данные для отчетов в шаблон Excel, заполняю ячейки сохраняю.
0 |
|
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
10.02.2016, 10:04 |
|
19 |
|
alvk 7267 / 4469 / 288 Регистрация: 12.08.2011 Сообщений: 13,512 |
||||
|
10.02.2016, 10:10 |
2 |
|||
|
Может забыли
Если нет, то может у вас старая версия 2010-го Экселя? Что-то такое давно было тоже.
0 |
|
W 115 / 115 / 33 Регистрация: 16.04.2013 Сообщений: 748 |
|
|
10.02.2016, 11:31 [ТС] |
3 |
|
Visible это вообще его видимость/невидимость, а мне типа модальность нужна или как ее там..
0 |
|
547 / 274 / 50 Регистрация: 03.04.2015 Сообщений: 926 |
|
|
10.02.2016, 11:39 |
4 |
|
Обычно при создании экземпляра Excel и выполнения вышеуказанной команды он как раз и оказывается верхним окном. Видимо это и правда глюк. А если окно свернуть и развернуть?
0 |
|
W 115 / 115 / 33 Регистрация: 16.04.2013 Сообщений: 748 |
|
|
10.02.2016, 12:04 [ТС] |
5 |
|
свернуть и развернуть Программно? Как?
0 |
|
corbis 547 / 274 / 50 Регистрация: 03.04.2015 Сообщений: 926 |
||||||||
|
10.02.2016, 12:26 |
6 |
|||||||
Применение:
Вместо Me.Caption нужно будет поставить заголовок окна Excel.
1 |
|
W 115 / 115 / 33 Регистрация: 16.04.2013 Сообщений: 748 |
|
|
10.02.2016, 13:28 [ТС] |
7 |
|
заголовок окна Excel. а «Microsoft Excel» хватит или надо все переписать с заголовка? Заголовки разные получаются:
0 |
|
547 / 274 / 50 Регистрация: 03.04.2015 Сообщений: 926 |
|
|
10.02.2016, 13:53 |
8 |
|
Да, именно разные. И нужно правильный подсунуть. Но это же не проблема. Если вы создаете экземпляр, так и заголовок можете узнать без проблем.
0 |
|
kavasaka W 115 / 115 / 33 Регистрация: 16.04.2013 Сообщений: 748 |
||||
|
10.02.2016, 14:13 [ТС] |
9 |
|||
вот так создаю и открываю. А как имя узнать?
0 |
|
texnik-san шапоклякистка 8-го дня 3674 / 2234 / 391 Регистрация: 26.06.2015 Сообщений: 4,647 Записей в блоге: 1 |
||||||||
|
10.02.2016, 14:19 |
10 |
|||||||
Вместо
А то что-то вы мудрите. Узнавать заголовок приложения, чтобы получить идентификатор окна…
1 |
|
W 115 / 115 / 33 Регистрация: 16.04.2013 Сообщений: 748 |
|
|
10.02.2016, 14:26 [ТС] |
11 |
|
1 только xLObj в той процедуре еще нет. Его что Public сделать?
0 |
|
547 / 274 / 50 Регистрация: 03.04.2015 Сообщений: 926 |
|
|
10.02.2016, 14:29 |
12 |
|
Это общая функция. Не для этой конкретной задачи написанная. И так правильнее будет, да.
0 |
|
texnik-san шапоклякистка 8-го дня 3674 / 2234 / 391 Регистрация: 26.06.2015 Сообщений: 4,647 Записей в блоге: 1 |
||||||||
|
10.02.2016, 14:39 |
13 |
|||||||
|
Решение
только xLObj в той процедуре еще нет. Его что Public сделать? Да хоть входным параметром передайте. Добавлено через 6 минут
А прямо в свой код, в том месте, где вам уже нужно, чтобы окно стало «всплывающим» — это:
1 |
|
W 115 / 115 / 33 Регистрация: 16.04.2013 Сообщений: 748 |
|
|
10.02.2016, 14:57 [ТС] |
14 |
|
Не работает — ексел все равно сзади. xLObj.Hwnd — это какой-то 7 значный код получается, а не заголовок окна. это еще для первого варианта
0 |
|
шапоклякистка 8-го дня 3674 / 2234 / 391 Регистрация: 26.06.2015 Сообщений: 4,647 Записей в блоге: 1 |
|
|
10.02.2016, 15:06 |
15 |
|
xLObj.Hwnd — это какой-то 7 значный код получается, а не заголовок окна. Заголовок окна и не нужен, мы проскочили этот шаг и сразу получаем то, для чего заголовок был нужен (идентификатор окна). Но этот вариант все равно отставляем и пробуем сразу второй.
0 |
|
W 115 / 115 / 33 Регистрация: 16.04.2013 Сообщений: 748 |
|
|
10.02.2016, 15:13 [ТС] |
16 |
|
Сори. у вас там что-то пропущено в коде.
А прямо в свой код, в том месте, где вам уже нужно на эту строку ругается и на функцию SetWindowPos и на все параметры.
0 |
|
Модератор 11342 / 4661 / 748 Регистрация: 07.08.2010 Сообщений: 13,505 Записей в блоге: 4 |
|
|
10.02.2016, 15:18 |
17 |
|
попробуйте —формирование ворд документа из екселя и открытие впереди екселя
0 |
|
W 115 / 115 / 33 Регистрация: 16.04.2013 Сообщений: 748 |
|
|
10.02.2016, 15:30 [ТС] |
18 |
|
попробуйте —формирование ворд документа из екселя и открытие впереди екселя зачем мне Ворд из ексцеля, если у меня прога В Акцесе, которая забивает отчеты в ексел???? я даже распаковал и открыл. Там даже макросов нет. Вы прикалываетесь?)))
Но этот вариант все равно отставляем и пробуем сразу второй. а в чем разница в этих вариантах? SetWindowPos думаю нельзя ставить в любом месте только в модуле (а это есть 1 вариант!) и Public Sub туда же.. в итоге полностью 1 вариант (который все равно не работает!) они все прикалываются??
0 |
|
шапоклякистка 8-го дня 3674 / 2234 / 391 Регистрация: 26.06.2015 Сообщений: 4,647 Записей в блоге: 1 |
|
|
10.02.2016, 15:33 |
19 |
|
на эту строку ругается и на функцию SetWindowPos и на все параметры. Потому что то, что я написала «в ваш модуль добавляете это» должно быть добавлено в ТОТ ЖЕ модуль, где и ваша функция, причем в самом верху модуля, сразу после строк Оption.
Сори. у вас там что-то пропущено в коде. Ничего не пропущего и ничего не должно быть. Добавлено через 1 минуту
думаю Это лишнее ))))
1 |
|
W 115 / 115 / 33 Регистрация: 16.04.2013 Сообщений: 748 |
|
|
10.02.2016, 15:46 [ТС] |
20 |
|
Просто когда все барахло в модуле, а в формах только вызов функции — как то привычнее Но главное что заработало в 10ке СПАСИБО!
0 |
|
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
10.02.2016, 15:46 |
|
20 |
i have a small application developed in C# .NET that manipulate excel sheets, I don’t know why some users keep telling me that when they open the excel file the window doesn’t appear on front/top although I set the visible to true and the window state on maximized.
This is the function that reads the excel file:
public static void OpenExcel(string fileName, bool visibility, FunctionToExecute fn = null)
{
string addInPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Microsoft\AddIns\mDF_XLcalendar.xla");
deleg = fn;
app = new Excel.Application();
app.Workbooks.Open(addInPath);
app.Workbooks.Open(fileName);
app.ScreenUpdating = true;
app.DisplayAlerts = true;
app.Visible = visibility;
app.UserControl = true;
app.WindowState = Excel.XlWindowState.xlMaximized;
EventDel_BeforeBookClose = new Excel.AppEvents_WorkbookBeforeCloseEventHandler(application_WorkbookBeforeClose);
EventSave_BeforeBookClose = new Excel.AppEvents_WorkbookBeforeSaveEventHandler(Open_ExcelApp_WorkbookBeforeSave);
app.WorkbookBeforeClose += EventDel_BeforeBookClose;
app.WorkbookBeforeSave += EventSave_BeforeBookClose;
}
Any ideas ?
Joel
7,2814 gold badges51 silver badges58 bronze badges
asked Oct 1, 2013 at 14:28
4
some magic, that work for me:
app.WindowState = XlWindowState.xlMinimized; // -4140
app.WindowState = XlWindowState.xlMaximized; // -4137
HuBeZa
4,6973 gold badges35 silver badges56 bronze badges
answered Apr 19, 2016 at 12:10
ai85lai85l
1111 silver badge2 bronze badges
1
I found this to work. How to bring an Excel app to the front
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool SetForegroundWindow(IntPtr hWnd);
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
public static void BringExcelWindowToFront(Application xlApp)
{
string caption = xlApp.Caption;
IntPtr handler = FindWindow(null, caption);
SetForegroundWindow(handler);
}
answered Jul 24, 2014 at 16:00
Just RJust R
2814 silver badges9 bronze badges
I would try to activate the excel window by
app.ActiveWindow.Activate();
If this doesn’t work you might find other solutions (involving Native WinAPI calls) at this thread at http://social.msdn.microsoft.com/
answered Oct 1, 2013 at 18:10
MartinStettnerMartinStettner
28.6k15 gold badges79 silver badges106 bronze badges
0
Sometimes if there is more than one file open at same time in Excel, ActiveWindow.Activate() will not work.
A successful trick is to do minimize then maximize commands.
answered Apr 6, 2014 at 16:28
A little late I know, but why the need to use FindWindow, the Windows handle is accessible via the Application :
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool SetForegroundWindow(IntPtr hWnd);
public static void BringExcelWindowToFront(Application xlApp)
{
SetForegroundWindow((IntPtr)xlApp.Hwnd); // Note Hwnd is declared as int
}
There will be no problems if more than one window has the same caption.
answered May 27, 2015 at 8:50
PaulFPaulF
6,6332 gold badges18 silver badges29 bronze badges
To activate a specific workbook:
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool SetForegroundWindow(IntPtr hWnd);
public static void BringExcelWindowToFront(Excel._Workbook xlBook)
{
var windows = xlBook.Windows;
foreach (Excel.Window window in windows)
{
IntPtr handler = (IntPtr)window.Hwnd;
SetForegroundWindow(handler);
return;
}
}
answered Sep 3, 2019 at 22:14
Alan BaljeuAlan Baljeu
2,3654 gold badges24 silver badges40 bronze badges
Выберите диаграмму и отредактируйте источник данных. Порядок рядов в левой части диалогового окна будет определять, какие ряды будут отображаться перед другими, если они все нанесены на одну и ту же ось. Выберите серию и нажмите стрелки вверх или вниз, чтобы переместить ее положение.
На скриншоте вы видите порядок серий для нижнего графика. Series1 указан после Series2 и будет нанесен сверху
Редактировать: по-видимому, возможность изменить порядок рядов не существует в соответствующем диалоговом окне в Excel для Mac. В этом случае измените формулу для ряда данных в строке формул.
Выберите ряд данных на графике и посмотрите на панель формул. Вы увидите что-то вроде
=SERIES(Sheet1!$C$1,Sheet1!$A$2:$A$8,Sheet1!$C$2:$C$8,2)
Последнее число в этой формуле — это порядок ряда. Вы можете редактировать и изменять его в строке формул. Ряд с наименьшим номером будет нанесен позади ряда с более высоким номером.
До: оранжевая серия имеет номер 2 и нанесена поверх синей серии (которая имеет номер 1)
После: оранжевая серия имеет номер 1, нанесенная за синей серией (которая теперь имеет номер 2)
Итак, чтобы вывести серию на передний план, убедитесь, что ее номер заказа является самым большим из серии на графике.
Я искал в Интернете сверху вниз, но не смог найти решение. В моей книге Excel я хочу импортировать контакты из Outlook. Это отлично работает без проблем. Я получаю GAL на передний план, используя Outlook.ActiveWindow.Activate и я минимизирую Outlook, используя Outlook.Explorers.Item(1).WindowState = olMinimized, Я знаю, что это не очень чистое решение, но все работает нормально, если не открыты другие Windows Outlook.
Теперь к моей проблеме:
Когда у пользователя есть несколько открытых окон Outlook (например, новое почтовое диалоговое окно и т. Д.), Я не могу вернуть свое приложение Excel обратно на передний план. Импорт контактов все еще работает нормально. GAL выходит на передний план, нажав кнопку.
Я попробовал следующие фрагменты кода, но они на самом деле не работают.
Dim AppTitle As String
AppTitle = Application.Caption
'
'some code
'
AppActivate AppTitle
Еще одна попытка была эта функция в модуле
Public Declare Function SetForegroundWindow Lib "user32" _
(ByVal hWnd As Long) As Long
вызывая его в моей функции кнопки
Dim AppXL As Object
Set AppXL = CreateObject("Excel.Application")
'
'some code
'
SetForegroundWindow AppXL.hWnd
Я также пытался использовать этот фрагмент кода
Excel.Application.Visible = True
Excel.Application.ActiveWindow.Activate
Ничего не помогло Единственное, что произошло, — это мигающий значок Excel на панели задач. Я надеюсь, что вы можете помочь мне с этим.
Я пытаюсь вывести окно Excel на передний план всех работающих приложений.
Текущий код,
Private Declare Function SetForegroundWindow _
Lib "user32" _
(ByVal hWnd As Long) As Long
Public Sub Bring_to_front()
SetForegroundWindow wb.Application.hWnd
End Sub
Sub Test()
Set wb = Workbooks("MyWorkBook.xlxs")
call Bring_to_front
End Sub
На данный момент ничего не происходит.
2 ответа
Лучший ответ
Нашел ответ на то, что я пытался сделать после небольшого исследования.
Это переместит указанный вами рабочий лист на передний план.
Public Declare Function SetForegroundWindow _
Lib "user32" (ByVal hwnd As Long) As Long
Public Sub Bring_to_front()
Dim setFocus As Long
ThisWorkbook.Worksheets("Sheet1").Activate
setfocus = SetForegroundWindow(Application.hwnd)
End Sub
5
user1452705user1452705
28 Дек 2015 в 11:37
Для этого вам не нужен API, вы можете использовать что-то вроде:
Sub BringXLToFront()
AppActivate Application.Caption
End Sub
Метод AppActivate() в VBA принимает строковый аргумент, и он активирует (т.е. выводит его на передний план) любое окно, содержащее это точное < / strong> строка.
Однако более конкретно для вашего вопроса — вам нужно немного больше понять, как API-интерфейсы работают в VBA — если вы используете систему x64, вам нужно использовать условную компиляцию и объявить функцию API как безопасную с указателем, используя {{X0 }} и тип данных LongPtr:
#If Win64 Then
Private Declare PtrSafe Function SetForegroundWindow Lib "user32" _
(ByVal hWnd As LongPtr) As LongPtr
#Else
Private Declare Function SetForegroundWindow Lib "user32" _
(ByVal hWnd As Long) As Long
#End If
14
SierraOscar
29 Дек 2015 в 14:34
Когда вы вставляете точечную диаграмму в Excel, если данные ближе, некоторые маркеры могут быть скрыты, как показано на скриншоте ниже. Теперь я хочу переместить какую-нибудь линию диаграммы вперед или назад, чтобы увидеть диаграмму более четко.
Переместить линию диаграммы на передний план, переместив положение ряда
Переместить линию диаграммы на передний план, переместив положение ряда
Чтобы переместить линию диаграммы вперед или назад, самый простой способ — переместить позицию ряда вперед или назад.
1. Щелкните правой кнопкой мыши ряд данных, а затем щелкните Выберите данные из контекстного меню. Смотрите скриншот:
2. Затем в Выберите серию данных диалоговом окне выберите серию, которую вы хотите переместить на передний план. Записи легенд раздел и переместите его в конец списка с помощью стрелки вниз 
3. Нажмите OK, теперь серия 1 перенесена на передний план.
Относительные статьи
- Как добавить или переместить метки данных в диаграмме Excel?
- Как сдвинуть столбцы ближе друг к другу в гистограмме Excel?
Лучшие инструменты для работы в офисе
Kutools for Excel Решит большинство ваших проблем и повысит вашу производительность на 80%
- Снова использовать: Быстро вставить сложные формулы, диаграммы и все, что вы использовали раньше; Зашифровать ячейки с паролем; Создать список рассылки и отправлять электронные письма …
- Бар Супер Формулы (легко редактировать несколько строк текста и формул); Макет для чтения (легко читать и редактировать большое количество ячеек); Вставить в отфильтрованный диапазон…
- Объединить ячейки / строки / столбцы без потери данных; Разделить содержимое ячеек; Объединить повторяющиеся строки / столбцы… Предотвращение дублирования ячеек; Сравнить диапазоны…
- Выберите Дубликат или Уникальный Ряды; Выбрать пустые строки (все ячейки пустые); Супер находка и нечеткая находка во многих рабочих тетрадях; Случайный выбор …
- Точная копия Несколько ячеек без изменения ссылки на формулу; Автоматическое создание ссылок на несколько листов; Вставить пули, Флажки и многое другое …
- Извлечь текст, Добавить текст, Удалить по позиции, Удалить пробел; Создание и печать промежуточных итогов по страницам; Преобразование содержимого ячеек в комментарии…
- Суперфильтр (сохранять и применять схемы фильтров к другим листам); Расширенная сортировка по месяцам / неделям / дням, периодичности и др .; Специальный фильтр жирным, курсивом …
- Комбинируйте книги и рабочие листы; Объединить таблицы на основе ключевых столбцов; Разделить данные на несколько листов; Пакетное преобразование xls, xlsx и PDF…
- Более 300 мощных функций. Поддерживает Office/Excel 2007-2021 и 365. Поддерживает все языки. Простое развертывание на вашем предприятии или в организации. Полнофункциональная 30-дневная бесплатная пробная версия. 60-дневная гарантия возврата денег.
Вкладка Office: интерфейс с вкладками в Office и упрощение работы
- Включение редактирования и чтения с вкладками в Word, Excel, PowerPoint, Издатель, доступ, Visio и проект.
- Открывайте и создавайте несколько документов на новых вкладках одного окна, а не в новых окнах.
- Повышает вашу продуктивность на 50% и сокращает количество щелчков мышью на сотни каждый день!
Комментарии (0)
Оценок пока нет. Оцените первым!


Сообщение было отмечено alvk как решение









