VBA. Редактирование аттрибутов блока.
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > VBA. Редактирование аттрибутов блока.

VBA. Редактирование аттрибутов блока.

Ответ
Поиск в этой теме
Непрочитано 23.09.2009, 16:35 #1
VBA. Редактирование аттрибутов блока.
Bart
 
Регистрация: 23.07.2009
Сообщений: 35

Пишу программу на VBA. Задача поставлена такая: задавать данные и должен формироваться шкаф (система управления) и куча чертежей к нему на основе входящих данных. Хотят, чтобы нажал кнопку и все само нарисовалось.
В VBA я не силен. Написал одну програмку лет 5 назад.

Начал я с эл. схемы. Задаю количество источников питания, нажимаю OK и вставляется определенное количество блоков. Там обозначения, нумерация, маркировка проводов. Все сделано аттрибутами. Как мне эти аттрибуты изменять при вставке автоматом? Там к значению просто +1 прибавляется у 5 аттрибутов. Как до аттрибутов добраться?
Просмотров: 8794
 
Непрочитано 23.09.2009, 16:42
#2
AlexV

Инженер
 
Регистрация: 02.10.2008
С-Пб
Сообщений: 3,692


Чего-то типа:
Код:
[Выделить все]
dim ....
....
Set insertedBlock = ThisDrawing.ModelSpace.InsertBlock(InsertPnt, name_Blck, Scale_Blck, Scale_Blck, Scale_Blck, Rotate_Blck)
Attr1 = insertedBlock.GetAttributes
      For Each Attr In Attr1
           If Attr.TagString = "имя атрибута" Then
              Attr.Textring="Значение атрибута"
           End If
      Next
    End If
  End If
insertedBlock - вставленный экземпляр блока, проходим в цикле по всем атрибутам, находим нужный по имени, задаем ему нужное значение...
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Непрочитано 23.09.2009, 16:44
#3
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,409


Если ent - указатель на вхождение блока, то у него есть метод GetAttributes. Ну, а дальше - уже сам
---
Опоздал
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 23.09.2009, 16:49
#4
Bart


 
Регистрация: 23.07.2009
Сообщений: 35


Ага. Спасибо. Как раз то, что нужно. Буду пробовать.

Может подскажете какую справочную литературку или сайт с примерами?
Bart вне форума  
 
Непрочитано 23.09.2009, 16:52
#5
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,409


А что, обычной справки мало?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 23.09.2009, 16:54
#6
AlexV

Инженер
 
Регистрация: 02.10.2008
С-Пб
Сообщений: 3,692


Цитата:
Сообщение от Bart Посмотреть сообщение
Может подскажете какую справочную литературку или сайт с примерами?
:
http://www.cad.dp.ua/stats/a_vba/
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Автор темы   Непрочитано 23.09.2009, 17:13
#7
Bart


 
Регистрация: 23.07.2009
Сообщений: 35


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
А что, обычной справки мало?
В справке не понятно куда смотреть и что искать. По данному вопросу я поискал-поискал в справке и ничего не нашел.
Bart вне форума  
 
Непрочитано 23.09.2009, 17:23
#8
AlexV

Инженер
 
Регистрация: 02.10.2008
С-Пб
Сообщений: 3,692


Цитата:
Сообщение от Bart Посмотреть сообщение
В справке не понятно куда смотреть и что искать. По данному вопросу я поискал-поискал в справке и ничего не нашел.
Плохо искали.. При работе с примитивами автокада лучший способ - открыть объектную модель, щелкнуть по нужному типу примитива, и увидишь все его методы/свойства. Опять-таки щелкаешь по методу - видишь его описание; можно открыть пример кода (при наличии, чаще всего - он есть). Кстати, вот ресурс - попытка перевода справки по VBA на русский (коряво, "машинно", но все-таки...): http://vbamodel.narod.ru/AutoCAD/idx_object_model.htm
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Автор темы   Непрочитано 23.09.2009, 17:38
#9
Bart


 
Регистрация: 23.07.2009
Сообщений: 35


И еще вопрос. Переменные нужно декларировать или не обязательно?

Последний раз редактировалось Bart, 23.09.2009 в 17:46.
Bart вне форума  
 
Непрочитано 23.09.2009, 21:05
#10
AlexV

Инженер
 
Регистрация: 02.10.2008
С-Пб
Сообщений: 3,692


Если в начале модуля есть "фраза" Option explicit, то надо. Если нет, то не обязательно..
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Непрочитано 23.09.2009, 22:51
#11
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,409


Но лучше поставить Option Explicit и не мучаться потом с непонятным поведением
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 23.09.2009, 23:39
#12
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,335


лучше вообще забыть про VBA чтоб потом не мучаться
http://dwg.ru/dnl/254 - раз прога недоделаная, но можно поучиться на примере.
http://dwg.ru/dnl/1931 - два прога доделанная, если не понятно как атрибуты редактировать то там есть
ЗЫ если в ВБА все равно не шаришь пиши на лиспе.
Sleekka вне форума  
 
Автор темы   Непрочитано 24.09.2009, 11:59
#13
Bart


 
Регистрация: 23.07.2009
Сообщений: 35


Sleekka
У меня другая задача. Не просто работа с атрибутами. Но проги посмотрю при случае. И почему забыть про ВБА?
А лисп для меня вообще загадка, на вба проще.
Bart вне форума  
 
Непрочитано 24.09.2009, 12:02
#14
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,335


на лиспе нужно меньше писать раза так в 3 чтобы решить ту же задачу что и на вба, к тому же когда придется работать с массивами данных, в вба - чтобы массив был динамическим нужно будет при записи элемента постоянно назначать новую размерность массиву, вобщем намучаетесь, вба это так - цвет линии поменять и только, серьезных задач там не решить.
Sleekka вне форума  
 
Автор темы   Непрочитано 24.09.2009, 13:57
#15
Bart


 
Регистрация: 23.07.2009
Сообщений: 35


Ну а где решить?
Мне, возможно, нужно будет делать менюшку, экспорт данных в access, эксель и ворд, а так же и обратно. Еще открывать файл, делать в нем чертеж и сохранять куда нужно.
Возможно все это будет через меню, а возможно будет считываться из файла эксель. Пока еще не ясно, все в процессе.
На данный момент идет процесс изучения.

Лисп я совсем не знаю, и мне как-то кажется, что он для этого не подойдет.
Bart вне форума  
 
Непрочитано 24.09.2009, 14:20
#16
AlexV

Инженер
 
Регистрация: 02.10.2008
С-Пб
Сообщений: 3,692


Цитата:
Сообщение от Bart Посмотреть сообщение
Ну а где решить?
Мне, возможно, нужно будет делать менюшку, экспорт данных в access, эксель и ворд, а так же и обратно. Еще открывать файл, делать в нем чертеж и сохранять куда нужно.
Возможно все это будет через меню, а возможно будет считываться из файла эксель. Пока еще не ясно, все в процессе.
На данный момент идет процесс изучения.
Лисп я совсем не знаю, и мне как-то кажется, что он для этого не подойдет.
Возможно, это можно и на лиспе сделать (я его тоже не знаю), но для взаимодействия с экселями и прочими вордами мне кажется, VBA подойдет лучше.. Правда, в состав Autocad 2010 модуль VBA уже не входит (можно его качнуть с автодесковского сайта и доустановить), а в будущих версиях, возможно, он и вовсе отомрет..
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Автор темы   Непрочитано 24.09.2009, 14:33
#17
Bart


 
Регистрация: 23.07.2009
Сообщений: 35


Как не входит??? Фига себе.
А тут нигде нет обсуждения о том, на чем программировать? Если VBA отпадет, то не понятно как дальше все работать будет.
Bart вне форума  
 
Непрочитано 24.09.2009, 15:01
#18
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,409


VBA-модуль не поставляется в комплекте с AutoCAD 2010 и продуктами на его основе (но этот модуль еще можно скачать с официального сайта).
Почему "непонятно на чем программировать"? lisp / arx / .net - и вперед
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 24.09.2009, 15:17
#19
Bart


 
Регистрация: 23.07.2009
Сообщений: 35


Почитал я Autodesk.
VBA закончилось, советуют переходить на VB Express Edition. Он же и есть .net.
А кто на чем программирует? С лиспом все ясно.
Я просто думаю (свои требования я описал в первом посте) делать все на VB или переходить на что-то еще. Программистов рядом нет, так что спросить совета не у кого.

А в 2009 автокаде нормально будет работать то, что сделано на VB экспресс? И как там интегрируется?
Просто сейчас можно прогу запускать в самом акаде. Еще даже не законченую.
Bart вне форума  
 
Непрочитано 24.09.2009, 15:24
#20
AlexV

Инженер
 
Регистрация: 02.10.2008
С-Пб
Сообщений: 3,692


Цитата:
Сообщение от Bart Посмотреть сообщение
Как не входит??? Фига себе.
А тут нигде нет обсуждения о том, на чем программировать? Если VBA отпадет, то не понятно как дальше все работать будет.
VB.net, C++, C#... Я не знаю, конечно, как политика автодеска изменится, но возможно, уже для следующей версии разработанные VBA-шные модули уже будут неприменимы..
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Непрочитано 24.09.2009, 15:26
#21
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,409


Интегрируется как обычная .NET-сборка. Но с Express Edition лучше уточнять - на caduser.ru А.Ривилис говорил по этой теме.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 24.09.2009, 16:37
#22
Bart


 
Регистрация: 23.07.2009
Сообщений: 35


Попробую сделать это все на .net. От VBA откажусь.
Различия большие?

Сижу ищи и не могу найти как прогу из VBA в VB.net конвертнуть. Пока кроме видео ничего не нашел. А видео у меня не показывает.

Последний раз редактировалось Bart, 24.09.2009 в 17:22.
Bart вне форума  
 
Непрочитано 24.09.2009, 16:41
#23
AlexV

Инженер
 
Регистрация: 02.10.2008
С-Пб
Сообщений: 3,692


Цитата:
Сообщение от Bart Посмотреть сообщение
Попробую сделать это все на .net. От VBA откажусь.
Различия большие?
Вообще, интересно было бы глянуть на какую-нибудь открытую простенькую vb.net сборку... Может, кто покажет, с чем его едят? И можно ли VBA-шные модули как-то с минимальными затратами импортировать в net?
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Непрочитано 24.09.2009, 17:44
#24
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


По поводу перехода с VBA на VB.NET: http://through-the-interface.typepad...on-basics.html
А сборки есть в примерах в ObjectARX SDK.
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 02.10.2009, 17:46
#25
Bart


 
Регистрация: 23.07.2009
Сообщений: 35


А как все то же самое на vb.net пишется? Я пытаюсь просто блок вставить, но пока никак не найду как все описывается.

Покопался я во всяких обучалках, посмотрел лекции (почти ничего нет, нужно самому догадываться). Как-то все сложно в .net. Код получается раз в 5 больше, чем на VBA.
Попытаюсь что-либо сотворить. Если ничего не выйдет - брошу и буду делать на VBA. Литературы нет.
Хелп такой, что мало что описано.
На VBA на данный момент все гораздо доступнее.

Последний раз редактировалось Bart, 06.10.2009 в 17:26.
Bart вне форума  
 
Автор темы   Непрочитано 06.10.2009, 17:28
#26
Bart


 
Регистрация: 23.07.2009
Сообщений: 35


Код вставки блока на vb.net ниже.

Последний раз редактировалось Bart, 24.11.2009 в 12:33.
Bart вне форума  
 
Непрочитано 11.10.2009, 02:31 VBA Редактирование аттрибутов блока
#27
CrazyBaby

RU
 
Регистрация: 04.10.2009
RU
Сообщений: 5


Здравствуйте. Если в VBA есть средства создания элементов управления на пользовательской форме в момент выполнения программы , то IMHO должен существовать и способ создания событий типа "onclick" во время работы программы. Подскажите ,pls, какой?
CrazyBaby вне форума  
 
Непрочитано 11.10.2009, 09:08
#28
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,409


