Имя: Пароль:
1C
 
Из обработки 1С в Excel файл добавить макрос
0 NikVars
 
24.07.08
15:37
Из обработки 1С формирую excel-файл.
Возникла необходимость сформировать в 1С и вставить в этот excel-файл excelевский макрос. Есть у кого-нибудь примерчик как это сделать?
1 lea_220400
 
24.07.08
15:37
(0) а что за отчет?
2 korefana
 
24.07.08
15:37
мне вот тоже интересно :)
3 lea_220400
 
24.07.08
15:39
ну если из SQL тянешь, то сделай файлик и пропиши подключение к базе, а на SQL через манагера сделай Stored процедурку и припаяй её к XLS файлику, а там можешь с EXcel крутить как хотеть.
4 lea_220400
 
24.07.08
15:40
а прикручивать через 1С макрос как-то не айс
5 NikVars
 
24.07.08
15:44
Дир хочет чтобы его отчет был раскрашен так, как он уже привык. Из 1С такой отчет раскасить не удается. Обнаружил, что 1С вместо цвета RGB(255,153,0) (оранжевый) рисует цвет RGB(217,133,62)(коричневый). Для примера сформируй из 1С екселевкий файл и сохрани. Потом открой его в екселе, нажми на кнопку А (цвет текста) и сравни цвета с пустым екселевским файлом. Разницу увидишь.
Я в муках родил макрос на VBA, который меняет фу цвет дира, на нужный цвет дира. Теперь хочу впихнуть этот макрос автоматом в создаваемый мной екселевский файл. А знаний не хватает...
6 NikVars
 
24.07.08
15:46
УРА!!!!!!!!!!!! Прикрутил!!!!!!!!!!!!!!
7 lea_220400
 
24.07.08
15:47
(6) кажи код.
8 NikVars
 
24.07.08
15:49
Вот код!!!!!!!!!!!!!!!!!
Эксел= СоздатьОбъект("Excel.Application");
ФайлЭксел = Эксел.Workbooks.Open(ИмяНужногоФайла);
НашЛист = ФайлЭксел.Sheets(1);        
ФайлЭксел.VBProject.VBComponents.Import("c:\Макрос.txt");
Эксел.ActiveWorkBook.save();
Эксел.WorkBooks.close();
Эксел.Quit();    

В файле c:\Макрос.txt лежит макрос!!!

Задача решена, но неуклюже!!!!!

Хочется макрос хранить не в файле,  а посторочно его формировать из обработки 1С. Есть примеры этой хитровинки?
9 Яндекс
 
24.07.08
15:50
(5)странные вы сделали обнаружения... ей богу... уже сколько лет работаю с екселем и до сих пор этого не обнаружил
10 NikVars
 
24.07.08
15:59
Спасибо диру, умеет указывать на пробелы в знаниях. Не я первый это обнаружил. Где-то были на форме RGB 49 цветов, с которыми оперирует 1С 7.7. Ссылка затерялась. Я не поверил, но когда сам столкнулся, то визуально в этом убедился.
Привожу их (изивините, источник где-то на мисте!)
R;G;B
0;0;0
0;0;128
0;0;255
0;69;0
0;128;0
0;128;128
0;128;192
0;207;255
0;255;0
0;255;255
29;47;190
40;102;118
42;111;249
49;57;0
63;184;205
69;62;1
72;132;54
74;50;133
96;0;128
98;79;172
105;255;255
106;40;19
128;0;0
128;0;128
128;32;96
128;128;0
128;128;128
128;128;255
133;57;106
142;94;66
149;140;65
160;98;122
160;160;164
160;224;224
166;202;240
179;143;238
192;192;192
192;192;255
192;220;192
217;133;62
221;156;179
224;255;224
255;0;0
255;0;255
255;128;128
255;251;240
255;255;0
255;255;192
255;255;255
11 NikVars
 
24.07.08
16:30
В дополнение к (8).
После импорта макроса его можно запустить!
Эксел.Run("<НазваниеМакросаВФайлеc:\Макрос.txt>");

...и нет нужды лезть в екселевский файл для запуска макроса.
12 NikVars
 
24.07.08
17:21
Все задача решена!!!

И в подтверждение привожу код!!!

Эксел= СоздатьОбъект("Excel.Application");
ЭайлЭксел = Эксел.Workbooks.Open(ИмяНужногоФайла); //Открываем файл
НашЛист = ФайлЭксел.Sheets(1); //Устанавливаем нужный лист        
ФайлЭксел.VBProject.VBComponents.Add(1); // добавляем модуль номер 1
ФайлЭксел.VBProject.VBComponents("Module1").CodeModule.InsertLines(1, "Sub Раскраска()");
ФайлЭксел.VBProject.VBComponents("Module1").CodeModule.InsertLines(2, "KolSTR = Cells(1, 1).SpecialCells(11).Row");
ФайлЭксел.VBProject.VBComponents("Module1").CodeModule.InsertLines(3, "KolKol = Cells(1, 1).SpecialCells(11).Column");
ФайлЭксел.VBProject.VBComponents("Module1").CodeModule.InsertLines(4, "ActiveWorkbook.Colors(1) = RGB(255, 153, 0)");
ФайлЭксел.VBProject.VBComponents("Module1").CodeModule.InsertLines(5, "For NSTR = 1 To KolSTR");
ФайлЭксел.VBProject.VBComponents("Module1").CodeModule.InsertLines(6, "If Cells(NSTR, 1).Interior.Color = RGB(217, 133, 62) Then");
ФайлЭксел.VBProject.VBComponents("Module1").CodeModule.InsertLines(7, "For NKol = 1 To KolKol");
ФайлЭксел.VBProject.VBComponents("Module1").CodeModule.InsertLines(8, "Cells(NSTR, NKol).Interior.ColorIndex = 1");
ФайлЭксел.VBProject.VBComponents("Module1").CodeModule.InsertLines(9, "Next NKol");
ФайлЭксел.VBProject.VBComponents("Module1").CodeModule.InsertLines(10, "End If");
ФайлЭксел.VBProject.VBComponents("Module1").CodeModule.InsertLines(11, "Next NSTR");
ФайлЭксел.VBProject.VBComponents("Module1").CodeModule.InsertLines(12, "ActiveWorkbook.Save");
ФайлЭксел.VBProject.VBComponents("Module1").CodeModule.InsertLines(13, "End Sub");
Эксел.Run("Раскраска");
Эксел.ActiveWorkBook.save();
Эксел.WorkBooks.close();
Эксел.Quit();
13 b_ru
 
24.07.08
17:22
(8) Все правильно. Но по умолчанию в Экселе запрещен доступ к vbProject в целях безопасности (борьбы с макровирусами). Поэтому его надо разрешить, либо как-то по-другому выйти из положения

Хотя для данной задачи все это абсолютно не нужно :)
14 FN
 
24.07.08
17:28
(0) А не проще открыть файл и раскрасить его оле-методами Екселя?
15 NikVars
 
24.07.08
17:31
Раскарсить из 1С?
16 FN
 
24.07.08
17:32
(15) ага
17 NikVars
 
24.07.08
17:34
(16)Читай сначала!!! Чего будешь делать если тебе 1С вместо одно цвета будет другой пихать?!
18 NikVars
 
24.07.08
17:34
(16) А она пихает!!!!!!!!!!!!!!!!
19 FN
 
24.07.08
17:35
(18) хм... щас попробую
20 NikVars
 
24.07.08
17:39
Давай! Только не сильно удивляйся!
21 FN
 
24.07.08
17:44
(20) У меня все ОК.
что делал:
запустил Ексель, запустил макрос, покрасил три области.
посмотрел макрос - перевел в 1С, запустил, получил идентичную раскраску.

вот такой код:

Ексель.Range("E9:H15").Interior.ColorIndex = 50;
Ексель.Range("C18:E24").Interior.ColorIndex = 8;;
Ексель.Range("J15:L19").Interior.ColorIndex = 3;


что я сделал не так?
22 NikVars
 
24.07.08
17:51
В принципе, все так, только когда ты формируешь файл екселевский из 1С,у тебя ColorIndex-ы разные!!! В екселе одна пачка значений, сформированного из 1С - другая! См. (5). Соответственно ColorIndex одинаковые, а RGB - разные!
23 NikVars
 
24.07.08
17:55
Все, убегаю! Если будет решение попроще, то буду очень благодарен за идею и дважды благодарен за пример реализации!
24 smaharbA
 
24.07.08
17:55
Ужас !!!
25 FN
 
29.07.08
11:43
(23) случайно натолкнулся на решение проблемы из (22).
Делаем так:
Ексель.ActiveWorkbook.ResetColors();
а потом пользуемся стандартной палитрой кодом из (21)
26 smaharbA
 
29.07.08
12:35
А чем про цвета, атрибут формы неустраивает ?
Можно и екселевские методы применить...

Форма.ДляЦвета.Цвет(1,1,1);
Сообщить(Форма.ДляЦвета.Цвет());

И всеже, ужас !!!
27 FN
 
29.07.08
12:45
(26) smaharbA, по сравнению с тобой - я блуждающий в потемках ламер!
но иногда так хочеться дойти до чего-то самому...
28 smaharbA
 
29.07.08
12:48
(27) да про ужас - это про задачу вставки макроса, уж очень редки случаи, когда это надо...
29 NikVars
 
29.07.08
14:49
(25) Допустим, а как мне определить по RGB его Interior.ColorIndex в палитре?
30 FN
 
29.07.08
14:59
(29)
Если нужен RGB то прямо его и устанавливай (последняя строка):

Функция RGB(R,G,B)
   Возврат(B*65536+G*256+R);    
КонецФункции

Ексель.Range("E9:H15").Interior.ColorIndex = 50;
Ексель.Range("C18:E24").Interior.ColorIndex = 8;;
Ексель.Range("J15:L19").Interior.Color  = RGB(255,0,0);
31 NikVars
 
29.07.08
15:57
Отлично! Буду пробовать!