![]() |
![]() |
![]() |
|
Из обработки 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
|
Отлично! Буду пробовать!
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |