Метод объекта не обнаружен saveas word
Я пытаюсь сохранить книгу excel (с поддержкой макросов) в виде csv-файла через этот макрос, перезаписывая старый (ниже у меня было изменение имени папки и листа, но это, похоже, не проблема!):
I погуглил его, и, по-видимому, это происходит много с людьми, и некоторые из решений, которые я пробовал, были:
- указание того, что каталог является строкой
- избегайте любого специального символа в имени файла или папки (см. здесь)
- копировать вставьте лист как значение перед сохранением его как .csv (см. здесь)
- указание FileFormat с помощью .номер кода csv (см. здесь)
- отключение/повторное включение некоторых предупреждений
- добавление других полей в ActiveWorkbook.Сохранить как строку, касающиеся паролей, создания резервных копий etcetc
тем не менее, он может работать правильно до 50-60 раз подряд, а затем в какой-то момент снова терпеть неудачу в строке.
любое предложение или вещи, которые я мог бы посмотреть, чтобы решить эту проблему (кроме остановки использования VBA / Excel для этой задачи, которая произойдет в ближайшее время, но я не могу для теперь.)
заранее спасибо за ваше время.
EDIT: решено благодаря предложению Degustaf. Я внес только два изменения в предложенный Degustaf код:
- ThisWorkbook.Листы вместо CurrentWorkbook.Листы
- FileFormat:=6 вместо FileFormat:=xlCSV (по-видимому, более надежный для разных версий excel)
Я вообще считаю что ActiveWorkbook проблема в этих случаях. Под этим я подразумеваю, что каким-то образом у вас нет этой книги (или любой другой), и Excel не знает, что делать. К сожалению, с copy ничего не возвращает (скопированный рабочий лист был бы хорошим), это стандартный способ подхода к этой проблеме.
Итак, мы можем подойти к этому, как мы можем скопировать этот лист в новую книгу, и получить ссылку на эту книгу. Что мы можем сделать, так это создать новая книга, а затем скопируйте лист:
или есть еще лучший подход в такой ситуации: WorkSheet поддерживает SaveAs метод. Нет необходимости копировать.
я предупрежу вас, чтобы сохранить книгу в исходное имя afterwarsd, если она остается открытой, но у вас уже есть это в вашем коде.
Это год назад, но я добавлю кое-что для будущих читателей
вы не найдете много документации в справке Excel для ошибки времени выполнения 1004, поскольку Microsoft не считает ее ошибкой Excel.
факт что это прерывистый недостаток, и он исправлен путем сохранять с полным путем и имя файла говорит мне, что ваш макрос может пытаться сохранить.xlsb-файл в каталог autorecover после автоматического восстановления файла.
кроме того, вы, возможно, отредактировали путь к файлу или имя файла самостоятельно.
вы можете проверить путь и имя файла с:- Функцию MsgBox Файл Thisworkbook.Полное имя
C:\Users\Mike\AppData\Roaming\Microsoft\Excel\DIARY (Версия 1).xlxb
Если таким образом, решение (как указано выше другими), чтобы сохранить ваш файл на правильный путь и имя файла. Это можно сделать с помощью VBA или вручную.
Теперь у меня есть привычка вручную сохранять файл с его правильным путем и именем файла как само собой разумеющееся после любого действия автосохранения, поскольку это занимает секунды, и я нахожу его быстрее (если это не ежедневное явление). Таким образом, макросы не столкнутся с этой ошибкой, которую вы запустите. Помните, что в то время как моя привычка вручную экономить.файлы xlxb для .файлы xlsm сразу после восстановления не помогут новичку, которому вы даете лист.
примечание по гиперссылкам
после этой ошибки: если у вас есть гиперссылки на листе, созданных с Ctrl + k по всей вероятности, у вас будет что-то вроде "AppData\Roaming\Microsoft\", "\AppData\Roaming\", "../../ AppData / роуминг/ "или". \Мои документы\Мои документы\ " в нескольких гиперссылках после восстановления файла. Вы можете избежать их путем прикрепление гиперссылок к текстовому полю или их генерация с помощью функции гиперссылки.
идентификация и ремонт их немного сложнее
сначала проверьте гиперссылки и определите ошибочные строки и правильную строку для каждой ошибки. Со временем я нашел несколько.
Excel не предоставляет средства в меню "перейти к специальному" для поиска гиперссылок, созданных с помощью Ctrl + k .
вы можете автоматизировать идентификацию ошибочных гиперссылок в вспомогательном столбце, скажем, столбец Z и используя формулу
где Link2Text является UDF
функция Link2Text (rng как диапазон) как строка - Не отключайтесь. "Находит гиперссылки, содержащие "роуминг" в столбце Z.
мой VBA для исправления ошибок выглядит следующим образом
' Выберите правильный лист Листы ("дневник").Выберите
Я также рекомендую вам привыкнуть делать регулярные резервные копии и не полагаться только на автосохранение. Если это не удастся, у вас ничего нет с момента последней полной резервной копии.
в то время как лист является хрупкой резервной копии часто, как каждый час или после любого значительного импорта новых данных.
следующие ярлыки будут резервное копирование рабочего листа в секундах: Ctrl + O , [выделите имя файла], Ctrl + C , Ctrl + V , [ X]. Регулярные резервные копии позволяют сразу перейти к последней резервной копии без необходимости восстановления из файла резервной копии прошлой ночи, особенно если вам нужно сделать запрос другого человека, чтобы сделать это.
попробуйте объединить путь и имя файла CSV в строковую переменную и отбросить.csv; который обрабатывается FileFormat. Путь должен быть абсолютным, начиная с буквы диска или имени сервера: Dim strFullFileName as String strFullFileName = "C:\My Folder\My_Sheet" Если на сервере, то это будет выглядеть примерно так: strFullFileName = "\ServerName\ShareName\My Folder\My_Sheet" Substiture ServerName с именем вашего сервера и замените ShareName именем вашего сетевого ресурса, например \data101\Accounting\My Folder\My_Sheet ActiveWorkbook.SaveAs Filename:=strFullFileName,FileFormat:=xlCSVMSDOS, CreateBackup:=False
Наверняка, многие, хотя бы раз в своей практике сталкивались (или еще столкнуться) с этим удивительным типом объекта метаданных Макет.
В данной статье, я постараюсь дать основные тезисы и методы работы с ActiveDocument, дабы Вы не наступали на эти банальные грабли и не колупали себе мозг, почему оно не работает :)
Спасибо за статью, но ничего нового тут нет. Если Вы испытываете трудности с получением макета - храните вордовский шаблон файлом на диске (в общей шаре конечно) и все сведется к получению кома файла НаКлиенте. Возможно есть случаи, когда необходимо хранить шаблон вордовского файла в конфигурации, но на мой взгляд оперативно изменять текстовку шаблона (особенно если это договор и юристы никак не могут договориться о содержании шаблона :)) без влезания в конфигуратор проще и быстрее.
P.S. кстати, обратите, какая изящная задача получилась для тестирования опытного кандидата на работу.
На собеседовании спрашивают то, что сами недано узнали (с)баш
А если по теме, с какой стати у клиента есть доступ к файловой системе сервера и наоборот (и расшаренные папки тоже неуниверсально)? Лучше через двоичные данные и ХранилищеЗначения передавать, см. работу с картинками, а на клиенте сохранять во временный файл.
А так полезная статья, узнал зачем нужен ActiveDocument :)
(1) andrei.k, согласен, пусть лучше юзеры свой шаблон правят, не программистское это дело.
Аналогичная ошибка, не может открыть документ сохраненный в темп
А почему нельзя использовать документ двоичные данные? Загрузил туда шаблон. Получили шаблон. Сохранили документ. Передали на клиент имя открыли через COM и заполняем.
У меня этот код на серверной базе работает
Здесь в тонком клиенте у Вас будет выскакивать ошибка. Такой способ только для толстого клиента подходит.
Глобальный контекст (Global context)
ПолучитьИзВременногоХранилища (GetFromTempStorage)
Синтаксис:
Тип: Строка.
Адрес, указывающий на значение во временном хранилище.
Возвращаемое значение:
Тип: Произвольный.
Значение, ранее помещенное с помощью метода ПоместитьВоВременноеХранилище.
Описание:
Получает значение из временного хранилища.
Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер).
Вызов метода выполняет обращение к серверу.
Результат выполнения не кэшируется, вызов сервера осуществляется при каждом вызове метода.
В справке написано, что тонкий клиент можно использовать! Я в своей статье данный метод тоже привожу в тонком клиенте, причём этот код уже давно работает на рабочей базе (в толстом клиенте у нас никто не работает).
Друзья, я с Вами полностью согласен. Но файла в общей шаре может и не быть, а может у него имя изменили, а может шара недоступна, а может там что-то изменили без нашего ведома и заполнение параметров этого файла не получится сделать корректно.
Слишком уж тут много неявных причин.
По сути да - не очень понятно на кой черт такие танцы с бубном, ведь программная работа с ActiveDocument ничем не отличается от ДвоичныхДанных или ХранилищаЗначения. Принцип тот же.
Но все-таки, пусть будет - для галочки ;)
если серверная функция записывает макет в файл, то где этот файл будет лежать?
если на сервере, то как к нему получает доступ клиент в этом коде?
если на клиенте, то как серверная функция получит доступ к файловой системе клиента?
и как она передаст на клиента этот самый файл?
в общем, нужно привести листинг этой серверной функции, а также параметры модуля "ОбщийМодуль"
(4) YurySigolaev, у нас настроена общая шара, которая доступна для клиента и для сервера, по той простой причине, что все юзеры находятся в домене и не могут самостоятельно сохранять файл на локальную машину, с которой работают в данный момент (т.к. каждый раз они могут садиться за разные компьютеры)
В остальных случаях уже написали как это делать :)
Или помогите я разобраться не могу. Мне надо документ activedocument на тонкий клиент вывести, сижу 3 день мозг ломаю. Пожалуйста помогите.
Каким методом вы записывали файл Word на сервере? У меня на файловой метод SaveAs(ПУТЬ) работает, а на сервере нет. Путь доступен соответственно и там и тут, только на сервере почему то метод SaveAs не обнаружен. Метод Save работает только для ранее сохраненных, а у меня файл вновь созданный.
/////Уточнение от 17.09.15
Метод SaveAs он не пишет, что не обнаружен, а пишет "Произошла исключительная ситуация (Microsoft Word): Ошибка команды"
проходят успешно. Заполнение тоже проходит, а на Документ.SaveAs(ИмяВрем); спотыкается.
Ощущение, что что-то не так с word-ом именно под пользователем под которым работает служба 1С, хотя я под ним заходил и офис нормально запускается!
Чтобы не дебажить весь код, например можно попробовать написать (см. обработка во вложении):
На файловой базе работает, на SQL не работает (спотыкается на SaveAs). Можете попробовать у себя? Если эта простенькая обработка у вас заработает, значит у нас что-то не так с word-ом на сервере под этим Windows-пользователем.
Я кстати задачу решил через двоичные данные, но всё равно интересно почему не работает SaveAs на сервере!
(14) klinval, проверьте права доступа для пользователя, word и 1С на стороне сервера
Скорей всего проблема в этом. Можете попробовать залогиниться на сервак под юзером, под которым запускается 1С сервер и проверить, даёт ли там сохранить файл интерактивно
(16) klinval, конкретно в данный момент, нет возможности проверить вашу обработку
Добавьте 1С в исключения в свойствах обозревателя IE
(18) klinval, посмотрите на дату публикации. Доступа к той обработке у меня давно нет, а в памяти я такое держать не могу :)
Ошибка выпадает? Файл не сохраняет?
: Ошибка при вызове метода контекста (SaveAs)
Документ.SaveAs(ИмяВрем);
по причине:
Произошла исключительная ситуация (Microsoft Word): Ошибка командыФорма.Форма.Форма(13)>
Поэтому мне проще было не разбираться, а запихнуть шаблон не в ActiveDocument, а в двоичные данные, которые я могу спокойно передать на клиент. Что я и сделал. А ошибка с SaveAs, скорее всего так и останется неразгаданной.
(20) klinval, вам нужно запуститься непосредственно по тем пользователем, который указан для 1С на сервере и именно под ним попробовать сохранить MS Word интерактивно
(22) klinval, тогда нужно ловить ошибку, которую возвращает приложение
подключитесь к MS Word из 1С через COM на сервере и попытайтесь сохранить файл методом SaveAs
: Ошибка при вызове метода контекста (SaveAs)
Документ.SaveAs(ИмяВрем);
по причине:
Произошла исключительная ситуация (Microsoft Word): Ошибка командыФорма.Форма.Форма(13)>
Если дать заведомо рабочий путь вручную: та-же ошибка (не важно сетевой или на диск C:)
Если дать заведомо некорректный путь, то уже другая ошибки:
: Ошибка при вызове метода контекста (SaveAs)
Документ.SaveAs("Ы:\111.docx");
по причине:
Произошла исключительная ситуация (Microsoft Word): Неверно указано имя файла.
Попробуйте выполнить следующие действия:
* Убедитесь, что путь введен правильно.
* Выберите нужный файл из списка файлов и папок.Форма.Форма.Форма(16)>
файл так и не создался.
Сверил все настройки Word локальные и на сервере (запустившись от имени пользователя под которым работает служба 1С). Процесс ворда запускается точно под тем пользователем под которым запускается служба (проверил в диспетчере задач).
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Сохраняет указанный документ с новым именем или форматом. Некоторые аргументы этого метода соответствуют параметрам в диалоговом окне "Сохранить как" (меню "файл").
Параметры
Необязательный объект. Имя документа. Значение по умолчанию — текущая папка и имя файла. Если документ никогда не сохранялся, используется имя по умолчанию (например, Doc1. doc). Если документ с указанным именем уже существует, документ перезаписывается без запроса пользователя.
Необязательный объект. Формат, в котором сохранен документ. Может быть любой WdSaveFormat константой. Чтобы сохранить документ в другом формате, укажите соответствующее значение для SaveFormat свойства FileConverter объекта.
Необязательный объект. Значение true , чтобы заблокировать документ для примечаний. Значение по умолчанию - false.
Необязательный объект. Строка пароля для открытия документа. (См. примечания ниже).
Необязательный объект. Значение true , чтобы добавить документ в список недавно использовавшихся файлов в меню файл. По умолчанию используется значение True.
Необязательный объект. Строка пароля для сохранения изменений в документе. (См. примечания ниже).
Необязательный объект. Значение true , чтобы при открытии документа в Microsoft Word предлагалось состояние "только чтение". Значение по умолчанию - false.
Необязательный объект. Значение true для сохранения шрифтов TrueType вместе с документом. Если этот параметр опущен, EmbedTrueTypeFonts аргумент принимает значение EmbedTrueTypeFonts Свойства.
Необязательный объект. Если графика была импортирована с другой платформы (например, Macintosh), значение true , чтобы сохранить только версию Windows импортированной графики.
Необязательный объект. Значение true , чтобы сохранить данные, введенные пользователем в форме, в виде записи данных.
Необязательный объект. Если в документе есть вложенная почта, значение true , чтобы сохранить документ как аоце букву (средство рассылки сохраняется).
Необязательный параметр MsoEncoding . Кодовая страница или набор знаков, которые необходимо использовать для документов, сохраненных в виде кодированных текстовых файлов. По умолчанию используется системная кодовая страница.
Необязательный объект. Если документ сохраняется в виде текстового файла, значение true используется для вставки разрывов строк в конце каждой строки текста.
Необязательный объект. Если документ сохраняется в виде текстового файла, значение true позволяет Word заменять некоторые символы похожим на похожий текст. Например, отображение знака авторского права как (c). Значение по умолчанию - false.
Необязательный объект. Способ, с помощью которого Word помечает разрывы строк и абзацев в документах, сохраненных в виде текстовых файлов. Может быть любой WdLineEndingType константой.
Необязательный объект. Значение true добавляет управляющие символы в выходной файл для сохранения макета текста в исходном документе с двунаправленным письмом.
Комментарии
Избегайте использования в приложениях жестко заданных паролей. Если в процедуре требуется пароль, запросите пароль у пользователя, сохраните его в переменной, а затем используйте эту переменную в коде.
Это моя первая статья на данном портале, но попытаюсь изложить все понятно и подробно.
Долгое время у меня заняло создание такой вот внешней обработки. Есть очень много примеров, как сделать подобное на неуправляемых формах (2.0) и очень мало информации касательно управляемых(3.0), по крайней мере я многого найти не смог в доступе. Создание подобное обработки выглядит вполне несложно, если производить все действия на сервере, как это было с 2.0, но в нашем случае необходимо инициализировать открытие документа на клиенте, чему сильно мешает отсутствие возможности передать макет Active Document с сервера на клиент.
Итак, пойдем по порядку. Подобная информация уже есть в сети, но для полноты картины кратко разъясню регистрацию обработки в системе:
1. Открываем модуль объекта обработки и создаем там Функцию СведенияОВнешнейОбработке() (естественно экспортную):
Как мы видим, использовать будем ВызовКлиентскогоМетода, по скольку открыть файл нужно будет на компьютере пользователя.
Далее понадобится создать еще две процедуры здесь же:
2. Функция добавления команды, которую мы вызываем ранее(просто, чтобы все было визуально разделено и не награмождалось скопом в одной функции):
ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "")
3. И функция по созданию этой самой таблицы команд:
(Из комментариев можно подробней понять, для чего используется тот или иной параметр-поле данной таблицы)
На этом настройка регистрации внешней обработки в нужной вам конфигурации закончена.
Далее. Самое интересное: создание, заполнение и вывод макета клиенту.
Первое, что нам необходимо сделать, это создать макет нашего документа(Изображение 3). Макет понадобится двоичный, т.к. обычный мы на клиент не передадим(как я и говорил ранее). Заменяем нужные данные в шаблоне, перед загрузкой в обработку, "Параметрами", у меня они выглядят так, на примере: ""(кавычки не учитывать), после чего загружаем в Обработку-Макет.
Теперь в модуле формы создаем процедуру, которая будет вызвана при обращении к печати именно в таком виде(за исключением содержимого, заполнять можете как вам угодно), процедура так же должна быть экспортной и на клиенте, так как вызывается из конфигурации и выполнение назначено на клиентской стороне:
Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.
В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "///// echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1.
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.
Собственно сам скрипт:
если серверная функция записывает макет в файл, то где этот файл будет лежать?
если на сервере, то как к нему получает доступ клиент в этом коде?
если на клиенте, то как серверная функция получит доступ к файловой системе клиента?
и как она передаст на клиента этот самый файл?
в общем, нужно привести листинг этой серверной функции, а также параметры модуля «ОбщийМодуль»
(4) YurySigolaev, у нас настроена общая шара, которая доступна для клиента и для сервера, по той простой причине, что все юзеры находятся в домене и не могут самостоятельно сохранять файл на локальную машину, с которой работают в данный момент (т.к. каждый раз они могут садиться за разные компьютеры)
Читайте также: