Имя: Пароль:
1C
 
Как правильно из 1С запустить код в VBA Excel?
0 VadimSh
 
01.07.05
13:21
Как правильно из 1С запустить код в VBA Excel?

В VBA Excel  это меняет палитру стандартного цвета номер 15
ActiveWorkbook.Colors(15) = RGB(234, 234, 234)


Но как правильно это запустить из 1С v7.7?
Вот такой код вызывает ошибку

Excel = СоздатьОбъект("Excel.Application");
Excel.Workbooks.Add();
Excel.ActiveWorkbook.Colors(15) = Excel.RGB(234, 234, 234);


Err:
Excel.ActiveWorkbook.Colors(15) <<?>>= Excel.RGB(234, 234, 234);
{Отчет.Прайс.Форма.Модуль(272)}: Неопознанный оператор
При проверке модуля обнаружены синтаксические ошибки!
1 OFF
 
01.07.05
13:27
Вот облегчение жизни по перекладке макроса экселя на 1с
http://www.snif.ru/pages/vba.htm
2 OFF
 
01.07.05
13:29
в твоем разе должно быть
Excel.ActiveWorkbook.Colors(15) = RGB(234, 234, 234);
3 Asmody
 
01.07.05
13:46
Run Method

Runs a macro or calls a function. This can be used to run a macro written in Visual Basic or the Microsoft Excel macro language, or to run a function in a DLL or XLL.

expression.Run(Macro, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8, Arg9, Arg10, Arg11, Arg12, Arg13, Arg14, Arg15, Arg16, Arg17, Arg18, Arg19, Arg20, Arg21, Arg22, Arg23, Arg24, Arg25, Arg26, Arg27, Arg28, Arg29, Arg30)
expression    Required. An expression that returns an Application object.

Macro   Optional Variant. The macro to run. This can be either a string with the macro name, a Range object indicating where the function is, or a register ID for a registered DLL (XLL) function. If a string is used, the string will be evaluated in the context of the active sheet.

Arg1-Arg30   Optional Variant. The arguments that should be passed to the function.
4 VadimSh
 
01.07.05
13:48
не так тоже не заработает, а еще одну ошибку напишет
RGB(234, 234, 234) - это экселевская функция, 1с не знает что это, без ссылки на эксель 1с вдвойне ругаться будет. Но эта правая часть даже не важно она заменяется эквивалентным числом ( в данном случае 15395562), которое возвращает эта функция и нет вопросов.

1с ругается на скобки в конце .Colors(15) ,но это надо передать экселю номер цвета, чтобы он знал для которого палитру менять.
Без скобок для 1с типа вроде без ошибок выглядит, но уже для экселя - это уже ошибка
5 VadimSh
 
01.07.05
14:08
А через этот метод такую конструкцию 1с пропускает, но Эксель в таком вот варианте не собирается это число-аргумент присваивать свойству .Colors(15)
Excel.Run(Excel.ActiveWorkbook.Colors(15), 15790320);
6 Asmody
 
01.07.05
14:13
собственно вызов макроса на Excel:
в 1С:
Процедура Сформировать()
   excel=CreateObject("Excel.Application");
   excel.Workbooks.Open("D:\My\testmacro.xls");
   for i=1 to 10 do
       for j=1 to 10 do
           excel.ActiveWorkbook.sheets(1).cells(i,j).value=excel.run("testmacro.xls!F_Sum",i,j);
       enddo;
   enddo;
   excel.visible=-1;
КонецПроцедуры


в Excel: в файл testmacro.xls добавлен модуль и в нем

Function F_Sum(a1, a2)
   F_Sum = a1 + a2
End Function


все работает
7 Asmody
 
01.07.05
14:21
a в воем случае вообще можно написать прямо в 1С:
Функция RGB(r,g,b) Экспорт
 Возврат g * 256 + r + b * 256 * 256;
КонецФункции

...

ActiveWorkbook.Colors(15) = RGB(234, 234, 234)

эффект будет тот же
8 VadimSh
 
01.07.05
14:33
Вот функция RGB(r,g,b) как раз прекрасно работает, про неё можно забыть,
ActiveWorkbook.Colors(15) = RGB(234, 234, 234) эквивалентно записи
ActiveWorkbook.Colors(15) = 15395562

но 1с ругается на конструкцию Excel.ActiveWorkbook.Colors(15) <<?>>
а если запускать через метод run, то у вас в testmacro.xls была функция F_Sum(a1, a2) принимающая аргументы при запуске и метод их успешно передавал.

А присвоить свойству какое-то число т.е.  .Colors(15) = 15395562 не работает как такая функция с двумя аргументами .Colors(15, 15395562)
9 Asmody
 
01.07.05
14:46
в Excel напиши такой макрос:

Sub SetColors(WB, ColIndex, value)
   WB.Colors(ColIndex) = value
End Sub

вызывай из 1С так:
excel.run("testmacro.xls!SetColors",ActiveWorkbook,15,15395562);
10 VadimSh
 
01.07.05
15:16
Согласен, такой вариант должен работать, но тут файл экселевский создается с нуля через 1с. Как из 1с втолкнуть в него макрос, а затем перед записью удалить не представляю. Это если использовать файл шаблон, заранее загнать в него нужный код и 1с-кой работать уже с ним то да. Но не хотелось бы привязываться к отдельно заготовленному файлу.
11 Asmody
 
01.07.05
15:47
держи:

   excel.Workbooks.Add();
   wb=excel.ActiveWorkbook;
   vbc=excel.vbe.ActiveVBProject.VBComponents;
   last=vbc.Count();
   vbc.Add(1);
   module=vbc.Item(last + 1).CodeModule;
   module.InsertLines(1, "Sub SetColors(WB,ColIndex,Value)");
   module.InsertLines(2, "WB.Colors(ColIndex)=Value");
   module.InsertLines(3, "End Sub");
   
   Message(""+wb.Colors(15));
   excel.run("SetColors",wb,15,15395562);
   Message(""+wb.Colors(15));
   
   vbc.Remove(vbc.Item(last+1));
   excel.visible=-1;
12 VadimSh
 
01.07.05
17:22
Ничего себе, это круто
Все получилось, спасибо, вопрос ичерпан, тема закрыта
И я думал, что я что-то знаю в VBA...
13 ШтушаКутуша
 
01.07.05
20:21
то Asmody: примите мои поздравления! все дюже гарно!
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.