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

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

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

Author24 — интернет-сервис помощи студентам
Доброго дня всем! подскажите пожалуйста, какая строка практичнее будет и эффективнее для закрытия файла 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.07.2017, 11:22
Ответы с готовыми решениями:

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

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

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

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

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

Цитата Сообщение от _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  [ТС] 22
ругается чуть ли ни на все строки
Вложения
Тип файла: rar 01.rar (6.6 Кб, 3 просмотров)
0
185 / 183 / 31
Регистрация: 11.10.2016
Сообщений: 599
12.07.2017, 10:20 23
Цитата Сообщение от 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  [ТС] 24
Цитата Сообщение от _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
185 / 183 / 31
Регистрация: 11.10.2016
Сообщений: 599
12.07.2017, 16:34 25
ASSEI, давайте попробуем всё по порядку. Итак, вы запускаете ваш VB-проект, Эксель не запущен, никакая его копия при этом в памяти не висит. Вы открываете книгу, возможно, что-то вносите в нее, потом закрываете и Эксель на момент закрытия ругается?

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

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


Цитата Сообщение от _shark Посмотреть сообщение
Кстати, не знаю почему, но при ручном открытии вашего DOC.xlsx Эксель этот файл преобразует и открывает "только для чтения" в виде Xl00000011.xls. Может быть, в этом "корень зла"? (:
Этот момент НЕ совсем ваша формулировка мне понятна! Но дело обстоит так: если с разу изначально открыть в ручную фай "DOC" то при запуске проекта будет ругаться строка
Visual Basic
1
 .oBook.Close
, а хотелось бы просто "убить" эту книгу дабы не получилось бы в процессе работы с проектом двойного запуска этого файла "DOC".
0
185 / 183 / 31
Регистрация: 11.10.2016
Сообщений: 599
12.07.2017, 17:10 27
попробуйте пошагово через 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  [ТС] 28
ВОТ НА СТРОКУ РУГАЕТСЯ
Visual Basic
1
Set .oSheet = .oBook.Worksheets("BD")
, ЧТО ОТКРЫТАЯ КНИГА ЧТО ЗАКРЫТАЯ КНИГА!

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

P.S. Вообще, неплохо было бы озвучивать название ошибок. Обычно, там и находится ответ.
0
16.07.2017, 20:31
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.07.2017, 20:31
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
31
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru