Страницы: 1
RSS
Сообщение об ошибке при запуске макроса (Эксель 2007) из 1С
 
Добрый день. Опять к Вам на поклон.
Такое дело... Из 1С я открываю Эксель-файл (как положено). И в этом файле запускаю сперва один макрос, затем второй. И начиная с определенных строк макроса №2, в 1С появляется сообщение об ошибке. Если закомментировать эти строки, сообщения об ошибке НЕ возникает, но это строки нужные и в рабочем файле они должны быть раскомментированы.
Причем, когда я запускаю этот макрос НЕ из 1С, а как обычно, открыв этот файл в Экселе, то все нормально отрабатывается, как и задумано. Эксель при этом ни на что не жалуется. Да и когда 1С жалуется на ошибку, Эксель--ни в одном глазу. Вот.

Сообщение 1С об ошибке такое:
  {Форма.Форма.Форма(116)}: Ошибка при вызове метода контекста (Run): Произошла исключительная ситуация (0x800a9c68)

Добрые люди, помогите, пожалуйста.
PS. В коде вложенного файла я отметил начало проблемных строк.
Изменено: i77 - 27.05.2016 13:14:53
 
А так?
Я сам - дурнее всякого примера! ...
 
Скорее всего потеря связи 1с с excel.
Возможно книга сохраняется долго.
В винде сделано так,если сом объект не отвечает в течении минуты-получите ошибку.
Если результат приемлем, обработайте ошибку и все.
 
kuklp, Doober, спасибо, что отозвались.
Ре kuklp. Не помогает. Все по прежнему.
Ре Doober. Книга маленькая. Вся работа в ней, вместе с сохранением занимает около 2-3 секунд.

Может ещё есть варианты?
 
Для 1С вот эта запись: Sheets("Ф_Transit").[L10].Value = NewFileName ни о чем не говорит. С точки зрения 1С "[L10]" - это непонятное свойство/метод, а для экселя - неявный вызов команды Evaluate.
 
Ре Влад. Я, к сожалению, не понял смысла Ваших слов, потому что аматор.
Хорошо, а как помочь? Попробовал  такое--
Код
Sheets("Ф_Transit").Range("L10").Value = NewFileName

Та же ошибка.
 
Я закомментировал только эту строчку. Появилось такое сообщение, как во вложении.
Ни одна из причин, указанных в нем НЕ подходят.
Изменено: i77 - 27.05.2016 16:39:29
 
Как вариант: "xlExcel8" - это константа экселя, 1С про нее ничего не знает + попробуйте записать "Контрагент = Sheets("Ф_Transit").Range("B1").Value". И лучше использовать "ActiveWorkbook.Sheets" вместо "Sheets".
Изменено: Влад - 27.05.2016 16:47:27
 
Если закомментировать вот это, то сообщения об ошибке НЕ возникает.
Код
'    ActiveWorkbook.SaveAs Filename:=NewFileName _
'        , FileFormat:=xlExcel8, Password:="", WriteResPassword:="", _
'        ReadOnlyRecommended:=False, CreateBackup:=False
'    ActiveWorkbook.Close SaveChanges:=False 'закрытие сделанного Эксель-варианта Заказа.

(А "ActiveWorkbook.Sheets"--ничего не меняется.)
Как же иначе сохранить книгу?
 
Попробуйте просто
Код
ActiveWorkbook.SaveAs NewFileName
 
Всё та же ошибка.
 
Цитата
i77 написал: в 1С появляется сообщение об ошибке.
Пришло время узнать как происходит открытие файлов и запуск макросов.
Если кодом,то код в студию.
 
Код из 1С:
Код
Процедура КнопкаВыполнитьНажатие(Кнопка)    
   Книга = "";

   Если ЗначениеЗаполнено(Регистратор) И ЗначениеЗаполнено(Поставщик) Тогда      
            Запрос = Новый Запрос ("ВЫБРАТЬ
                                   |   ЗаказПоставщикуТовары.Номенклатура,
                                   |   ЗаказПоставщикуТовары.Количество,
                                   |   НоменклатураКонтрагентов.НомерСтрокиЭксельПрайса,
                                   |   ЗаказПоставщикуТовары.Номенклатура.Код
                                   |ИЗ
                                   |   Документ.ЗаказПоставщику.Товары КАК ЗаказПоставщикуТовары
                                   |      ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НоменклатураКонтрагентов КАК НоменклатураКонтрагентов
                                   |      ПО ЗаказПоставщикуТовары.Номенклатура = НоменклатураКонтрагентов.Номенклатура
                                   |         И ЗаказПоставщикуТовары.Ссылка.Контрагент = НоменклатураКонтрагентов.Контрагент
                                   |ГДЕ
                                   |   ЗаказПоставщикуТовары.Ссылка = &Ссылка");
      Запрос.УстановитьПараметр("Ссылка",Регистратор);
      ТЗ = Запрос.Выполнить().Выгрузить();
      Для каждого ТекСтрока Из ТЗ Цикл
         Текст = "";
         Если ТекСтрока.НомерСтрокиЭксельПрайса = 0 Тогда
            Текст = Текст + ТекСтрока.Номенклатура + "..." + ТекСтрока.Номенклатура.Код + Символы.ПС 
         КонецЕсли;    
      КонецЦикла;    
      Если Текст <> "" Тогда
         Сообщить ("Формирование Эксель-Формы ОТМЕНЕНО, т.к. среди товаров в документе есть товары, для которых НЕ заполнено поле" + Символы.ПС + "''Номер СТРОКИ Эксель-прайса'' (в регистре сведений ''Номенклатура контрагентов'')." + Символы.ПС + "Либо НЕ верно был выбран поставщик в этой форме." + Символы.ПС + "Проблемные товары:" + Символы.ПС + Текст);
      Возврат;
   КонецЕсли;
   
    //Если для всех позиций есть НомерСтрокиЭксельПрайса, то формируем Заказ. 
   Попытка
      Контрагент = Регистратор.Контрагент;
      Дистрибьютор = Регистратор.Организация;
      АдресДоставки = "Склады";
      ДатаЗаказа = Формат(ТекущаяДата(), "ДЛФ=Д"); // 01.01.2005
      ДатаДоставкиЖелаемая = ДатаЗаказа;
      КонтактноеЛицоДляПолучения = Регистратор.Ответственный;
      Телефон = "(066) 777-77-77";
      НомерДока = Регистратор.Номер;
      
      //Сообщить (Организация);
      Попытка
         Эксель = Новый COMОбъект("Excel.Application"); // для v7 код будет: Эксель = СоздатьОбъект("Excel.Application");
      Исключение
         Эксель.Quit(); //закрыли приложение.
         Сообщить(ОписаниеОшибки());
         Возврат;
      КонецПопытки;
              
      ВыбратьШаблонЗаказа(Книга,Эксель);
      Эксель.Run("Очистить");
      Лист = Книга.WorkSheets("Ф_Transit");
      //////////////Лист.Cells.ClearContents();//очищаем весь лист (содержимое).
      //ЭксельЗначение  = ЭксельОбъект.Clean(ЭксельЛист.Cells(2,2).Value); //очищаем ячейку (содержимое).
      Лист.Cells(1, 2).Value = Строка(Контрагент);
      Лист.Cells(2, 2).Value = Строка(Дистрибьютор); // Лист.Cells(НомерСтроки, НомерКолонки).Value = Значение;
      Лист.Cells(3, 2).Value = АдресДоставки;    
      Лист.Cells(4, 2).Value = Строка(ДатаЗаказа);    
      Лист.Cells(5, 2).Value = Строка(ДатаДоставкиЖелаемая); 
      Лист.Cells(6, 2).Value = Строка(КонтактноеЛицоДляПолучения); 
      Лист.Cells(7, 2).Value = Строка(Телефон);
      Лист.Cells(1, 3).Value = Строка(НомерДока);
      //Лист.Cells(8, 2).Value = Строка(Телефон);
      //Более 8-й строки нельзя (нет места). При необходимости писать в следующие колонки.
      
      i = 10; //заполняем, начиная с 10-й.
      Для Каждого Стр из ТЗ Цикл  
         Лист.Cells (i,2).Value = Строка(Стр.НомерСтрокиЭксельПрайса);
         Лист.Cells (i,3).Value = Число(Стр.Количество);
         i = i + 1;
      КонецЦикла;            

      Эксель.Visible = Истина;
      //'excel.run("testmacro.xls!SetColors",ActiveWorkbook,15,15395562);
      //Эксель.run("Вомонд_ШаблонЗаказаПоставщику_Форт.xlsb!Start",Книга,15,15395562);
      
      Эксель.Run("Start");// готовим файл-клон заказа. Если все Ок, то оба эксель-файла закрываем. 

      ФайлКлон = Книга.WorkSheets("Ф_Transit").Cells(10, 12).Value;
      Сообщить ("Эксель-вариант Заказа поставщику " + ФайлКлон + " создан.");      
      Эксель.Quit(); //закрыли приложение.
   Исключение
      Эксель.Quit(); //закрыли приложение.
      Сообщить(ОписаниеОшибки());
      Возврат;
   КонецПопытки;
Иначе
   Предупреждение("Заполните, пожалуйста, оба поля.");
   КонецЕсли
КонецПроцедуры
........
Код
Процедура ВыбратьШаблонЗаказа(Книга,Эксель)
Если Поставщик = "ВОМОНД" Тогда
Книга = Эксель.WorkBooks.Open("C:\1С_Форт_ШАБЛОНЫ_Экспорт\ШаблоныПоставщиков\Вомонд_ШаблонЗаказаПоставщику_Форт.xlsb"); //ПолноеИмяФайла.
//Возврат
КонецЕсли;
КонецПроцедуры   
Изменено: i77 - 27.05.2016 19:02:32
 
Цитата
Скорее всего потеря связи 1с с excel.
Немного ошибся, с книгой
Интересно девки пляшут ,  сделать книге харакири  и потом заставлять ее что-то делать
Скрытый текст


В 1С
Код
  Эксель = Новый COMОбъект("Excel.Application");
    Эксель.Visible = True;
//------------------------------
// много кода
//-------------------------------
    Эксель.Run ("Start");
    ФайлКлон = Книга.WorkSheets("Ф_Transit").Cells(10, 12).Value;
    Книга.Close (False);
Изменено: Doober - 27.05.2016 21:06:39
 
Doober, я рад помощи. Спасибо большое за внимание.
Пока не могу попробовать код с Вашими правками. Жду пока раздуплится сервер.
Можно попросить Вас прокомментировать кое-что?
1) Ошибка была в том, что раз основная книга открывалась в 1С-ке, то и закрываться она должна в ней, а не в Экселе? Так?
2) А где в синтакс-помощнике "живет" ".Close" для Книги? Я поискал в функциях для работы с файлами и не нашел...
3) Насколько принципиально использовать именно Ваш кусок? Будет ли он поддерживать сохранение файла в другом экселевском формате?
Код
Set wb = ActiveSheet.Parent
    wb.SaveAs Filename:=NewFileName _
            , FileFormat:=xlExcel8, Password:="", WriteResPassword:="", _
              ReadOnlyRecommended:=False, CreateBackup:=False
    wb.Close SaveChanges:=False    'закрытие сделанного Эксель-варианта Заказа.
 
1.ДА.
Я ваш код забросил в ворд и  понял в чем дело.
2.Не совсем понял вопрос.
3.Я убрал закрытие книги с самого макроса книги и перенес в 1С.
 
Попробовал. Работает!!!
Спасибо.
По поводу "2.Не совсем понял вопрос.". Ну, я не нашел в 1С-ке такого метода или свойства. Потому спрашиваю. Теперь подозреваю, что 1С-ка просто использует ".Close", которое является "собственностью" Экселя.
Страницы: 1
Читают тему
Наверх