Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.98/55: Рейтинг темы: голосов - 55, средняя оценка - 4.98
0 / 1 / 3
Регистрация: 18.10.2012
Сообщений: 662

Корректное закрытие файла xl и выгрузка из памяти ПК

04.07.2017, 11:22. Показов 12628. Ответов 30
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго дня всем! подскажите пожалуйста, какая строка практичнее будет и эффективнее для закрытия файла xl, что бы не висел в памяти ПК: задача такова, что бы закрывать конкретную книгу но не всегда это получает:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Public XL As Object
Set XL = CreateObject("Excel.Application")
'-----------
XL.ActiveWorkbook.Close  'в некоторых случаях не работает
'-----------
XL.Quit  'работает через раз
'-----------
 Set XL = Nothing 'закрывает файл, но не выгружает из памяти
'----------
 Shell ("taskkill /F /IM excel.exe") 'эта вещь закрывает все и убивает все процессы xl
'---------
Dim ff As Integer     'данный вариант  не рассматривался так как был содран откуда то
ff = CreateObject("Excel.Application")
Close #ff
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.07.2017, 11:22
Ответы с готовыми решениями:

Выгрузка из памяти (Закрытие программы)
ПАМАГИТЯ!!!! Как сделать так чтобы при нажатии на крестик(выход) появлялась другая форма а само приложение не выгружалось!

Корректное закрытие файла Excel
Здравствуйте, уважаемые участники! Подскажите, пожалуйста как корректно закрыть файл .xls в vba? Файл открывается следующим кодом: ...

Корректное закрытие Excel
Здравствуйте! Подскажите пожалуйста, как закрыть Excel, чтобы он уходил с процессов? Спасает лишь killProcess, но говорят, что это не...

30
0 / 1 / 3
Регистрация: 18.10.2012
Сообщений: 662
11.07.2017, 12:00  [ТС]
Студворк — интернет-сервис помощи студентам
Да но и этой переменной в вашем коде нет:

Цитата Сообщение от _shark Посмотреть сообщение
Работу с Экселем я реализовал таким образом:
Добавил переменную и пришлось добавлять еще кое что что бы открывалась книга без них выдавало много ошибок:
Visual Basic
1
2
3
4
5
Public ExTable As ExTableType
Public oExcel As Object
Public oBook As Object
Public oSheet As Object
 Public Status As Byte
0
0 / 1 / 3
Регистрация: 18.10.2012
Сообщений: 662
11.07.2017, 12:04  [ТС]
ругается чуть ли ни на все строки
Вложения
Тип файла: rar 01.rar (6.6 Кб, 3 просмотров)
0
193 / 191 / 31
Регистрация: 11.10.2016
Сообщений: 610
12.07.2017, 10:20
Цитата Сообщение от ASSEI Посмотреть сообщение
Добавил переменную и пришлось добавлять еще кое что что бы открывалась книга без них выдавало много ошибок:

Public ExTable As ExTableType
Public oExcel As Object
Public oBook As Object
Public oSheet As Object
Public Status As Byte
смотрите, все эти переменные - они есть в структуре ExTableType. То есть, мы пишем Public ExTable As ExTableType и потом к этим полям структуры обращаемся через With

Visual Basic
1
2
3
4
5
6
With ExTable
        Set .oExcel = CreateObject("Excel.Application")  'указатель на объект
        Set .oBook = .oExcel.Workbooks.Open(MainExcelFile)  'указатель на книгу
        Set .oSheet = .oBook.Worksheets(LMonth)  'указатель на лист
        .Status = 1
End With
То есть, нет необходимости отдельно расписывать эти переменные.

Посмотрел код из присланного архива. Вы там точечки забыли. Попробуйте переписать код вот так:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Private Sub Command1_Click()
'закрытие книги
    With ExTable
        If (Status And 2) = 2 Then .oBook.Save
        'Status = Status Or 2 'переменную статус изменять надо только если вы изменяли данные в книге,
        'верхняя строка .oBook.Save позволит сохранить изменения
        'oExcel.Workbooks.Close  'РУГАЕТСЯ ВОТ НА ЭТУ СТРОКУ
        .oBook.Close 'закомментируем верхнюю строку и попробуем закрыть книгу другим способом
        .oExcel.Quit
        Set .oExcel = Nothing
    End With
End Sub
1
0 / 1 / 3
Регистрация: 18.10.2012
Сообщений: 662
12.07.2017, 15:49  [ТС]
Цитата Сообщение от _shark Посмотреть сообщение
Я пользуюсь своим макросом, который в VBA из-под Корела открывает Эксель, заносит туда нужные мне данные и закрывает книгу. И сколько бы раз я за день не открыл книгу - она всегда корректно закрывается. Кроме, разве что, самого процесса, висящего в памяти, но он абсолютно не мешает, при "ручном" открытии Экселя просто появляется такой же процесс.
Теперь я понял что вы хотели сказать этим МЕНЯ УСТРАИВАЕТ! НО вот что делать с тем когда я проверяю открыта ли книга а делаю я так:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Private Sub Form_Load()   'подскажите как провести проверку открыт ли файл, а это то до чего я догадался "неправильно"
If BookOpen(App.Path & "\DOC.xlsx") = True Then
    MsgBox "Файл с таким именем в папке существует!", 64, "ИНФОРМАЦИЯ!"
  With ExTable
        If (.Status And 2) = 2 Then .oBook.Save
        .Status = .Status Or 2
        .oBook.Close
       .oExcel.Quit
        Set .oExcel = Nothing
End With
 End If
End Sub
Добавлено через 7 минут
с проверкой определился! только вот ругается на строку:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Private Sub Form_Load()
If BookOpen(App.Path & "\DOC.xlsx") = True Then
        MsgBox "Книга открыта и будет закрыта", vbInformation, "сообщение"
     'закрываем ее
With ExTable
        If (.Status And 2) = 2 Then .oBook.Save
        .Status = .Status Or 2
        .oBook.Close   'ругается на строку!
       .oExcel.Quit
        Set .oExcel = Nothing
     End With
          End If
End Sub
Добавлено через 58 минут
все таки если файл открыт то все равно ругается на строку
Visual Basic
1
 .oBook.Close   'ругается на строку!
0
193 / 191 / 31
Регистрация: 11.10.2016
Сообщений: 610
12.07.2017, 16:34
ASSEI, давайте попробуем всё по порядку. Итак, вы запускаете ваш VB-проект, Эксель не запущен, никакая его копия при этом в памяти не висит. Вы открываете книгу, возможно, что-то вносите в нее, потом закрываете и Эксель на момент закрытия ругается?

Кстати, можно попробовать виртуальную копию Экселя сделать видимой. Попробуйте что-то, типа, ExTable.oExcel.Visible = True.

