15.05.15 — 10:30
Столкнулся со следущим: При сохранении файла ексель в 1С вылетает ошибка:
Ошибка при вызове метода контекста (Save)
ТекущийДокЕксель.Save();
по причине:
Произошла исключительная ситуация (Microsoft Excel): Метод Save из класса Application завершен неверно
Порылся на форумах, внятного ответа как исправить не нашёл.
Делается следущее: есть файл екселя (.xls) с заданной структурой, в него вносятся данные, сохраняются, отсылаются на почты.
Может ли быть такая ошибка из-за того, что на сервере, где выполняется обработка стоит 2013 офис и файл открывается в режиме совместимости? Как это обходить?
1 — 15.05.15 — 10:59
Метод saveAs вообще не обнаружен.
2 — 15.05.15 — 11:01
может прав нет на место сохранения?
3 — 15.05.15 — 11:01
Никто не сталкивался?
4 — 15.05.15 — 11:02
Права есть. Если просто открыть екселем, изменить и сохранить как — все прокатывает, а через 1С сохранить не получается.
5 — 15.05.15 — 11:04
Создается файлик, но ячейки пустые. Формат вроде нужный — .xls
6 — 15.05.15 — 11:05
(4) если это делается на сервере, то права надо смотреть у пользователя под кем работает служба сервера приложений
7 — 15.05.15 — 11:13
Новая книга? Попобуй saveas()
8 — 15.05.15 — 11:13
(6) Попробую уточнить. По результатам отпишусь.
9 — 15.05.15 — 11:13
(7) При этом методе
Метод объекта не обнаружен (SaveAs) ТекущийДокЕксель.SaveAs(КаталогДанных + «» + ТекИмя);
10 — 15.05.15 — 11:14
Текущийдокэксель это книга или аппликейшн?
11 — 15.05.15 — 11:17
Ну кароч ты книгу должен сохранять. Покажи что присваиваешь текущийдокэксель
12 — 15.05.15 — 11:32
До меня делалось:
Код функции, которая возвращает ТекущийДок
Excel = 0;
Попытка
Excel = Новый COMОбъект(«Excel.Application»);
Исключение
Сообщить(«Не удалось инициализировать Excel»);
Возврат Неопределено;
КонецПопытки;
Попытка
тИмяСупера = СокрЛП(Супервайзер.Наименование);
тИмяСупера = СтрЗаменить(тИмяСупера, «#», «»);
чПоз = Найти(тИмяСупера, » «);
Если чПоз > 0 Тогда
тИмяСупера = СокрЛП(Лев(тИмяСупера, чПоз));
КонецЕсли;
тТекстАшан = «»;
чПозНайшлиАшан = Найти(Должность.Наименование, «АШАН»);
Если чПозНайшлиАшан > 0 Тогда
тТекстАшан = «_ashan»;
КонецЕсли;
ИмяФайлаКопия = тИмяСупера + «_» + СокрЛП(Должность.Должность) + тТекстАшан + «_» + СокрЛП(Должность.Код) + «_»+Месяц(ТекущаяДата());
ИмяФайлаКопия = СтрЗаменить(ИмяФайлаКопия,»00000″,»»);
ИмяТекужегоДокументаЕксель = СокрЛП(КаталогДанных) + «» + ИмяФайлаКопия + «.xls»;
Попытка
КопироватьФайл(ИмяФайла, ИмяТекужегоДокументаЕксель);
Excel.Workbooks.Open(ИмяТекужегоДокументаЕксель);
Исключение
Сообщить(«Некорректное имя файла при копировании (» + ИмяФайла + «) в (» + ИмяТекужегоДокументаЕксель + «)»);
Excel = 0;
КонецПопытки;
Исключение
Сообщить(ОписаниеОшибки());
Excel.Quit();
Excel = 0;
КонецПопытки;
Возврат Excel;
13 — 15.05.15 — 11:33
(12) в данном случае текущийдок это не книга
14 — 15.05.15 — 11:34
Текдок.activeworkbook
15 — 15.05.15 — 11:35
И да — в (12) копрокод
16 — 15.05.15 — 11:37
(15) Пробовал
ТекущийДокЕксель.Application.Workbooks.SaveAs(КаталогДанных + «» + ТекИмя);
ТекущийДокЕксель.Workbooks.SaveAs(КаталогДанных + «» + ТекИмя);
Также не видит функцию
17 — 15.05.15 — 11:43
(15)
{Форма.Форма.Форма(571)}: Ошибка при вызове метода контекста (SaveAs)
ТекущийДокЕксель.ActiveWorkbook.SaveAs(КаталогДанных + «» + ТекИмя);
по причине:
Произошла исключительная ситуация (Microsoft Excel): Метод SaveAs из класса Workbook завершен неверно
18 — 15.05.15 — 11:43
(16) workbooks это не workbook — другой объект
19 — 15.05.15 — 11:43
(16) смотри (12). то что у тебя все неправильное написание.
20 — 15.05.15 — 11:44
Ответ дан выше, перечитай (14)
21 — 15.05.15 — 11:46
(20) я в (17) показал какая ошибка выпадает при ТекущийДокЕксель.ActiveWorkbook
22 — 15.05.15 — 11:47
(19) где неправильно?
23 — 15.05.15 — 11:47
Сообщить(каталогданных+»»+текимя);
24 — 15.05.15 — 11:58
(23) Здесь все четко.
«F:Ведомостиимя.xls»
25 — 15.05.15 — 12:01
(24) Если файл существует попробуй опять save(). Для saveas можно вторым параметром задать формат файла еще
26 — 15.05.15 — 12:07
(25) Я ж говорю — ошибка есть, но файл пустой появляется..)
27 — 15.05.15 — 12:10
(25) Попробовал передать формат
{Форма.Форма.Форма(571)}: Ошибка при вызове метода контекста (SaveAs)
ТекущийДокЕксель.ActiveWorkbook.SaveAs(КаталогДанных + «» + ТекИмя, «.xls»);
по причине:
Произошла исключительная ситуация (Microsoft Excel): Метод SaveAs из класса Workbook завершен неверно
28 — 15.05.15 — 12:13
(27) не, формат это число. Передай туда 50
29 — 15.05.15 — 12:16
Существует ли на сервере f:ведомости?
30 — 15.05.15 — 12:17
(28) Создал. Ура! Осталось протестировать откроет ли 2003 офис
31 — 15.05.15 — 12:22
(30) Вбей в справке по vba xlFileFormat
32 — 15.05.15 — 12:56
(31) а в Save есть подобные параметры?
33 — 15.05.15 — 13:12
(32) нет, он вообще без параметров
34 — 15.05.15 — 13:20
(33) Тогда ладно. Файлики создаются.
Есть ещё вопрос.
Обработина, сделанная по образу и подобию
http://catalog.mista.ru/public/88055/
ругается на .Windows(1).Visible = 1;
35 — 15.05.15 — 13:28
(34) значит опять путанница с объектами
36 — 15.05.15 — 13:29
Код такой:
ТабДок = Новый табличныйДокумент;
АктивныйДокумент = ПолучитьМакет(«Макет»); //— Макет Active Document лист Ексель.
КомОбъект = АктивныйДокумент.Получить();
//— далее пишем в Cells(НомерСтроки, НомерСтолбца). Value все что нужно. см.пример ниже
//шапка
Лист=КомОбъект.Sheets(1);
Лист.Cells(9,4).Value=Идент;
Лист.Cells(10,4).Value=Док.Организация.ПолноеНаименование();
Лист.Cells(11,4).Value=НомерКонтракта;
Лист.Cells(12,4).Value= ?(ЗначениеЗаполнено(Дата), Формат(Дата, «ДФ=dd.MM.yyyy»), Формат(Док.Дата, «ДФ=dd.MM.yyyy»));
Лист.Cells(13,4).Value=НомРеестра;
СимволовДоНулей=Найти(ДокППИ.Номер,»0″);
НомППИ=Число(Прав(ДокППИ.Номер,СтрДлина(ДокППИ.Номер)-СимволовДоНулей-1));
Лист.Cells(14,4).Value=СокрЛП(Формат(НомППИ, «ЧГ=0»));
Лист.Cells(15,4).Value=Формат(ДокППИ.Дата, «ДФ=dd.MM.yyyy»);
//Зарплата к выплате организаций
РезультатЗапроса = Запрос.Выполнить();
Если НЕ(РезультатЗапроса.Пустой()) Тогда
//СтрокаОтчета = Лист.Range(«Строка»);
СтрокаОтчета = Лист.Range(«A20»);
Счетчик=0;
Итого=0;
Выборка=РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
Счетчик=Счетчик+1;
Если Счетчик>1 Тогда
СтрокаОтчета.EntireRow.Copy();
СтрокаОтчета.EntireRow.Insert();
КонецЕсли;
//ТекСтрока = СтрокаОтчета.Range(«A»+(СтрокаОтчета.Row-1));
//ТекСтрока.Cells(СтрокаОтчета.Row-1,1).Value=»Вася»;
//ТекСтрока.Find(«<ИмяСотрудника>»).Value = СокрЛП(Выборка.ФизЛицоПолностью);
Лист.Cells(19+Счетчик,1).Value=СокрЛП(Выборка.ФизЛицоПолностью);
Лист.Cells(19+Счетчик,4).Value=СокрЛП(Выборка.ЛицевойСчет);
Лист.Cells(19+Счетчик,6).Value=Число(СокрЛП(Выборка.Сумма));
Итого=Итого+Выборка.Сумма;
КонецЦикла;
КонецЕсли;
//итоговая строка
Лист.Cells(19+Счетчик+1,4).Value=СчетКонтракта;
Лист.Cells(19+Счетчик+1,6).Value=Итого;
Лист.Cells(19+Счетчик+20,1).Value=»»; //заплатка с целью увидеть макет целиком
КомОбъект.Application.Visible = 1;
КомОбъект.Windows(1).Visible = 1;
КомОбъект.Activate();
37 — 15.05.15 — 13:30
(35) выложил код. Запросы всякие вырезал.
38 — 15.05.15 — 13:32
Вся эта ботва вылезла когда поставили 2013 офис)
39 — 15.05.15 — 13:43
Отдельный момент.
Я может ошибаюсь: по коду если все удачно сохранилось, то объект excel не удаляется.
40 — 15.05.15 — 13:45
(39) не совсем понимаю к чему это..
41 — 15.05.15 — 13:48
Ошибка такая: Ошибка при вызове метода контекста (Windows)
КомОбъект.Windows(1).Visible = 1;
по причине:
Произошла исключительная ситуация (0x8002000b)
42 — 15.05.15 — 13:54
(40)Ну если я все правильно понимаю, то 10 раз запустите свой код, не выходя из 1с, и в процессах будет висеть 10 excel-ей.
43 — 15.05.15 — 14:01
(42) Это все проверяю
44 — 15.05.15 — 14:02
У меня просто открывается ексель как приложение, а окна документа не видно. Серый экран.
45 — 15.05.15 — 14:08
А со второго раза создает.
bard666
46 — 15.05.15 — 14:26
Придумал как поправить:
Вместо
КомОбъект.Application.Visible = 1;
КомОбъект.Windows(1).Visible = 1;
КомОбъект.Activate();
Делаю
КомОбъект.Activate();
КомОбъект.Windows(1).Visible = 1;
<?php // Полная загрузка сервисных книжек, создан 2023-01-05 12:44:55
global $wpdb2;
global $failure;
global $file_hist;
///// echo '<H2><b>Старт загрузки</b></H2><br>';
$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
///// echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}
$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
///// echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}
/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
///// echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
///// echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist); ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7]; ////получаем размер файла
$m_mtime_file=$masiv_data_file[9]; ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file
///// echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
///// echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
///// echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);
if ($results)
{ foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));
////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
///// echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
///// echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}
////загружаем данные
$table='vin_history'; // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация // (путь от корня web-сервера)
$delim=';'; // Разделитель полей в CSV файле
$enclosed='"'; // Кавычки для содержимого полей
$escaped='
Related Posts
Получение логина и пароля техподдержки 1С из базы
Класс для вывода отчета в Excel
Счет-фактура для УПП
Библиотека классов для создания внешней компоненты 1С на C#
Акт об оказании услуг (со скидками) — внешняя печатная форма для Управление торговлей 11.1.10.86
Прайс-лист с артикулом в отдельной колонке
47 Comments
-
Спасибо за статью, но ничего нового тут нет. Если Вы испытываете трудности с получением макета — храните вордовский шаблон файлом на диске (в общей шаре конечно) и все сведется к получению кома файла НаКлиенте. Возможно есть случаи, когда необходимо хранить шаблон вордовского файла в конфигурации, но на мой взгляд оперативно изменять текстовку шаблона (особенно если это договор и юристы никак не могут договориться о содержании шаблона :)) без влезания в конфигуратор проще и быстрее.
Reply ↓
-
P.S. кстати, обратите, какая изящная задача получилась для тестирования опытного кандидата на работу.
На собеседовании спрашивают то, что сами недано узнали (с)баш
А если по теме, с какой стати у клиента есть доступ к файловой системе сервера и наоборот (и расшаренные папки тоже неуниверсально)? Лучше через двоичные данные и ХранилищеЗначения передавать, см. работу с картинками, а на клиенте сохранять во временный файл.
А так полезная статья, узнал зачем нужен ActiveDocument 🙂
(1) andrei.k, согласен, пусть лучше юзеры свой шаблон правят, не программистское это дело.
Reply ↓
-
Друзья, я с Вами полностью согласен. Но файла в общей шаре может и не быть, а может у него имя изменили, а может шара недоступна, а может там что-то изменили без нашего ведома и заполнение параметров этого файла не получится сделать корректно.
Слишком уж тут много неявных причин.
По сути да — не очень понятно на кой черт такие танцы с бубном, ведь программная работа с ActiveDocument ничем не отличается от ДвоичныхДанных или ХранилищаЗначения. Принцип тот же.
Но все-таки, пусть будет — для галочки 😉
Reply ↓
-
Макет = ОбщийМодуль.ПолучитьМакет(Документ); //серверная функция, записывает макет в файл и возвращает полное имя файла
разъясните
если серверная функция записывает макет в файл, то где этот файл будет лежать?
если на сервере, то как к нему получает доступ клиент в этом коде?
Шаблон = ПолучитьCOMОбъект(Макет); //инициализируем COM-объект
если на клиенте, то как серверная функция получит доступ к файловой системе клиента?
и как она передаст на клиента этот самый файл?
в общем, нужно привести листинг этой серверной функции, а также параметры модуля «ОбщийМодуль»
Reply ↓
-
(4) YurySigolaev, у нас настроена общая шара, которая доступна для клиента и для сервера, по той простой причине, что все юзеры находятся в домене и не могут самостоятельно сохранять файл на локальную машину, с которой работают в данный момент (т.к. каждый раз они могут садиться за разные компьютеры)
В остальных случаях уже написали как это делать 🙂
Reply ↓
-
А можно для тупых полный листинг привести?))
Reply ↓
-
Повторюсь
А можно для тупых полный листинг привести?))
Reply ↓
-
(6) s_uu, (7) Dighty,
какой именно листинг нужно привести?
В статье ведь есть листинг
Reply ↓
-
Листинг &НаСервере если можно.
Reply ↓
-
Или помогите я разобраться не могу. Мне надо документ activedocument на тонкий клиент вывести, сижу 3 день мозг ломаю. Пожалуйста помогите.
Reply ↓
-
(10) Dighty, через двоичные данные. Читайте 2-й пост
Reply ↓
-
Каким методом вы записывали файл Word на сервере? У меня на файловой метод SaveAs(ПУТЬ) работает, а на сервере нет. Путь доступен соответственно и там и тут, только на сервере почему то метод SaveAs не обнаружен… Метод Save работает только для ранее сохраненных, а у меня файл вновь созданный.
/////Уточнение от 17.09.15
Метод SaveAs он не пишет, что не обнаружен, а пишет «Произошла исключительная ситуация (Microsoft Word): Ошибка команды»
Reply ↓
-
(12) klinval, a word на сервере установлен?
Reply ↓
-
(13) да, установлен. Спотыкается именно на SaveAs. Макет получается(ПолучитьМакет),
MSWord = Макет.Получить(); Документ = MSWord.Application.Documents(1); Документ.Activate();
проходят успешно. Заполнение тоже проходит, а на Документ.SaveAs(ИмяВрем); спотыкается.
Ощущение, что что-то не так с word-ом именно под пользователем под которым работает служба 1С, хотя я под ним заходил и офис нормально запускается!
Чтобы не дебажить весь код, например можно попробовать написать (см. обработка во вложении):
&НаКлиенте
Процедура СоздатьТестWord(Команда)
СоздатьТестWordНаСервере();
КонецПроцедуры
&НаСервере
Процедура СоздатьТестWordНаСервере()
Word = Новый COMОбъект(«Word.Application»);
Word.Visible=1;
Документ = Word.Documents.Add();
ИмяВрем = ПолучитьИмяВременногоФайла(«.docx»);
Документ.SaveAs(ИмяВрем);
Сообщить(ИмяВрем);
КонецПроцедуры
Показать
На файловой базе работает, на SQL не работает (спотыкается на SaveAs). Можете попробовать у себя? Если эта простенькая обработка у вас заработает, значит у нас что-то не так с word-ом на сервере под этим Windows-пользователем.
Я кстати задачу решил через двоичные данные, но всё равно интересно почему не работает SaveAs на сервере!
Reply ↓
-
(14) klinval, проверьте права доступа для пользователя, word и 1С на стороне сервера
Скорей всего проблема в этом. Можете попробовать залогиниться на сервак под юзером, под которым запускается 1С сервер и проверить, даёт ли там сохранить файл интерактивно
Reply ↓
-
(15) я уже ранее проводил такую проверку: залогинился под пользователем и сохранил word интерактивно. Клиентской 1С на сервере до этого вообще не стояло, я поставил. Запустился, а там ошибка(см. приложение). Возможно в этом и косяк.
У вас то обработка (во вложении к 14 сообщению) работает на SQL базе?
Reply ↓
-
(16) klinval, конкретно в данный момент, нет возможности проверить вашу обработку
Добавьте 1С в исключения в свойствах обозревателя IE
Reply ↓
-
(17) отключил усиленную безопасность IE, поставил на самый «небезопасный» уровень, ошибка, указанная в 16 сообщении ушла, но метод SaveAS всё равно не работает.
Так всё таки под кодом:
Макет = ОбщийМодуль.ПолучитьМакет(Документ); //серверная функция, записывает макет в файл и возвращает полное имя файла
Каким методом ты записываешь? Save, SaveAS?
Reply ↓
-
(18) klinval, посмотрите на дату публикации. Доступа к той обработке у меня давно нет, а в памяти я такое держать не могу 🙂
Что значит
метод SaveAS всё равно не работает.
?
Ошибка выпадает? Файл не сохраняет?
Reply ↓
-
(19)
Ошибка выпадает? Файл не сохраняет?
Да. Да:)
По-любому косяк где-то на уровне прав Windows-пользователя (т.е. связано с администрированием серверов, а не с 1С). Даже обработка с сообщения 14 не работает (хотя где там можно ошибиться?).
{Форма.Форма.Форма(13)}: Ошибка при вызове метода контекста (SaveAs)
Документ.SaveAs(ИмяВрем);
по причине:
Произошла исключительная ситуация (Microsoft Word): Ошибка команды
Поэтому мне проще было не разбираться, а запихнуть шаблон не в ActiveDocument, а в двоичные данные, которые я могу спокойно передать на клиент. Что я и сделал… А ошибка с SaveAs, скорее всего так и останется неразгаданной.
Reply ↓
-
(20) klinval, вам нужно запуститься непосредственно по тем пользователем, который указан для 1С на сервере и именно под ним попробовать сохранить MS Word интерактивно
Reply ↓
-
(21) уже пробовал. Сохраняет… как ни странно.
Reply ↓
-
(22) klinval, тогда нужно ловить ошибку, которую возвращает приложение
подключитесь к MS Word из 1С через COM на сервере и попытайтесь сохранить файл методом SaveAs
Reply ↓
-
(23) ну так это я и сделал! Ошибка уже давно выявлена и описание её ни о чём не говорит. Файл в 14 сообщении, ошибка от его исполнения в 20 сообщении.
{Форма.Форма.Форма(13)}: Ошибка при вызове метода контекста (SaveAs)
Документ.SaveAs(ИмяВрем);
по причине:
Произошла исключительная ситуация (Microsoft Word): Ошибка команды
Если дать заведомо рабочий путь вручную: та-же ошибка (не важно сетевой или на диск C:)
Если дать заведомо некорректный путь, то уже другая ошибки:
{Форма.Форма.Форма(16)}: Ошибка при вызове метода контекста (SaveAs)
Документ.SaveAs(«Ы:111.docx»);
по причине:
Произошла исключительная ситуация (Microsoft Word): Неверно указано имя файла.
Попробуйте выполнить следующие действия:
* Убедитесь, что путь введен правильно.
* Выберите нужный файл из списка файлов и папок.
Пробовал эксперементировать с расширением файла:
Для Инд = 0 По 100 Цикл
Попытка
Word = Новый COMОбъект(«Word.Application»);
Word.Visible=1;
Документ = Word.Documents.Add();
Документ.SaveAs(«C:111.docx»,Инд);
Сообщить(«ПОЛУЧИЛОСЬ:»+Инд);
Исключение
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = Строка(Инд)+»!»+ОписаниеОшибки();
Сообщение.Сообщить();
КонецПопытки;
КонецЦикла;
Показать
файл так и не создался.
Сверил все настройки Word локальные и на сервере (запустившись от имени пользователя под которым работает служба 1С). Процесс ворда запускается точно под тем пользователем под которым запускается служба (проверил в диспетчере задач)…
Reply ↓
-
(24) klinval, вам нужна ошибка именно MS Word
{Форма.Форма.Форма(13)}: Ошибка при вызове метода контекста (SaveAs)
Документ.SaveAs(ИмяВрем);
по причине:
Произошла исключительная ситуация (Microsoft Word): Ошибка команды
Это листинг ошибки 1С. Обработайте через 1С, сообщение об ошибке MS Word и выведите её содержимое
Reply ↓
-
(25)
Обработайте через 1С, сообщение об ошибке MS Word и выведите её содержимое
Не понял, как это сделать?
Reply ↓
-
(26) klinval, в смысле? руками)))
Reply ↓
-
(27) правильно я понял: ты хочешь увидеть ошибку как её видит Word, а не как её нам даёт 1С?
Если да, то опять вопрос: как из 1С это можно вывести?
Reply ↓
-
(28) klinval, читай про COM-объекты и инструментарий по MS Word
Reply ↓
-
(29) что искать/читать и где? Вы ответьте хотя бы на:
правильно я понял: ты хочешь увидеть ошибку как её видит Word, а не как её нам даёт 1С?
Reply ↓
-
(30) klinval, искатьчитать:
— работа с COM объектами в 1С
— интеграция MS Word и 1С
Вы ответьте хотя бы на:
1С вообще никакой ошибки не видит, она тупо посредник между пользователем и приложением (MS Word)
Reply ↓
-
(31) это реально можно вывести ошибку в 1С как её видит Word или ты чисто теоретически предполагаешь, что такой метод есть?
Может я тебя не правильно понял: по тексту мне показалось, что ты уверен, что такая возможность (такой метод) есть, а может ты имел ввиду, что чисто теоретически такая возможность должна быть.
Reply ↓
-
(32) Столкнулся с аналогичной проблемой — хотел узнать, удалось ли ее в итоге победить или забили?
Ошибка таже:
Ошибка при вызове метода контекста (SaveAs)
Reply ↓
-
(33) ivant, вроде как CeHbKA утверждал, что можно считать ошибку как то по-другому и увидеть причину косяков. Я сильно «копнул» в этом направлении, но ничего не нашёл. Похоже это совет из разряда гипотетических, что мол возможно считать ошибку Word как то по другому, но я не знаю как, но точно можно… Можете как советовал CeHbKA копнуть в эту сторону, может я что-то не увидел!
Хотя если честно ошибку я как-то исправил. Но вот не помню как, но явно не по этому совету. Моя обработка в (14) сообщении теперь у меня работает на серверной базе. Возможно ошибка просто ушла после обновления платформы.
Ещё есть вариант перейти с ActiveDocument на двоичные данные, как я в начале и сделал. Можете посмотреть тут код как это делается. Если вкратце:
//На клиенте получаем макет и заполняем его предварительно полученными данными
ДвоичныеДанныеМакета = ПолучитьИзВременногоХранилища(ПолучитьМакетСКлиента(«ПисьмоНаОплатуWord»));
ИмяВрем = ПолучитьИмяВременногоФайла(«.docx»);
ДвоичныеДанныеМакета.Записать(ИмяВрем);
Попытка
Документ = ПолучитьCOMОбъект(ИмяВрем);
Для Каждого Параметр из СтруктураПараметров.Значение Цикл
//В оригинале тут другой код, но для простаты пример:
Selection = Документ.Content;
Selection.Find.Execute(«[«+Параметр.Ключ+»]»,Ложь,Истина,Ложь,,,Истина,,Ложь,Параметр.Значение,2);
КонецЦикла;
Документ.Application.Visible = Истина;
Документ.Application.WindowState = 2;
Документ.Application.WindowState = 1;
Документ.Activate();
Исключение
…..
&НаСервереБезКонтекста
Функция ПолучитьМакетСКлиента(Имя)
Возврат ПоместитьВоВременноеХранилище(Документы.ПисьмоНаОплату.ПолучитьМакет(«ПисьмоНаОплатуWordДвоичныеДанные»));
КонецФункции
Показать
Reply ↓
-
(32) klinval, (33) ivant, (34) klinval,
вы получаете COM-объект MS Word
соответственно работаете с API данного com-объекта (т.е. Word)
функция SaveAS является функцией API Word
значит, чтобы получить ошибку Word нужно воспользоваться API этого самого Word
Reply ↓
-
-
Аналогичная ошибка, не может открыть документ сохраненный в темп
ДвоичныеДанные = ПолучитьДвоичныеДанныеМакета();
COMОбъект = Новый COMОбъект(«Word.Application»);
ИмяВременногоФайла = ПолучитьИмяВременногоФайла(«DOC»);
ДвоичныеДанные.Записать(ИмяВременногоФайла);
COMОбъект.Documents.Open(ИмяВременногоФайла);
// здесь вываливается ошибка, никаких документов он не открыл, в темпе лежит созданный документ ворда , COMОбъект.Documents.Count = 0, через ЖР проверял
Док = COMОбъект.Application.Documents(1);
Док.Activate();
Показать
Reply ↓
-
-
Почему при сохранении макета типа active document в файл word кодом:
Код:
ОбработкаОбъект = РеквизитФормыВЗначение(«Объект»);
Макет = ОбработкаОбъект.ПолучитьМакет(«ШаблонПисьмаПросрочка»);
ИмяФайла = КаталогВременныхФайлов() + «файл.doc»;
Макет.Записать(ИмяФайла);
Я получаю вместо нормального документа вот такой
Reply ↓
-
А почему нельзя использовать документ двоичные данные? Загрузил туда шаблон. Получили шаблон. Сохранили документ. Передали на клиент имя открыли через COM и заполняем.
&НаКлиенте
Процедура ПолучитьМакет(Команда)
Попытка
Индификатор = ПолучитьДанныеМакета();
МакетПисьма = ПолучитьИзВременногоХранилища(Индификатор);
ИмяФайла = «Письмо.doc»;
ИмяФайлаПолное = «С:» + ИмяФайла;
МакетПисьма.Записать(ИмяФайлаПолное);
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
Попытка
Шаблон = Новый COMОбъект(«Word.Application»);
Исключение
Сообщить(«Ошибка при попытке создать объект «»MS Word»»!» + Символы.ПС +
«Возможно приложение «»MS Word»» не установлено или установлено неправильно.», СтатусСообщения.Внимание);
КонецПопытки;
Шаблон.Documents.Open(ИмяФайлаПолное);
Попытка
Шаблон.Application.Documents(1).Content.Find.Execute(«{Сумма}»,,,,,,,,, ЭтаФорма.Сумма, 2);
Шаблон.Application.Documents(1).Content.Find.Execute(«{Контрагент}»,,,,,,,,, ЭтаФорма.Контрагент, 2);
//Перемещаемся до строки в таблице
Шаблон.Application.Selection.MoveDown(,8);
//Перемещаемся вниз, выделяем строку таблицы и копируем ее в буфер обмена
Шаблон.Application.Selection.SelectRow();
Шаблон.Application.Selection.Copy();
Для каждого Строка Из Этаформа.ТЗ Цикл
//Заменяем значения
Шаблон.Application.Selection.Find.Execute(«{НомерСчета}» ,,,,,,,,,Строка.НомерСчета, 2);
Шаблон.Application.Selection.Find.Execute(«{ДатаПоставки}» ,,,,,,,,,Строка.ДатаПоставки, 2);
//Последний параметр поиска пустой
Шаблон.Application.Selection.Find.Execute(«{КрайняяДата}» ,,,,,,,,,Строка.КрайняяДата, 2);
Шаблон.Application.Selection.Find.Execute(«{СтоимостьТоваров}» ,,,,,,,,,Строка.СтоимостьТоваров, 2);
//Перемещаемся вниз, вставляем из буфера обмена строку
Шаблон.Application.Selection.MoveDown();
Шаблон.Application.Selection.Paste();
//Перемещаемся вверх и выделяем строку для замены значений
Шаблон.Application.Selection.MoveUp();
Шаблон.Application.Selection.SelectRow();
КонецЦикла;
//Вырезаем лишнюю строку
Шаблон.Application.Selection.Cut();
Шаблон.Application.Visible = Истина;
Исключение
// Если произойдет ошибка выводятся данные об ошибке и объект закрывается.
Сообщить(«Ошибка: » + ОписаниеОшибки(), СтатусСообщения.Внимание);
Шаблон.Application.Quit(0);
КонецПопытки;
КонецПроцедуры
&НаСервере
Функция ПолучитьДанныеМакета()
АдресХранилища = Новый УникальныйИдентификатор();
ОбработкаОбъект = РеквизитФормыВЗначение(«Объект»);
Макет = ОбработкаОбъект.ПолучитьМакет(«ШаблонПисьмаПросрочка»);
Возврат ПоместитьВоВременноеХранилище(Макет, АдресХранилища);
КонецФункции
Показать
У меня этот код на серверной базе работает
Reply ↓
-
(42)
МакетПисьма = ПолучитьИзВременногоХранилища(Индификатор);
Здесь в тонком клиенте у Вас будет выскакивать ошибка. Такой способ только для толстого клиента подходит.
Reply ↓
-
(43) Выскажусь в защиту:
Глобальный контекст (Global context)
ПолучитьИзВременногоХранилища (GetFromTempStorage)
Синтаксис:
ПолучитьИзВременногоХранилища(<Адрес>)
Параметры:
<Адрес> (обязательный)
Тип: Строка.
Адрес, указывающий на значение во временном хранилище.
Возвращаемое значение:
Тип: Произвольный.
Значение, ранее помещенное с помощью метода ПоместитьВоВременноеХранилище.
Описание:
Получает значение из временного хранилища.
Доступность:
Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер).
Вызов метода выполняет обращение к серверу.
Примечание:
Результат выполнения не кэшируется, вызов сервера осуществляется при каждом вызове метода.
Показать
В справке написано, что тонкий клиент можно использовать! Я в своей статье данный метод тоже привожу в тонком клиенте, причём этот код уже давно работает на рабочей базе (в толстом клиенте у нас никто не работает).
Reply ↓
-
-
Решение проблемы «Ошибка при вызове метода контекста (SaveAs) «
Reply ↓
-
-
(17) Надо не 1с в исключения добавить, а всю строку about:…. только при добавлении снять галку с https…,а указанное в (18) делать нежелательно…тем более на сервере…
Reply ↓
-
(33) У меня такая проблема была. все было в правах на сервере…получалось при этом сохранять в шару..решил делать это не на рдп а на локальной машине…SQL тут не причем
Reply ↓
Leave a Comment
Ваш адрес email не будет опубликован. Обязательные поля помечены *
Я пытаюсь создать файл csv из файла Excel с помощью MS Excel Interop в моем приложении C # / Winforms.
Я получаю эту ошибку в методе SaveAs в приведенном ниже коде.
‘Невозможно получить доступ к файлу. Попробуйте одно из следующего:
• Убедитесь, что указанная папка существует. • Убедитесь, что папка, содержащая файл, не предназначена только для чтения. • Убедитесь, что имя файла не содержит следующих символов: <>? []: | или * • Убедитесь, что имя файла / пути не содержит более 218 символов. ‘z
Я попытался установить только для чтения значение false в методе Workbook Open (…) в соответствии с:
Проблема с сохранением файла Excel после вставки данных , но по-прежнему возникает та же ошибка.
В моем коде путь к файлу csv был: C: Если я изменю путь к файлу csv на C: SomeFolder или какой-либо общий путь UNC, я не получу эту ошибку.
Пожалуйста, посоветуйте. Может быть, есть проблемы с разрешениями на диске C?
Вот код:
xlApp = new Microsoft.Office.Interop.Excel.Application();
xlApp.DisplayAlerts = false;
xlApp.Visible = false;
wbkSrc = xlApp.Workbooks.Open(m_sSrcFil,
Type.Missing, false, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing);
wstSrc = (Worksheet)wbkSrc.Worksheets[sSrcSht];
//wstSrc.Activate();
rngWork = wstSrc.Cells.get_Range("H:H", System.Reflection.Missing.Value);
rngWork.NumberFormat = "General";
dteTmpDate = Convert.ToDateTime(m_sBusDate);
sTmpFileName = m_sSrcFil.Substring(0, m_sSrcFil.IndexOf(".")) + "_" +
m_sUserName + "_" + dteTmpDate.ToString("yyyy_MM_dd") + ".Csv";
wstSrc.SaveAs(sTmpFileName, XlFileFormat.xlCSV, Type.Missing,
Type.Missing, true, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing);
|
Heltarion 2 / 2 / 0 Регистрация: 21.11.2011 Сообщений: 57 |
||||
|
1 |
||||
|
02.12.2011, 11:18. Показов 8319. Ответов 11 Метки нет (Все метки)
Добрый день! ТПП — «табличное поле правил», в ней уже занесены некотрые значения из XML Код процедуры:
__________________
0 |
|
308 / 308 / 1 Регистрация: 16.01.2011 Сообщений: 1,073 |
|
|
02.12.2011, 11:32 |
2 |
|
СохранитьНажатие(Элемент) это событие формы
1 |
|
2 / 2 / 0 Регистрация: 21.11.2011 Сообщений: 57 |
|
|
02.12.2011, 11:56 [ТС] |
3 |
|
СохранитьНажатие(Элемент) это событие формы В МодулеОбъекта создал функцию «Процедура СохранитьВЭксель(ТПП) Экспорт»
0 |
|
308 / 308 / 1 Регистрация: 16.01.2011 Сообщений: 1,073 |
|
|
02.12.2011, 12:10 |
4 |
|
процедуру ИнициализацияЭкселя() тоже закинь в модуль объекта
1 |
|
2 / 2 / 0 Регистрация: 21.11.2011 Сообщений: 57 |
|
|
02.12.2011, 12:19 [ТС] |
5 |
|
Да я именно так и сделал, просто забыл упомянуть, ТПП нужна в противном случае он не понимает что это за переменная Добавлено через 4 минуты Так работает, но если я поставлю Дело в том что «стр.НоменклатураБазы» — это справочник ссылка, если у нее текстовый тип то программа глотает и записывает.
0 |
|
19 / 18 / 1 Регистрация: 15.11.2011 Сообщений: 54 |
|
|
02.12.2011, 12:22 |
6 |
|
чет вы мудрено делаете.
1 |
|
2 / 2 / 0 Регистрация: 21.11.2011 Сообщений: 57 |
|
|
02.12.2011, 12:28 [ТС] |
7 |
|
В данный момент ему не нравится присваемое значение к ячейке экселя (если я правильно понимаю сообщение «Ошибка при установке значения атрибута контекста (Value)» ) Причем если тип значения строка, то он его получает без вопросо, если тип значения СправочникССсылка, то он руегается на «Ошибка при установке значения атрибута контекста (Value)». Я просто не понимаю как обратиться к такому типу переменных чтобы получить значение типа строка.
0 |
|
19 / 18 / 1 Регистрация: 15.11.2011 Сообщений: 54 |
|
|
02.12.2011, 12:30 |
8 |
|
а принудительно все значения в текст перевести нельзя?
1 |
|
308 / 308 / 1 Регистрация: 16.01.2011 Сообщений: 1,073 |
|
|
02.12.2011, 12:30 |
9 |
|
стр.НоменклатураБазы.Наименование например
1 |
|
2 / 2 / 0 Регистрация: 21.11.2011 Сообщений: 57 |
|
|
02.12.2011, 12:32 [ТС] |
10 |
|
стр.НоменклатураБазы — это уже есть наименование интересующего меня поля (имя столбца), в некотрых случаях можно писать: стр.НоменклатураБазы.Значение, но это нетот случай Добавлено через 56 секунд
0 |
|
308 / 308 / 1 Регистрация: 16.01.2011 Сообщений: 1,073 |
|
|
02.12.2011, 12:34 |
11 |
|
значение из Excel?
1 |
|
Heltarion 2 / 2 / 0 Регистрация: 21.11.2011 Сообщений: 57 |
||||
|
02.12.2011, 12:43 [ТС] |
12 |
|||
|
Рабочий код:
0 |
Я пытаюсь сохранить книгу excel (с поддержкой макросов) в виде csv-файла через этот макрос, перезаписывая старый (ниже у меня было изменение имени папки и листа, но это, похоже, не проблема!):
Sub SaveWorksheetsAsCsv()
Dim SaveToDirectory As String
Dim CurrentWorkbook As String
Dim CurrentFormat As Long
CurrentWorkbook = ThisWorkbook.FullName
CurrentFormat = ThisWorkbook.FileFormat
SaveToDirectory = "MyFolder"
Application.DisplayAlerts = False
Application.AlertBeforeOverwriting = False
Sheets("My_Sheet").Copy
ActiveWorkbook.SaveAs Filename:=SaveToDirectory & "My_Sheet" & ".csv", FileFormat:=xlCSV
ActiveWorkbook.Close SaveChanges:=False
ThisWorkbook.Activate
ThisWorkbook.SaveAs Filename:=CurrentWorkbook, FileFormat:=CurrentFormat
Application.DisplayAlerts = True
Application.AlertBeforeOverwriting = True
End Sub
как ни странно, иногда, но не всегда, он терпит неудачу и сообщение об ошибке заголовка (ошибка выполнения 1004: метод saveas объекта _workbook не) выскакивает с отладчиком, указывающим мне на эту строку:
ActiveWorkbook.SaveAs Filename:=SaveToDirectory & "My_Sheet" & ".csv", FileFormat:=xlCSV
I погуглил его, и, по-видимому, это происходит много с людьми, и некоторые из решений, которые я пробовал, были:
- указание того, что каталог является строкой
- избегайте любого специального символа в имени файла или папки (см. здесь)
- копировать вставьте лист как значение перед сохранением его как .csv (см. здесь)
- указание FileFormat с помощью .номер кода csv (см. здесь)
- отключение/повторное включение некоторых предупреждений
- добавление других полей в ActiveWorkbook.Сохранить как строку, касающиеся паролей, создания резервных копий etcetc
тем не менее, он может работать правильно до 50-60 раз подряд, а затем в какой-то момент снова терпеть неудачу в строке.
любое предложение или вещи, которые я мог бы посмотреть, чтобы решить эту проблему (кроме остановки использования VBA / Excel для этой задачи, которая произойдет в ближайшее время, но я не могу для теперь.)
заранее спасибо за ваше время.
EDIT: решено благодаря предложению Degustaf. Я внес только два изменения в предложенный Degustaf код:
- ThisWorkbook.Листы вместо CurrentWorkbook.Листы
- FileFormat:=6 вместо FileFormat:=xlCSV (по-видимому, более надежный
для разных версий excel)
Sub SaveWorksheetsAsCsv() Dim SaveToDirectory As String Dim CurrentWorkbook As String Dim CurrentFormat As Long Dim TempWB As Workbook Set TempWB = Workbooks.Add CurrentWorkbook = ThisWorkbook.FullName CurrentFormat = ThisWorkbook.FileFormat SaveToDirectory = "MyFolder" Application.DisplayAlerts = False Application.AlertBeforeOverwriting = False ThisWorkbook.Sheets("My_Sheet").Copy Before:=TempWB.Sheets(1) ThisWorkbook.Sheets("My_Sheet").SaveAs Filename:=SaveToDirectory & "My_Sheet" & ".csv", FileFormat:=6 TempWB.Close SaveChanges:=False ThisWorkbook.SaveAs Filename:=CurrentWorkbook, FileFormat:=CurrentFormat ActiveWorkbook.Close SaveChanges:=False Application.DisplayAlerts = True Application.AlertBeforeOverwriting = True End Sub
3 ответов
Я вообще считаю что ActiveWorkbook проблема в этих случаях. Под этим я подразумеваю, что каким-то образом у вас нет этой книги (или любой другой), и Excel не знает, что делать. К сожалению, с copy ничего не возвращает (скопированный рабочий лист был бы хорошим), это стандартный способ подхода к этой проблеме.
Итак, мы можем подойти к этому, как мы можем скопировать этот лист в новую книгу, и получить ссылку на эту книгу. Что мы можем сделать, так это создать новая книга, а затем скопируйте лист:
Dim wkbk as Workbook
Set Wkbk = Workbooks.Add
CurrentWorkbook.Sheets("My_Sheet").Copy Before:=Wkbk.Sheets(1)
Wkbk.SaveAs Filename:=SaveToDirectory & "My_Sheet" & ".csv", FileFormat:=xlCSV
Wkbk.Close SaveChanges:=False
или есть еще лучший подход в такой ситуации: WorkSheet поддерживает SaveAs метод. Нет необходимости копировать.
CurrentWorkbook.Sheets("My_Sheet").SaveAs Filename:=SaveToDirectory & "My_Sheet" & ".csv", FileFormat:=xlCSV
я предупрежу вас, чтобы сохранить книгу в исходное имя afterwarsd, если она остается открытой, но у вас уже есть это в вашем коде.
Это год назад, но я добавлю кое-что для будущих читателей
вы не найдете много документации в справке Excel для ошибки времени выполнения 1004, поскольку Microsoft не считает ее ошибкой Excel.
ответы выше 100% действительны, но иногда это помогает узнать, что вызывает проблему, так что вы можете избежать его, исправить его раньше или исправить его более легко.
факт что это прерывистый недостаток, и он исправлен путем сохранять с полным путем и имя файла говорит мне, что ваш макрос может пытаться сохранить.xlsb-файл в каталог autorecover после автоматического восстановления файла.
кроме того, вы, возможно, отредактировали путь к файлу или имя файла самостоятельно.
вы можете проверить путь и имя файла с:-
Функцию MsgBox Файл Thisworkbook.Полное имя
вы должны увидеть что-то подобное в окне сообщения.
C:UsersMikeAppDataRoamingMicrosoftExcelDIARY (Версия 1).xlxb
Если таким образом, решение (как указано выше другими), чтобы сохранить ваш файл на правильный путь и имя файла. Это можно сделать с помощью VBA или вручную.
Теперь у меня есть привычка вручную сохранять файл с его правильным путем и именем файла как само собой разумеющееся после любого действия автосохранения, поскольку это занимает секунды, и я нахожу его быстрее (если это не ежедневное явление). Таким образом, макросы не столкнутся с этой ошибкой, которую вы запустите. Помните, что в то время как моя привычка вручную экономить.файлы xlxb для .файлы xlsm сразу после восстановления не помогут новичку, которому вы даете лист.
примечание по гиперссылкам
после этой ошибки: если у вас есть гиперссылки на листе, созданных с Ctrl+k по всей вероятности, у вас будет что-то вроде «AppDataRoamingMicrosoft», «AppDataRoaming», «../../ AppData / роуминг/ «или»….Мои документыМои документы » в нескольких гиперссылках после восстановления файла. Вы можете избежать их путем прикрепление гиперссылок к текстовому полю или их генерация с помощью функции гиперссылки.
идентификация и ремонт их немного сложнее
сначала проверьте гиперссылки и определите ошибочные строки и правильную строку для каждой ошибки. Со временем я нашел несколько.
Excel не предоставляет средства в меню «перейти к специальному» для поиска гиперссылок, созданных с помощью Ctrl+k.
вы можете автоматизировать идентификацию ошибочных гиперссылок в вспомогательном столбце, скажем, столбец Z и используя формулу
=OR(ISNUMBER(SEARCH("Roaming", Link2Text($C2),1)),ISNUMBER(SEARCH("Roaming", Link2Text($D2),1)))
где Link2Text является UDF
функция Link2Text (rng как диапазон) как строка
— Не отключайтесь.
«Находит гиперссылки, содержащие «роуминг» в столбце Z.
' Identify affected hyperlinks
If rng(1).Hyperlinks.Count Then
Link2Text = rng.Hyperlinks(1).Address
End If
End Function
мой VBA для исправления ошибок выглядит следующим образом
Sub Replace_roaming ()
‘ Выберите правильный лист
Листы («дневник»).Выберите
Dim hl As Hyperlink
For Each hl In ActiveSheet.Hyperlinks
hl.Address = Replace(hl.Address, "AppDataRoamingMicrosoft", "")
Next
For Each hl In ActiveSheet.Hyperlinks
hl.Address = Replace(hl.Address, "AppDataRoaming", "")
Next
For Each hl In ActiveSheet.Hyperlinks
hl.Address = Replace(hl.Address, "../../AppData/Roaming/", "....My documents")
Next
For Each hl In ActiveSheet.Hyperlinks
hl.Address = Replace(hl.Address, "....My documentsMy documents", "....My documents")
Next
Application.Run "Recalc_BT"
' Move down one active row to get off the heading
ActiveCell.Offset(1, 0).Select
' Check active row location
If ActiveCell.Row = 1 Then
ActiveCell.Offset(1, 0).Select
End If
' Recalc active row
ActiveCell.EntireRow.Calculate
' Notify
MsgBox "Replace roaming is now complete."
End Sub
Я также рекомендую вам привыкнуть делать регулярные резервные копии и не полагаться только на автосохранение. Если это не удастся, у вас ничего нет с момента последней полной резервной копии.
в то время как лист является хрупкой резервной копии часто, как каждый час или после любого значительного импорта новых данных.
следующие ярлыки будут резервное копирование рабочего листа в секундах:Ctrl+O, [выделите имя файла], Ctrl+C, Ctrl+V, [ X]. Регулярные резервные копии позволяют сразу перейти к последней резервной копии без необходимости восстановления из файла резервной копии прошлой ночи, особенно если вам нужно сделать запрос другого человека, чтобы сделать это.
попробуйте объединить путь и имя файла CSV в строковую переменную и отбросить.csv; который обрабатывается FileFormat. Путь должен быть абсолютным, начиная с буквы диска или имени сервера:
Dim strFullFileName as String
strFullFileName = "C:My FolderMy_Sheet"
Если на сервере, то это будет выглядеть примерно так:
strFullFileName = "ServerNameShareNameMy FolderMy_Sheet"
Substiture ServerName с именем вашего сервера и замените ShareName именем вашего сетевого ресурса, например data101AccountingMy FolderMy_Sheet
ActiveWorkbook.SaveAs Filename:=strFullFileName,FileFormat:=xlCSVMSDOS, CreateBackup:=False