Цитата:
Сообщение от CrazyBaby Посмотреть сообщение
Если в VBA есть средства создания элементов управления на пользовательской форме в момент выполнения программы
А они есть?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 11.10.2009, 11:18
#29
AlexV

Инженер
 
Регистрация: 02.10.2008
С-Пб
Сообщений: 3,692


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
А они есть?
Да, их есть.. В смысле, возможность создания контролов и кодов обработки событий программно...
http://www.caduser.ru/forum/index.ph...#message261100
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Автор темы   Непрочитано 22.10.2009, 15:47
#30
Bart


 
Регистрация: 23.07.2009
Сообщений: 35


Переписал я свою программу на vb.net.
Написанный выше скрипт вставки блока и редактирования атрибутов работает, но я его немного изменил, а то не работал. Пришлось, конечно, посидеть и во всем разобраться.
Честно, скажу, не все понятно, но работает :-)

Ну и вот мой код.
Код:
[Выделить все]
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.EditorInput
Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.Geometry
Public Class InsertBlock
    Public Shared Sub ImportBlock(ByVal BlockFile As String, ByVal BlockName As String)

        Dim myDwg As Document
        Dim myDwgLoc As DocumentLock
        Dim mySourceDB As New Database(False, False)
        Dim myActiveDB As Database
        'Read file and load block into current database
        Try
            myDwg = Application.DocumentManager.MdiActiveDocument
            myDwgLoc = myDwg.LockDocument()
            myActiveDB = myDwg.Database
            mySourceDB.ReadDwgFile(BlockFile, IO.FileShare.ReadWrite, True, "")
            myActiveDB.Insert(BlockName, mySourceDB, False)
            mySourceDB.Dispose()
            myDwgLoc.Dispose()
        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, "AutoGen Error")
        End Try

    End Sub

    Public Shared Function InsertBlock(ByVal InsPt As Point3d, ByVal BlockName As String, Optional ByVal XScale As Double = 1.0, Optional ByVal YScale As Double = 1.0, Optional ByVal ZScale As Double = 1.0) As ObjectId

        Try
            Dim myTransMan As Autodesk.AutoCAD.DatabaseServices.TransactionManager
            Dim myTrans As Transaction
            Dim myDwg As Document
            Dim myBT As BlockTable
            Dim myBTR As BlockTableRecord
            Dim myAttColl As AttributeCollection
            Dim myEnt As Entity
            Dim myBTREnum As BlockTableRecordEnumerator
            Dim myDwgLoc As DocumentLock

            'Get active document and begin transaction
            myDwg = Application.DocumentManager.MdiActiveDocument
            myDwgLoc = myDwg.LockDocument()
            myTransMan = myDwg.TransactionManager
            myTrans = myTransMan.StartTransaction

            'Open Block Table
            myBT = myDwg.Database.BlockTableId.GetObject(OpenMode.ForRead)
            myBTR = myBT(BlockTableRecord.ModelSpace).GetObject(OpenMode.ForWrite)

            'Insert the Block
            Dim myBlockDef As BlockTableRecord = myBT(BlockName).GetObject(OpenMode.ForRead)
            Dim myBlockRef As New BlockReference(InsPt, myBT(BlockName))
            myBlockRef.ScaleFactors = New Scale3d(XScale, YScale, ZScale)
            myBTR.AppendEntity(myBlockRef)
            myTrans.AddNewlyCreatedDBObject(myBlockRef, True)

            'Set Attribute values
            myAttColl = myBlockRef.AttributeCollection
            myBTREnum = myBlockDef.GetEnumerator
            While myBTREnum.MoveNext
                myEnt = myBTREnum.Current.GetObject(OpenMode.ForWrite)
                If TypeOf myEnt Is AttributeDefinition Then
                    Dim myAttDef As AttributeDefinition = myEnt
                    Dim myAttRef As New AttributeReference
                    myAttRef.SetAttributeFromBlock(myAttDef, myBlockRef.BlockTransform)
                    myAttColl.AppendAttribute(myAttRef)
                    myTrans.AddNewlyCreatedDBObject(myAttRef, True)
                End If
            End While
            myDwgLoc.Dispose()
            myTrans.Commit()

            'Clean(up)
            myTrans.Dispose()
            myTransMan.Dispose()
            Return myBlockRef.ObjectId
        Catch e As Exception
            MsgBox(e.Message, MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, "AutoGen Error")
        End Try
    End Function
    Public Shared Sub SetAttributes(ByVal BlockId As ObjectId, ByVal TagList As Collection)

        Try
            Dim myTransMan As Autodesk.AutoCAD.DatabaseServices.TransactionManager
            Dim myTrans As Transaction
            Dim myDwg As Document
            Dim myDwgLoc As DocumentLock
            Dim myBlkRef As BlockReference
            Dim myAttColl As AttributeCollection
            Dim myEnt As ObjectId
            Dim myAttRef As AttributeReference

            'Get active document and begin transaction
            myDwg = Application.DocumentManager.MdiActiveDocument
            myDwgLoc = myDwg.LockDocument()
            myTransMan = myDwg.TransactionManager
            myTrans = myTransMan.StartTransaction

            'Find block and set attributes
            myBlkRef = BlockId.GetObject(OpenMode.ForWrite)
            myAttColl = myBlkRef.AttributeCollection
            For Each myEnt In myAttColl
                myAttRef = myEnt.GetObject(OpenMode.ForWrite)
                Dim myItem As String
                Try
                    myItem = TagList(myAttRef.Tag)
                    myAttRef.TextString = myItem
                Catch
                End Try
            Next
            myDwgLoc.Dispose()
            myTrans.Commit()

            'Clean up
            myTrans.Dispose()
            myTransMan.Dispose()
        Catch e As Exception
            MsgBox(e.Message, MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, "AutoGen Error")
        End Try
    End Sub
End Class

'Обращение к вставке из основной программы
Private Sub CommandButton1_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles CommandButton1.Click

InsertBlock.ImportBlock(BFile, BName) 'BFile и BName - ваши имена
Dim myBlk As ObjectId
myBlk = InsertBlock.InsertBlock(New Point3d(x, y, z), BName)

Dim myTags As New Collection
myTags.Add("ваше значение", "имя аттрибута")

InsertBlock.SetAttributes(myBlk, myTags) 'myBlk и myTags - ваши имена

End Sub

Последний раз редактировалось Bart, 24.11.2009 в 12:32.
Bart вне форума  
 
Автор темы   Непрочитано 03.12.2009, 16:38
#31
Bart


 
Регистрация: 23.07.2009
Сообщений: 35


Подскажите в чем трабл. Делаю вставку блока на vb.net так, как постил выше.
Если делаю вставку через юзер форм, то все работает. Делаю немного иначе в другом модуле (class1) - не пашет. Код вставки блока и открытия чертежа тот же. Все лишние строки отключал. Открывает файл, но вставку делает не в открытый чертеж, а в drawing1, который автоматом открывается вместе с автокадом. Делал принудительно нужный мне файл активным - все равно вставка делается в другой чертеж.

В чем тут дело?
Bart вне форума  
 
Непрочитано 04.12.2009, 08:43
#32
Сергей Дубина


 
Регистрация: 06.04.2009
Сообщений: 702


Цитата:
Сообщение от Bart Посмотреть сообщение
На VBA на данный момент все гораздо доступнее.
на VBA максимально похож VB6.
__________________
КазнитьØнельзяØпомиловать:eek:
Сергей Дубина вне форума  
 
Автор темы   Непрочитано 04.12.2009, 13:59
#33
Bart


 
Регистрация: 23.07.2009
Сообщений: 35


Нашел решение.
Все дело вот тут...

<CommandMethod("command", CommandFlags.Session)>

Надо было добавить CommandFlags.Session.
Bart вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > VBA. Редактирование аттрибутов блока.



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Редактирование блока, используя значение его атрибутов Mazai Программирование 14 19.01.2009 20:49
Редактирование блока ALM AutoCAD 1 27.06.2008 10:54
Как в пространстве редактора блоков запустить редактирование вложенного блока. Supermax Программирование 5 18.12.2007 17:50
Измнение через ексель (через макрос в VBA) аттрибутов динамического блока VitaminC Программирование 4 20.10.2007 14:52