Кстати, не знаю почему, но при ручном открытии вашего DOC.xlsx Эксель этот файл преобразует и открывает "только для чтения" в виде Xl00000011.xls. Может быть, в этом "корень зла"? (:
0
0 / 1 / 3
Регистрация: 18.10.2012
Сообщений: 662
12.07.2017, 16:56  [ТС]
Цитата Сообщение от _shark Посмотреть сообщение
Итак, вы запускаете ваш VB-проект, Эксель не запущен, никакая его копия при этом в памяти не висит. Вы открываете книгу, возможно, что-то вносите в нее, потом закрываете и Эксель на момент закрытия ругается?
вот в таком порядке все работает нормально даже сторонние книги которые не относятся к проекту, нормально работают! ПРОЕКТ НЕ РУГАЕТСЯ.


Цитата Сообщение от _shark Посмотреть сообщение
Кстати, не знаю почему, но при ручном открытии вашего DOC.xlsx Эксель этот файл преобразует и открывает "только для чтения" в виде Xl00000011.xls. Может быть, в этом "корень зла"? (:
Этот момент НЕ совсем ваша формулировка мне понятна! Но дело обстоит так: если с разу изначально открыть в ручную фай "DOC" то при запуске проекта будет ругаться строка
Visual Basic
1
 .oBook.Close
, а хотелось бы просто "убить" эту книгу дабы не получилось бы в процессе работы с проектом двойного запуска этого файла "DOC".
0
193 / 191 / 31
Регистрация: 11.10.2016
Сообщений: 610
12.07.2017, 17:10
попробуйте пошагово через F8 запустить такой код даже при запущенном Экселе с уже открытым файлом DOC.xlsx.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Private Sub Text11()
    With ExTable
        Set .oExcel = CreateObject("Excel.Application")
        Set .oBook = .oExcel.workbooks.Open("c:\doc.xlsx")
        Set .oSheet = .oBook.Worksheets("BD")  'browse all pages
        .Status = 1
        .oExcel.Visible = True
    End With
    MsgBox ExTable.oBook.ReadOnly
    ExTable.oBook.Close
    ExTable.oExcel.Quit
End Sub
Запустится новая копия Экселя, повторно загрузится книга, но она уже будет в режиме "только для чтения". Потом она также корректно закроется и закроется также копия Экселя.
Как вы видите, свойство ReadOnly покажет, что файл открыт в этом режиме, а значит эта книга уже открыта в другой копии Экселя. Чтобы ее закрыть вам надо, скорей всего, воспользоваться API-функциями, найти в памяти уже запущенную копию Экселя, найти окна им открытые и нужное окно закрыть через SendMessage
0
0 / 1 / 3
Регистрация: 18.10.2012
Сообщений: 662
12.07.2017, 17:39  [ТС]
ВОТ НА СТРОКУ РУГАЕТСЯ
Visual Basic
1
Set .oSheet = .oBook.Worksheets("BD")
, ЧТО ОТКРЫТАЯ КНИГА ЧТО ЗАКРЫТАЯ КНИГА!

Добавлено через 6 минут
ЗАКОМЕНТИРОВАЛ ЕЕ , СРАБОТАЛО
0
193 / 191 / 31
Регистрация: 11.10.2016
Сообщений: 610
12.07.2017, 17:43
Цитата Сообщение от ASSEI Посмотреть сообщение
ВОТ НА СТРОКУ РУГАЕТСЯ
возможно, вы просто переименовали название листа
0
0 / 1 / 3
Регистрация: 18.10.2012
Сообщений: 662
13.07.2017, 13:28  [ТС]
_shark
Visual Basic
1
.oSheet.Range.SELECTION.HorizontalAlignment = "4"
подскажите почему при выравнивании в ячейке происходит ошибка?
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18035 / 7738 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
16.07.2017, 20:31
ASSEI, может, потому что числовая константа имеет тип "Строка"?

P.S. Вообще, неплохо было бы озвучивать название ошибок. Обычно, там и находится ответ.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.07.2017, 20:31

Корректное закрытие Excel
Как правильно закрыть Excel приложение Пробывал ExcelApplication1->Quit(); ExcelApplication1->Disconnect(); ...

DataReport - корректное закрытие объекта
После вывода на печать DataReport1 выполняю Set DataReport1= Nothing. (для того чтобы при следующем выполнении прошла процедура...

Корректное закрытие книги Excel
Private Sub Кнопка_ДО_Click() Dim sFileName_PR As String Dim lLastRow As Integer sPath = CurrentProject.Path ...

Корректное закрытие дополнительного потока
Всем здравствуйте. type { TComPortPoolingThread } TComPortPoolingThread = class(TThread) private protected ...

Корректное закрытие окна Excel
Добрый день! Подскажите, пожалуйста, каким образом можно решить следующую задачу. Я написал скрипт (макрос), который...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
31
Ответ Создать тему
Новые блоги и статьи
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru