Программно закрыть файл эксель
Помогите мне, пожалуйста.
Мне нужно открыть определенный файл и, после его обработки, закрыть.
name = Application.GetOpenFilename
Workbooks.Open name
а как мне его закрыть?
[QUOTE]Originally posted by ziv
хм. а как ты его обрабатываешь? ты же когда к нему обращаешься как-то его обзываешь?
ну..тогда после обработки открой его. и потом то же самое только activeworkbook
это первое что в голову приходит. только как же ты с ним работаешь?
или введи переменную для определения имени файла и вместо книга1 напиши его имя.
Originally posted by T@sh
хм. а как ты его обрабатываешь? ты же когда к нему обращаешься как-то его обзываешь?
ну..тогда после обработки открой его. и потом то же самое только activeworkbook
это первое что в голову приходит. только как же ты с ним работаешь?
или введи переменную для определения имени файла и вместо книга1 напиши его имя.
м-даа :) программу писал под фиксированное имя открываемого файла :(
а как открываемому файлу присвоить необходимое мне имя, например "Книга1"?
а как открываемому файлу присвоить необходимое мне имя, например "Книга1"?
хм. А как открывается книга? Можно сделать через диалоговое окно , чтобы юзер сам выбрал что открыть:
Application.Dialogs(xlDialogOpen).Show
bookName = ActiveWorkbook.Name
а вообще проще в аську стукнись если срочно.
хм. А как открывается книга? Можно сделать через диалоговое окно , чтобы юзер сам выбрал что открыть:
Application.Dialogs(xlDialogOpen).Show
bookName = ActiveWorkbook.Name
а вообще проще в аську стукнись если срочно.
я делал вот так:
name = Application.GetOpenFilename
[off] а по аське ты "Марина"? [/off]
Вот этот name уже содержит в себе полной путь к файлу - "C:\aaa1.xls", если из этой строки выдернуть aaa1.xls(например через мою функцию FileWithoutDir, описание в конце), то его можно использовать при обращении к книге - Workbooks("aaa1.xls").Close
А можно и так, вариантов масса:
Dim sWrb as String
name = Application.GetOpenFilename
Workbooks.Open name
sWrb = ActiveWorkbook.name
.
Workbooks(sWrb).Close
Dim wWrb As Workbook
name = Application.GetOpenFilename
Workbooks.Open name
Set wWrb = ActiveWorkbook
.
wWrb.Close
Public Function FileWithoutDir(path As String) As String
' Вырезает название файла из полного пути к файлу
Dim i%, pos%
On Error GoTo Err_
FileWithoutDir = ""
s = ""
If path <> "" Then
pos = InStr(1, path, "\")
s = path
If pos > 0 Then
Do
s = Right(s, Len(s) - pos)
pos = InStr(1, s, "\")
Loop Until pos = 0
End If
FileWithoutDir = s
ExitSub:
Exit Function
Err_:
MsgBox "Возникла ошибка! (в функ. FileWithoutDir)"
Resume ExitSub
Вот этот name уже содержит в себе полной путь к файлу - "C:\aaa1.xls", если из этой строки выдернуть aaa1.xls(например через мою функцию FileWithoutDir, описание в конце), то его можно использовать при обращении к книге - Workbooks("aaa1.xls").Close
А можно и так, вариантов масса:
Dim sWrb as String
name = Application.GetOpenFilename
Workbooks.Open name
sWrb = ActiveWorkbook.name
.
Workbooks(sWrb).Close
Dim wWrb As Workbook
name = Application.GetOpenFilename
Workbooks.Open name
Set wWrb = ActiveWorkbook
.
wWrb.Close
Public Function FileWithoutDir(path As String) As String
' Вырезает название файла из полного пути к файлу
Dim i%, pos%
On Error GoTo Err_
FileWithoutDir = ""
s = ""
If path <> "" Then
pos = InStr(1, path, "\")
s = path
If pos > 0 Then
Do
s = Right(s, Len(s) - pos)
pos = InStr(1, s, "\")
Loop Until pos = 0
End If
FileWithoutDir = s
ExitSub:
Exit Function
Err_:
MsgBox "Возникла ошибка! (в функ. FileWithoutDir)"
Resume ExitSub
В твоем случае наверное лучше использоватть вместо InStr() функцию InStrRev(), чтобы сразу найти правый "\" в полном имени файла.
Originally posted by gacol
В твоем случае наверное лучше использоватть вместо InStr() функцию InStrRev(), чтобы сразу найти правый "\" в полном имени файла.
Да, согласен, грехи молодости. :-)
А я вот так действую в таких случаях:
Книги в Экселе нумеруются в порядке открытия. Поэтому сразу после открытия того файла Workbooks(Workbooks.Count) показывает на него. Можно запомнить в объектную переменную, а если никаких других книг не открывается в процессе обработки - так и запоминать ничего не нужно.
Originally posted by Cutty Sark
А я вот так действую в таких случаях:
Книги в Экселе нумеруются в порядке открытия. Поэтому сразу после открытия того файла Workbooks(Workbooks.Count) показывает на него. Можно запомнить в объектную переменную, а если никаких других книг не открывается в процессе обработки - так и запоминать ничего не нужно.
А если юзер вручную книгу откроет\закроет, откроет другую. и тп. тогда как? прога начнет работать с левой книгой и делать там чего совсем ненадо. а если указать имя, то он просто выкинет ошибку, если книга закрыта.
А если юзер вручную книгу откроет\закроет, откроет другую. и тп. тогда как? прога начнет работать с левой книгой и делать там чего совсем ненадо. а если указать имя, то он просто выкинет ошибку, если книга закрыта.
для этого необходимо отслеживать открываемые книги по их содержимому (юзер вполне способен открыть не тот файл, тем более не зная точно его имени, ориентируясь например по дате создания), в моем случае программа отслеживает открывался ли подобный файл ранее (что недопустимо) и содержит ли файл те данные, которые ей необходимы :)
А если юзер вручную книгу откроет\закроет, откроет другую. и тп. тогда как? прога начнет работать с левой книгой и делать там чего совсем ненадо. а если указать имя, то он просто выкинет ошибку, если книга закрыта.
Как это вручную? А разве это все не в ходе одного выполнения программы? Ну если вручную - так пожалуйста, запоминайте книгу в переменную, и все ок. Да что мы спорим, тут любой метод хорош, а выбор зависит от деталей.
Я обычно использую Workbooks.Count по следующим причинам:
1. Часто по ходу деятельности мне приходится открывать в Экселе хтмльки из Инета, у них такое дурацкое имя получается при открытии, возиться с ним никакой охоты нет.
2. Чтобы в ходе пошаговой отладки не задумываться над тем, что у меня там активно, я стараюсь никогда не использовать ActiveCell, ActiveWorkbook и т.д. без прямой на то нужды.
Доброго дня всем! подскажите пожалуйста, какая строка практичнее будет и эффективнее для закрытия файла xl, что бы не висел в памяти ПК: задача такова, что бы закрывать конкретную книгу но не всегда это получает:
Выгрузка из памяти (Закрытие программы)
ПАМАГИТЯ. Как сделать так чтобы при нажатии на крестик(выход) появлялась другая форма а само.
Корректное закрытие Excel
Здравствуйте! Подскажите пожалуйста, как закрыть Excel, чтобы он уходил с процессов? Спасает лишь.
Корректное закрытие Excel
Как правильно закрыть Excel приложение Пробывал ExcelApplication1->Quit();.
при детальной проверки, суть проблемы заключается в том что пока файл xl закрыт то каждый момент закрытия работает нормально, Но если файл ОТКРЫТ то работает только
, остальные глючат. что можно сделать в подобной ситуации пример со своим кодом во вложении (предварительно откройте файл DOC и запустите проект.
Все таки когда открыта определенная книга, ни один предложенный код не закрывает (коды то работают когда все закрыта), кроме этого
данный код работает убивает все процессы xl приложения! но задача состоит в том что бы закрыть определенный открытый файл.
Да, но если так то, когда заново происходит проверка открыт ли файл программа по коду проверки пишет что файл открыт и не зависимо какой XL приложение работает и проверяет по приложению
ASSEI, а можно поподробнее: вот вы запускаетет свой макрос, поработали с ним, внесли какие-то данные в книгу, сохранили и закрыли. Потом запускаете этот же макрос, а он пишет, что книга, с которой вы только что работали - открыта и не дает сохранить внесенные изменения? Или же вам нужно открыть книгу, которая, возможно, уже вручную открыта на этом же компе?
Здравствуйте уважаемый _shark простите за столь долгий отклик, поясняю подробнее: у меня в работе 2-а xl файла которые не относятся к проекту, и когда загружается проект в проекте работают две книги "DOC" И "BD" т.е. они поочередно в зависимости от задачи проекта открываются и закрываются, и процессе проверяются кодом программы открыта ли книга или "DOC" или "BD", и если я закрываю книгу способами:
все эти способы работают только тогда если у меня ЗАКРЫТЫ вообще все книги в том числе и те которые не относятся к проекту.
НО если вдруг открыта любая книга даже та которая не относится к проекту, хотя я проверку провожу конкретной книги которая в работе у проекта, все равно код показывает, что приложение открыто и так как открыта книга которая не относится к проекту НО приложение то XL открыто вот на нее он реагирует, а не на конкретную книгу и в памяти висит да же если программно закрыть книги выше указанным способом то само приложение висит в памяти и программа считывает любую проверку как открытую книгу.
Поэкспериментируйте с вложением который я вложил ранее перед тем как запустить форму откройте файл xl и приложение будет показывать что файл открыт и оно не закроется выше указанными способами, сами увидите код , но вот этот код
убивает все напрочь это хорошо, но приходится заново открывать книги которые не относятся к проекту! о как я навоял!
Добавлено через 15 секунд
Здравствуйте уважаемый _shark простите за сто продолжительный отклик, поясняю подробнее: у меня в работе 2-а xl файла которые не относятся к проекту, и когда загружается проект в проекте работают две книги "DOC" И "BD" т.е. они поочередно в зависимости от задачи проекта открываются и закрываются, и процессе проверяются кодом программы открыта ли книга или "DOC" или "BD", и если я закрываю книгу способами:
все эти способы работают только тогда если у меня ЗАКРЫТЫ вообще все книги в том числе и те которые не относятся к проекту.
НО если вдруг открыта любая книга даже та которая не относится к проекту, хотя я проверку провожу конкретной книги которая в работе у проекта, все равно код показывает, что приложение открыто и так как открыта книга которая не относится к проекту НО приложение то XL открыто вот на нее он реагирует, а не на конкретную книгу и в памяти висит да же если программно закрыть книги выше указанным способом то само приложение висит в памяти и программа считывает любую проверку как открытую книгу.
Поэкспериментируйте с вложением который я вложил ранее перед тем как запустить форму откройте файл xl и приложение будет показывать что файл открыт и оно не закроется выше указанными способами, сами увидите код , но вот этот код
убивает все напрочь это хорошо, но приходится заново открывать книги которые не относятся к проекту! о как я навоял!
Проблема в том что при каждом открытии запускается новый процес EXCEL.EXE но при закрытии не закрывается. За день программа будет открывать Ексель до 20-30 раз, это 200-300 Мб оперативки. Вопрос: Как правильно сделать так чтобы Каждый раз процесс закрывался.
Заранее благодарен за любую помощь!
Корректное закрытие Excel
Как правильно закрыть Excel приложение Пробывал ExcelApplication1->Quit();.
коректное отображение
Здравствуйте! Такой вопрос. Суть программы залючается в создании класса Время (и организация.
Ширина столбца и закрытие Excel документа
Работаю с oracle ado/odbc. Нужно перенести данные в из дбгрид в таблицу Excel/ задачей.
Корректное закрытие Excel
Здравствуйте! Подскажите пожалуйста, как закрыть Excel, чтобы он уходил с процессов? Спасает лишь.
результа тотже что и в первый раз
Добавлено через 5 минут
Забыл сказать: все процессы Екселя закрываются автоматически после выхода из программы.
Да, так тоже можно. Этот вариант я рассматривал как основной, но зачем писать самому если в C++ Builder'e есть готовые компоненты, с которыми намного проще работать. На многих форумах указывается Ваш вариант работы с екселем, но и много людей ищет как работать через компоненты.
Добавлено через 4 минуты
Подскажите пожалуйста что делает эта команда? может вся загвоздка в этой строке? и я попробую найти что то похожее.
Подскажите пожалуйста что делает эта команда? может вся загвоздка в этой строке? и я попробую найти что то похожее.
это не команда и на закрытие Excel точно не влияет
"myExcel = Unassigned;" нужно если переменная myExcel будет ещё использоваться - чтобы можно было проверить на значение, это как NULL для указателя.
The Unassigned constant is used to indicate that a variant has not yet been assigned a value. The initial value of any variant is Unassigned. The Unassigned value disappears as soon as a variant is assigned any other value, including the value 0, a zero-length string, and the Null value.
Use the VarIsEmpty standard function to test whether a variant is Unassigned. When used on an Unassigned variant, the VarType standard function returns varEmpty. An EVariantError exception is thrown if an Unassigned variant appears in any other expression or an attempt is made to convert an Unassigned variant to another type (using VarAsType or VarCast).
You can make a variant unassigned by assigning the Unassigned constant to it. This is useful with variants referencing OLE Automation Objects that you want to keep "alive" until another value is assigned to the variant.
После манипуляции с файлом необходимо его закрыть. В противном случае он останется захваченным в системе, и мы не сможем его использовать в других приложениях.
Клиент-Серверный вариант в управляемых формах.
1. Считываем данные из файла в массив из структур и затем этот массив передаем на сервер для дальнейших манипуляций с данными.
2-ой способ - это передать файл Excel на сервер через хранилище данных и далее работать с ним уже на сервере.
Очень часто приходится работать с очень большими файлами Excel, и его обработка путем перебора строк занимает огромное количество времени.
В таких случаех удобно в одно действие загрузить всю таблицу в массив и в потом работать уже непосредственно с массивом.
На выходе получаем двумерный массив, который содержит все данные указанного листа Excel
Полезные функции при работе с Excel:
Устанавливает видимость Excel при работе |
Добавление новой книги в файл Excel |
Сохранение книги Excel |
Добавление нового листа к книге |
Переименование листа |
Изменение маштаба листа |
Изменение ориентации листа |
Отступы листа |
Обращение к ячейки чтение/запись |
Обращение к области ячеек |
Очень часто при чтении или записи значений в Excel ставятся лишние пробелы в числе, например, вместо 1502 он читает как 1 502 и в дальнейшем это значение не приводится к числу. Эту проблему можно решить заменой. |
Объединение ячеек |
Работа с именованными ячейками в Excel |
Удаление ячейки |
Удаление области ячеек |
Обращение к строке |
Изменение ширины колонки |
Обращение к колонке |
Удаление Строки |
Фон ячейки / области / Строки / |
Функция переводит цвет из формата RGB в формат Excel |
Управление шрифтом в ячейки/строке/области |
Р азрешает переносить по словам в ячейке |
Управление рамкой ячейки |
Устанавливаем формат ячейки |
Формула в ячейки |
Формула в ячейки |
Формула в ячейки |
Формула в ячейки |
Функция для получения ширины колонки Excel Спасибо пользователю goodwill |
Разрешить перенос слов в ячейке Спасибо пользователю roofless |
Группировки данных на листе Спасибо пользователю dr-wit, ignor |
При работе с Excel мы оперируем столбцами как числом (Например, 1 столбец), а у Excel адресация столбцов производится с помощью символов. И когда нам нужно отредактировать формулу, то нам нужно номер столбца преобразовать в символ. В таких случаях вам пригодится эта функция.
2. Работа с Excel через ТабличныйДокумент 1С
С помощью данного метода можно и загружать из Excel и выгружать в Excel. Но на мой взгляд этот метод идепально подходит когда вам необходимо посто сохранить информацию в Excel без дальнейшей манипуляции.
Итак, приступим: загрузка из Excel:
1. Загружаем файл Excel в табличный документ
2. Производим манипуляции уже с ТабличнымДокументом
Давайте теперь разберем сохранение в Excel с помощью данного метода:
Тут все очень просто сначала мы формируем обычный Табличный документ и затем записываем его в Excel
2. Работа с Excel ADODB
Выражаю особую благодарность коллеги Fragster за хороший комментарий
Данный метод позволяет работать с Excel через ODBC и имеет ряд преимуществ:
- Не требует установки самой Excel, необходима лишь установить ODBC. Но как правило он уже установлен. Это особенность позволяет работать на стороне сервера без дополнительных установок Excel.
- Позволяет работать с таблицой Excel как с БД и строить к ней запросы на T-SQL. Таким образом мы можем делать отборы еще на этапе чтения данных и другие преимущества что дает Т-SQL. Что на мой взгляд огромный плюс.
Подключение к ADO
Отключение от ADO
Выполнение запроса
Пример запроса:
Запись в Excel тоже производится в виде запроса:
Хочу отметить что наименование полей производится по первой строке в таблице
ADODB предоставляет ряд объектов, с которыми мы работаем
ADODB.Recordset
В файле продемонстрированны оба варианта работы с запросами.
На этом пока все. По возможности буду дополнять статью :)
В архиве находится обработка, которая демонстрирует все описанные и другие возможности при работе с Excel.
Я использую этот код, чтобы открыть файл Excel :
и для доступа к данным, я использую этот код :
Я вижу подобные вопросы в stackoverflow, такие как этот вопрос и этой, и тестовые ответы, но это не работает.
при закрытии рабочей книги у вас есть три необязательных параметра:
Workbook.Close(false) или если вы делаете позднюю привязку, иногда проще использовать ноль Workbook.Close(0) Вот как я это сделал при автоматизации закрытия книг.
также я пошел и посмотрел документацию для него, и нашел его здесь: Книга Excel Закрыть
попробуйте это.. у меня получилось. чтобы остановить процесс, необходимо освободить объект приложения xl.
подумайте об этом, это убивает процесс:
кроме того, вы пытались просто закрыть его нормально?
избегайте использования выражений с двойной точкой вызова, таких как:
. потому что таким образом вы создаете объекты RCW не только для книги, но и для книг, и вы также должны освободить его (что невозможно, если ссылка на объект не поддерживается).
это решило проблему для меня. Ваш код становится:
и затем освободите все эти объекты:
я заворачиваю это в try <> finally <> чтобы убедиться, что все выйдет, даже если что-то пойдет не так (что может пойти не так?), например,
убить Excel не всегда легко; см. Эту статью: 50 способов убить Excel
эта статья принимает лучшие советы от Microsoft (MS Knowlege базовая статья) о том, как заставить Excel выйти красиво, но затем также убеждается в этом, убивая процесс, если это необходимо. Мне нравится иметь второй парашют.
обязательно закройте все открытые книги, закройте приложение и отпустите объект xlApp. Наконец, проверьте, является ли процесс все еще жив, а если жив, то убей его.
эта статья также гарантирует, что мы не убиваем все процессы Excel, но убивает только точный процесс, который был запущен.
вот код, который я использую: (работает все время)
excelBook.Закрывать(); excelApp.Выход(); добавьте конец кода, этого может быть достаточно. он работает над моим кодом
Я встретил те же проблемы и попробовал много методов для их решения, но не работает. Наконец , я нашел мой путь. Некоторые ссылки Введите описание ссылки здесь
надеюсь, что мой код может помочь кому-то в будущем. Я потратил больше двух дней, чтобы решить эту проблему. Ниже приведен мой код:
вы можете убить процесс своими COM объект excel pid
добавить где-то ниже dll import code
он закрывает последний процесс 10 сек с именем "Excel"
правильный способ закрыть весь процесс excel
на основе других решений. Я использую это:
используя "MainWindowHandle", чтобы идентифицировать процесс и закрыть его.
excelObj: это мое приложение Interop excel objecto
используйте переменную для каждого объекта Excel и должны loop Marshal.ReleaseComObject >0 . Без цикла процесс Excel по-прежнему остается активным.
мы можем закрыть приложение Excel при преобразовании xls в xlsx, используя следующий код. Когда мы выполняем такую задачу, приложение Excel работает в диспетчере задач, мы должны закрыть этот excel, который работает в фоновом режиме. Interop-это com-компонент, для выпуска com-компонента мы использовали Маршал.FinalReleaseComObject.
большинство методов работает, но процесс excel всегда остается до закрытия приложения.
когда процесс Kill excel один раз не может быть выполнен еще раз в том же потоке - не знаю почему.
этот GetWindowThreadProcessId находит правильный идентификатор процесса o excell . После убивает его. Наслаждайтесь.
Читайте также: