Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> VBA Процедура разбивки документа, Разное поведение кода 
V
    Опции темы
Ethex
Дата 14.8.2017, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 8.6.2017

Репутация: нет
Всего: нет



Доброго времени суток
Имеется код для постраничной разбивки файла word. Тестировал процедуру в mdb - всё работает. 
Код

Public Sub SIP()
Dim app As Word.Application
Dim wd As Word.Document
Dim cd As Word.Document
Dim wr As Word.Range
Dim i As Integer
Dim cnt As Integer
Dim fn As String
Set app = CreateObject("Word.Application")
Set wd = app.Documents.Open(Forms![ImpWord2].[Поле2].Value)
Set wr = wd.Range
i = 1
cnt = wd.Content.ComputeStatistics(wdStatisticPages)
SysCmd acSysCmdClearStatus
SysCmd acSysCmdInitMeter, "Страницы документа", cnt
   Do Until i > cnt
   SysCmd acSysCmdUpdateMeter, i
      If i = cnt Then
      wr.End = wd.Range.End
      Else
      Selection.Goto wdGoToPage, wdGoToAbsolute, i + 1
      wr.End = Selection.Start
      End If
wr.Copy
Set cd = Documents.Add
cd.Range.Paste
cd.Range.Find.Execute Findtext:="^m", ReplaceWith:=""
fn = Replace(wd.FullName, ".doc", "_" & i & ".doc")
cd.SaveAs fn
i = i + 1
Me!Список0.AddItem Item:=fn
cd.Close
wr.Collapse wdCollapseEnd
Loop
SysCmd acSysCmdClearStatus
Set wd = Nothing
Set cd = Nothing
Set wr = Nothing
End Sub

Начал делать форму в accdb(2007 - 2010), писал аналогично (оба кода копировал не глядя)
Код

Public Sub Separate()   'Ðàçäåëåíèå äîêóìåíòà íà ñòðàíèöû
Dim app As Word.Application
Dim wd As Word.Document
Dim cd As Word.Document
Dim wr As Word.Range
Dim i As Long
Dim cnt As Long
Dim fn As String
Set app = CreateObject("Word.Application")
Set wd = app.Documents.Open(Forms![Form1].[Поле0].Value)
Set wr = wd.Range
i = 1
cnt = wd.Content.ComputeStatistics(wdStatisticPages)
SysCmd acSysCmdClearStatus
SysCmd acSysCmdInitMeter, "Разбивка страниц", cnt
   Do Until i > cnt
   SysCmd acSysCmdUpdateMeter, i
      If i = cnt Then
      wr.End = wd.Range.End
      Else
      Selection.Goto wdGoToPage, wdGoToAbsolute, i + 1
      wr.End = Selection.Start
      End If
   wr.Copy
   Set cd = Documents.Add
   cd.Range.Paste
   cd.Range.Find.Execute FindText:="^m", ReplaceWith:=""
   fn = Replace(wd.FullName, ".doc", "_" & i & ".doc")
   cd.SaveAs2 fn
   i = i + 1
   Me!Список3.AddItem Item:=fn
   cd.Close
   wr.Collapse wdCollapseEnd
   Loop
SysCmd acSysCmdClearStatus
Set wd = Nothing
Set cd = Nothing
Set wr = Nothing
End Sub
 
Когда пытаюсь запустить в accdb в строке
Код

 Selection.Goto wdGoToPage, wdGoToAbsolute, i + 1

Ошибка - Объектная переменная или переменная блока With не установлена.
Не могу понять из-за чего.

Слышал краем глаза, что на этом форуме есть некий Центр Помощи. Если с подобными вопросами туда, скиньте ссылку, самостоятельно не нашёл

Это сообщение отредактировал(а) Akina - 14.8.2017, 15:21
PM MAIL   Вверх
Akina
Дата 14.8.2017, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20570
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 30
Всего: 453



Код - совершенно убийственный. Зачем Вы используете позднее связывание, если у Вас подключена объектная библиотека?

Суть наблюдаемой проблемы - в том, что не определено, что есть Selection. Замените его на объектную ссылку на обрабатываемый документ.

PS. И при публикации кода смотрите внимательнее, какой тип кода используете для обрамления тегом. Тег SQL-кода для VBA не очень подходит...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Ethex
Дата 14.8.2017, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 8.6.2017

Репутация: нет
Всего: нет



Цитата(Akina @  14.8.2017,  15:34 Найти цитируемый пост)
PS. И при публикации кода смотрите внимательнее, какой тип кода используете для обрамления тегом. Тег SQL-кода для VBA не очень подходит... 

Хорошо
Помогло
Код

wd.ActiveWindow.Selection.Goto wdGoToPage, wdGoToAbsolute, i + 1
wr.End = wd.ActiveWindow.Selection.Start          


Что же, помимо конкретно этой ошибки делает код совершенно убийственным? Если не секрет. Можно даже без перевода на чайниковский. Покумекаю на досуге, будет тяжко мне наверняка, но вдруг чего и выйдет.
И, всё же интересно, почему в поздней версии не сработало то, что сработало в ранней?...
PM MAIL   Вверх
Akina
Дата 15.8.2017, 07:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20570
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 30
Всего: 453



Цитата(Ethex @  14.8.2017,  18:40 Найти цитируемый пост)
Что же, помимо конкретно этой ошибки делает код совершенно убийственным? Если не секрет.

Я же вроде сказал... У Вас в коде есть
Код

Dim app As Word.Application
Dim wd As Word.Document
Dim cd As Word.Document
Dim wr As Word.Range

Значит, у Вас подключена в референсах Microsoft Word Object Library - иначе Вы бы получили ошибку вроде "неизвестный тип переменной".
Но если так - то гораздо разумнее вместо позднего связывания
Код

Set app = CreateObject("Word.Application")

использовать раннее
Код

Set app = New Word.Application

Дело в том, что при использовании раннего связывания в области данных программы формируются описанные в библиотеке структуры. Если окажется, что структуры в текущей версии библиотеки на рабочей станции иные - получите ошибку исполнения, причём крайне непросто диагностируемую, тогда как в показанном варианте сразу получите сообщение о том, что библиотека не найдена.

Если же Вы хотите, наоборот, получить по возможности универсальный (с точки зрения версии библиотеки) код, то референс следует убрать. А чтобы при этом на время написания программы не потерять удобство использования Intellisence - удалите референс непосредственно перед сборкой проекта, а определения конкретных типов измените на абстрактное As Object.

Это сообщение отредактировал(а) Akina - 15.8.2017, 08:06


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Ethex
Дата 15.8.2017, 08:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 8.6.2017

Репутация: нет
Всего: нет



Лазал со своими кодами на разные форумы, ни разу не указали. Впрочем, и не обязаны были...
Спасибо вам за терпение. Со связыванием посильно ознакомлюсь
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "MS Access"
Akina
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] и [code=sql][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MS Access | Следующая тема »


 




[ Время генерации скрипта: 0.1311 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.