Имя: Пароль:
1C
1С v8
Программирование Excel из 1С
0 mzelensky
 
20.12.13
10:45
Доброго всем!
Цель - программно (из под 1С) создать экселевский фалик с обработчиками тыкания по ячейкам и открыания соответствующих форм. Часть программного кода (формы, модули в Экселе) можно сделать стандартным и зашить в шаблон файла, но некоторые функции необходимо формировать программно из 1С-ки.

Вот пример функции, которую нужно создать в модуле листа Экселя:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  If Target.Count > 1 Then Exit Sub
    If Not Intersect(Target, Range("A4:A500")) Is Nothing Then
       DateForm.Show
    End If
    
    If Not Intersect(Target, Range("B4:B500")) Is Nothing Then
        ClientForm.Show 0
    End If
    
End Sub

Подскажите как это все намутить. Писать и запускать макросы умею, но тут немного другое.
1 mzelensky
 
20.12.13
10:45
Вот нашел небольшой пример, но он очень маленький и без особых комментариев и разборов:

http://help1c.com/faq/view/367.html
2 mzelensky
 
20.12.13
10:54
ап
3 mzelensky
 
20.12.13
11:06
Ну где же спецы по Экселю????
4 r2d24
 
20.12.13
11:11
(0) вчера тоже создал тему про Excel и не кто не смог помочь, наверное мало с ним работают?
5 mzelensky
 
20.12.13
11:12
(4) Да нифига не мало. Просто все в Пятнице сидят.
6 mzelensky
 
20.12.13
11:14
(4) Вот кстати ответ на твой вопрос:

//АВТОПОДГОН КОЛОНОК ПО ШИРИНЕ
Эксель.Sheets(1).Range(Эксель.Sheets(1).Cells(2, 2),Эксель.Sheets(1).Cells(8, СчКолонка)).Select();
Эксель.Selection.Columns.AutoFit();
7 mzelensky
 
20.12.13
11:16
(6) + а вот так просто можно ширину задать (в данном случае для всей колонки "А"):

Эксель.Sheets(1).Range("A:A").ColumnWidth=50;
8 Серго62
 
20.12.13
11:25
(0) А какова цель сего мероприятия, если не секрет?
9 mzelensky
 
20.12.13
11:32
(8) Тыкаешь по нужной ячейки экселя - открывается дополнительная формочка с данными (там можно поиск удобный делать) - выбираешь нужное тебе значение -> "ОК" и это значение переносится в нужную ячейку.

Косяк в том, что для разных колонок нужно обрабатывать разные предопределенные списки (разные столбцы). Т.е. динамически менять для каждого файла вот эти параметры:

Intersect(Target, Range("B4:B500"))
10 mzelensky
 
20.12.13
11:38
Ну что, опять ап
11 mzelensky
 
20.12.13
11:51
Если делаю вот так:

Excel.VBE.ActiveVBProject.VBComponents.Add (1);
    Excel.VBE.ActiveVBProject.VBComponents.Item(1).CodeModule.InsertLines (1,"Sub МояПроцедура() "+Символы.ПС+" End Sub");

То добавляется модуль "Эта книга" и туда пишется то .что мне надо. А мне надо записать в существующий модуль Листа (первого, напрмиер). Вот как туда попасть?
12 mzelensky
 
20.12.13
12:02
В общем великим методом ТЫКА я таки нашел, как попасть в нужный мне модуль!
13 Мыш
 
20.12.13
12:18
(12) Потомкам оставь знание. Можно прям на этом форуме в этой ветке выложить )
14 mzelensky
 
20.12.13
12:55
(13) В общем дотыкался до того, что через вот это свойство

Excel.VBE.ActiveVBProject.VBComponents.Item(1)

Можно получать объекты проекта (причем все вне зависимости от группировок). В итоге что мы имеем (на примере моего файла по порядку дерева объектов в VBА):

ЭтаКнига   - Item(1)
Лист1   -    Item(2)
Лист2   -    Item(3)
Лист3   -    Item(4)

Форма1   -    Item(5)
Форма2   -    Item(6)

Модуль1   -    Item(7)
Модуль2   -    Item(8)

Класс1   -    Item(9)
Класс2   -    Item(10)


Т.к. состав заранее известе, мне этого достаточно (+ можно проверять по свойству NAME). А далее вносим данные как и было показано выше:

Excel.VBE.ActiveVBProject.VBComponents.Item(1).CodeModule.InsertLines (1,"Sub МояПроцедура() "+Символы.ПС+" End Sub");

Таким образом можно программно набирать VBA код.
15 Мимохожий Однако
 
20.12.13
12:59
(14)Молодец. Но стесняюсь спросить: Где сиё чудо будет использоваться?
16 mzelensky
 
20.12.13
13:15
(15) я в 9 писал.

А вообще это шаблоны экселевские, которые выгружаются из 1С и отправляются клиентам для заполнения. Дабы повысить юзабилити припиливаю всевозможные формочки\выпадающие списки\подсказки.
Основная теорема систематики: Новые системы плодят новые проблемы.