Просматривают:
1 Анонимно
Сложнейшая задача для дилетанта |
||
|
||
---|---|---|
Новичок
Присоединился:
2009/6/1 9:40 Откуда МО
Сообщений: 9
|
Салютую всем заинтересованным, и тем паче всем, кто сможет помочь)))
Возникла надобность автоматизации некоторых рабочих процессов в CD13, а так как самому хочется заставить программу работать в нужном русле, лишь прошу у всех вас, как у старших товарищей - не глупых и чутких подтянуть мои знания в VBA для Corela)). стоит несколько задач, но первоначальная - сортировка множества объектов по-нарастающей их ширины....Порылся на форуме, нашел следующие скрипты (весьма полезные при достаточном опыте): Set gb = ActivePage.FindShapes(, cdrTextShape) 'в объявлении New использовать не надо, ибо будет тормозить dim coll as Collection: set coll=new Collection for each s in gb collStuffSorted coll, s, -1 next ' теперь массив сортирован dim obj as object ' на всякий случай если не пройдет перебор через 's' for each obj in coll set s=obj 'а дальше работать с 's' как с обычным объектом Shape ............. ............. next Function collStuffSorted&(coll As Collection, sh as shape, ByVal Direction&) Dim a&, b&, C&, rel& a = 1: b = coll.Count: C = 0: rel = 0 dim key0 as double: key0 = sh.PositionX Do While b - a >= 0 C = (a + b) \ 2: rel = (key0 - coll(C).PositionX) * Direction Select Case rel Case is < 0: If C = a Then Exit Do Else b = C Case 0: Exit Do Case is > 0: If b = a Then Exit Do Else If a = C Then a = b Else a = C End Select Loop If C = 0 Then coll.Add sh Else If rel = -1 Then coll.Add s, , C Else coll.Add s, , , C End Function Но для меня еще это тяжеловато, ибо еще толком не могу врубиться в синтаксис VBA, да и справочника человеческого тоже нема, а юзать хелп - все равно, что искать черную кошку в темной комнате...так что уповаю на вас, друзья....Уж очень хочется развить свой пытливый мозг в этом направлении.....
Опубликовано: 2009/6/1 16:10
|
|
|
Re: Сложнейшая задача для дилетанта |
|
---|---|---|
Пользователь 1 уровня
Присоединился:
2006/10/30 14:36 Откуда Барнаул
Сообщений: 252
|
а что вы конкретно хотите то?
чтобы за вас написали макрос или чтобы вас научили писать на ВБА? :D
Опубликовано: 2009/6/1 18:03
|
|
|
Re: Сложнейшая задача для дилетанта |
|
---|---|---|
Новичок
Присоединился:
2009/6/1 9:40 Откуда МО
Сообщений: 9
|
в том-то и дело, что хочу сам, то есть что бы меня направили в нужное русло....я уже написал, основываясь на примерах, макрос выравнивания объектов по левому краю с организацией заданного пробела между объектами...теперь мне нужно понять алгоритм сравнения по ширине всего массива моих объектов, то есть мне нужно, что бы мои объекты выравнивались по левому краю с промежутком в 3мм между собой, при этом отсортированы по размеру)))......сейчас сижу в кипе распечаток-пытаюсь поближе понять синтаксис)).....а Вы, я понимаю, можете предложить свои услуги за некоторое количество liberal values!?...
Опубликовано: 2009/6/1 18:16
|
|
|
Re: Сложнейшая задача для дилетанта |
|
---|---|---|
Новичок
Присоединился:
2009/6/1 9:40 Откуда МО
Сообщений: 9
|
в данный момент я буду рад, если мне кто-нибудь сможет разжевать представленный в начале код))
Опубликовано: 2009/6/1 18:18
|
|
|
Re: Сложнейшая задача для дилетанта |
|
---|---|---|
Титан - модератор
Присоединился:
2006/4/8 19:42 Сообщений: 152
|
ну, код мой он просто создает нечто вроде массива, упорядоченного по координате X (.PositionX в вспомогательной функции collStuffSorted). Надо будет заменить на .SizeWidth.
так, раз сам разбираться будешь, то вот пару подсказок в неупорядоченном виде. Параметр Direction в вызове collStuffSorted coll, s, -1 это направление сортировки. Надо будет в начале добавить объявление dim s as shape Еще заключить основной код в рамки процедуры: Sub SortObj() ...основной код End Sub Function collStuffSorted...... ...... end function ну и самое главное двигать объекты на новые координаты в цикле: dim obj as object ' на всякий случай если не пройдет перебор через 's' for each obj in coll set s=obj 'а дальше работать с 's' как с обычным объектом Shape ............. ............. next тут вместо ............ надо например s.SetPosition curX, CurY curX=curX+s.SizeWidth+10: if curX>ActivePage.SizeWidth then curX=10: cyrY=curY+100: if curY>ActivePage.SizeHeight then curX=10:curY=10: ActiveDocument.InsertPages 1, false, ActivePage.Index ну и разумеется в начале процедуры SortObj поставить выбор миллиметров: ActiveDocument.Unit = cdrMillimeter ах, да - и в начале же для порядока можно объявить dim CurX#, CurY#: CurX=10: CurY=10
Опубликовано: 2009/6/1 18:39
|
|
|
Re: Сложнейшая задача для дилетанта |
|
---|---|---|
Новичок
Присоединился:
2009/6/1 9:40 Откуда МО
Сообщений: 9
|
ну то что туда вместо позиции нужно размер вклинивать - я понял, поэтому и схватился за алгоритм, но в силу нулевого опыта некоторые вещи непонятны, спасибо за подсказки, я поморочусь,и если что получится, вынесу на одобрение))))......если я чем-то смогу помочь, обращайся без стеснения)))
Опубликовано: 2009/6/1 18:54
|
|
|
Re: Сложнейшая задача для дилетанта |
|
---|---|---|
Новичок
Присоединился:
2009/6/1 9:40 Откуда МО
Сообщений: 9
|
Это мой изначальный код......сюда то я и буду вклинивать сортировку, но скорее всего потом нужно будет как-нибуть упрощать посредством общих функций или каких-либо универсальных классов....Конечный проект, по моей задумке, облегчит жизнь многим братьям по цеху....
Public Sub DistributeButt() Dim X As Double, Y As Double Dim NumObjs As Long Dim s As Shape Dim First As Boolean Dim i As Integer Dim d As Document Set d = ActiveDocument ActiveDocument.Unit = cdrMillimeter NumObjs = d.Selection.Shapes.Count If NumObjs < 2 Then i = MsgBox("You should select s few objects first", vbOKOnly, "Distributing" Exit Sub End If d.BeginCommandGroup First = True For Each s In d.Selection.Shapes If Not First Then s.PositionX = X s.PositionY = Y End If X = s.PositionX Y = s.PositionY - s.SizeHeight - 3 First = False Next s d.EndCommandGroup End Sub
Опубликовано: 2009/6/1 18:57
|
|
|
|
Re: Сложнейшая задача для дилетанта |
|
---|---|---|
Пользователь 1 уровня
Присоединился:
2006/10/30 14:36 Откуда Барнаул
Сообщений: 252
|
советую до кучи, найти несколько книг или сайтов с примерами, по основам ВБА... это вам поможет разобратся в самом языке.
ПС. Не, услуги я не предлагаю... надоело это ВБА
Опубликовано: 2009/6/1 19:41
|
|
|
Re: Сложнейшая задача для дилетанта |
|
---|---|---|
Новичок
Присоединился:
2009/6/1 9:40 Откуда МО
Сообщений: 9
|
Спасибо Sancho, уже перерыл кучу ресурсов, немногим раньше уже имел знакомство с VB, даже маленький exe'шничек сделал по книжке. теперь пытаюсь поженить Corel с Exel'ем..... занимательное это дело - скрипты писать)))
Кстати, может посоветуешь литературку, которая на твой взгляд наиболее доходчиво объясняет работу в VB|VBA (содержание задач с примерами их решений вообще было бы прекрасно)....
Опубликовано: 2009/6/2 13:39
|
|