На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Организуем VBA-FAQ! Если у Вас есть предложения, выскажитесь здесь: Пишем FAQ, интересно Ваше мнение
Популярные разделы FAQ:    user posted image Общие вопросы    user posted image Особенности VBA-кода    user posted image Оптимизация VBA-кода    user posted image Полезные ссылки

1. Старайтесь при создании темы указывать в заголовке или теле сообщения название офисного приложения и (желательно при работе с Office 95/97/2000) его версию. Это значительно сократит количество промежуточных вопросов.
2. Формулируйте вопросы как можно конкретнее, вспоминая (хотя бы иногда) о правилах ВЕЛИКОГО И МОГУЧЕГО РУССКОГО ЯЗЫКА, и не забывая, что краткость - сестра таланта.
3. Не забывайте использовать теги [сode=vba] ...текст программы... [/code] для выделения текста программы подсветкой!
4. Темы с просьбой выполнить какую-либо работу полностью за автора здесь не обсуждаются и переносятся в раздел ПОМОЩЬ СТУДЕНТАМ.
Модераторы: Old Bat, MIF
  
> Удалить память при создании документа word из vba excel
    Здравствуйте. Я создаю динамически документ ворд через приложение vba excel, далее заполняю его данными. Подскажите нужно ли удалять объекты, через которые я
    создаю документ word, такие как oWord, oDocument, docActive в моей программе. Будет ли утечка памяти, если не удалить эти объекты. Если нужно их удалять, то подскажите как это
    сделать.

    ExpandedWrap disabled
      Dim oWord As Object
      Dim oDocument As Object
       
       
      Sub Add_Doc_Zadvizhek()
          Dim Mytime, myTimeSokr As String 'Переменная для текущего времени
          Dim MyDate As String 'Переменная текущей даты
          Dim TimeDate As String 'Переменная содержащая дату и время
          Dim NameWihtoutDate, SaveFileName As String 'NameWihtoutDate - Имя файла без даты, FileName - имя файлы с датой
          Dim Dlina_Mytime As Integer 'длина строки
          Dim Putfile As String
          Dim tableNew As Object
          Dim docActive As Object
          Dim i, j As Integer
          Dim myRange As Object
          Dim nach_poz As Integer
          Dim kon_poz As Integer
          Dim kol_zadv As Integer
          Dim provKoncStran As Integer
          Dim NomNachStrShkaf, NomKonStrShkaf, NomTekStroki, KolZadvShkafa As Integer
          Dim nextPage As Integer 'Индикатор следующей страницы, перешла ли строка таблицы на следующую страницу
          Dim tekStrDokum, RowPredStolb As Integer
          Dim NazvShkProdolj As String
          
          'Даём этому экземпляру имя "oWord". Через это имя
          'будем обращаться к программе Word.
           Set oWord = CreateObject("Word.Application")
       
          'Делаем программу "Word" видимой.
           oWord.Visible = True
       
          'Создаём в программе Word документ и обращаемся к этому
          'документу как "oDocument".
           Set oDocument = oWord.Documents.Add
        
          'Присваиваем объекту docActive активный документ приложения oWord
           Set docActive = oWord.ActiveDocument
        
      Далее идет заполнение документа большим объемом данных...
      Поскольку переменные определены на уровне модуля (почему, кстати?), а инициализируются в процедуре - да, нужно чистить (не забыть предварительно закрыть методами Close/Exit/Quit/etc.) присвоением Nothing. Впрочем, это не гарантирует выгрузки хост-процесса объекта Word.Application, так что если под утечкой памяти понимать в т.ч. и появление нескольких копий такого хост-процесса - то подобное вполне может быть.
      Сообщение отредактировано: Akina -
        Цитата Akina @
        Поскольку переменные определены на уровне модуля (почему, кстати?), а инициализируются в процедуре - да, нужно чистить (не забыть предварительно закрыть методами Close/Exit/Quit/etc.) присвоением Nothing. Впрочем, это не гарантирует выгрузки хост-процесса объекта Word.Application.

        А если переменные определять на уровне процедуры, то можно не очищать память? Скажите а что может гарантировать выгрузку хост-процесса объекта Word.Application? Вы не можете показать как очищать память в моем примере?
          Цитата Fellinggood @
          А если переменные определять на уровне процедуры, то можно не очищать память?

          Не очищать - можно (хотя и в этом случае не рекомендуется). Не закрывать (Document.Close, Application.Quit) - нельзя.

          Цитата Fellinggood @
          что может гарантировать выгрузку хост-процесса объекта Word.Application?

          Я не видел примеров кода, гарантирующих завершение хост-процесса. Равно как не видел примеров его принудительного снятия без возможного завершения других (открытых параллельно) экземпляров Ворда.
          Сообщение отредактировано: Akina -
            Цитата Akina @
            Не очищать - можно (хотя и в этом случае не рекомендуется). Не закрывать (Document.Close, Application.Quit) - нельзя.

            А если мне нужно чтобы документ был открытым и чтобы пользователь когда ему нужно сам закрывал документ, эти процессы могут быть обработаны самостоятельно Document.Close, Application.Quit

            Добавлено
            И еще вопрос: покажите пожалуйста, как очищать память для этих объектов
            ExpandedWrap disabled
              Set oWord = CreateObject("Word.Application")
              Set oDocument = oWord.Documents.Add

            И в каком порядке закрывать объекты: Document.Close, Application.Quit
              Цитата Fellinggood @
              в каком порядке закрывать объекты

              В порядке, строго обратном открытию. После чего выполнять освобождение переменных. Т.е. в показанном случае

              ExpandedWrap disabled
                Set oWord = CreateObject("Word.Application")
                Set oDocument = oWord.Documents.Add
                ' Необходимые действия с объектами
                ' ...
                ' Закрытие ресурсов
                oDocument.Close ' или даже ForEach oDoc In oWord.Documents : oDoc.Close : Next
                oWord.Quit
                ' Освобождение переменных
                Set oDocument = Nothing
                Set oWord = Nothing


              Цитата Fellinggood @
              мне нужно чтобы документ был открытым и чтобы пользователь когда ему нужно сам закрывал документ

              Тогда только освобождение переменных.
                Цитата Akina @
                Цитата Fellinggood @
                мне нужно чтобы документ был открытым и чтобы пользователь когда ему нужно сам закрывал документ

                Тогда только освобождение переменных.

                спасибо!

                Добавлено
                Цитата Akina @
                В порядке, строго обратном открытию. После чего выполнять освобождение переменных. Т.е. в показанном случае

                ' Закрытие ресурсов
                oDocument.Close ' или даже ForEach oDoc In oWord.Documents : oDoc.Close : Next
                oWord.Quit
                ' Освобождение переменных
                Set oDocument = Nothing
                Set oWord = Nothing[/CODE]

                Цитата Fellinggood @
                мне нужно чтобы документ был открытым и чтобы пользователь когда ему нужно сам закрывал документ

                Тогда только освобождение переменных.

                А переменную Set docActive = oWord.ActiveDocument нужно освобождать? А то мне на другом форуме подсказали, что она ссылается на тот же объект, что и oDocument?
                  Цитата Fellinggood @
                  А переменную Set docActive = oWord.ActiveDocument нужно освобождать?

                  Да, конечно.
                    Цитата Akina @
                    Цитата Fellinggood @
                    А переменную Set docActive = oWord.ActiveDocument нужно освобождать?

                    Да, конечно.

                    А что раньше oDocument или docActive удалять? В обратном порядке как они появлялись?
                    Сообщение отредактировано: Fellinggood -
                      Да.
                      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                      0 пользователей:


                      Рейтинг@Mail.ru
                      [ Script execution time: 0,0435 ]   [ 16 queries used ]   [ Generated: 28.03.24, 17:36 GMT ]