Author |
Topic |
|
PL
14 Posts |
Posted - 06/30/2005 : 09:31:31
|
Я рисую схемутрассы.Колодцы соединяю коннекторами произвольной длины, но одинакового вида. Каждый коннектор имеет в Custom Properties строку "Протяженность трассы", где стоит подлинная длина отрезка кабеля (Number; 0,00).Как я могу просуммировать все ячейки Value, всех коннекторов. Желательно без программирования (я его не осилю). Можно ли создать произвольную фигуру и в ее Шейп листе сделать что-то ???, что бы высвечивался итог суммирования. Дамы и Господа, если можно ТО КУДА И ЧТО ПИСАТЬ?
|
|
Digitall
Russia
389 Posts |
Posted - 06/30/2005 : 09:54:54
|
quote: Originally posted by PL
Я рисую схемутрассы.Колодцы соединяю коннекторами произвольной длины, но одинакового вида. Каждый коннектор имеет в Custom Properties строку "Протяженность трассы", где стоит подлинная длина отрезка кабеля (Number; 0,00).Как я могу просуммировать все ячейки Value, всех коннекторов. Желательно без программирования (я его не осилю). Можно ли создать произвольную фигуру и в ее Шейп листе сделать что-то ???, что бы высвечивался итог суммирования. Дамы и Господа, если можно ТО КУДА И ЧТО ПИСАТЬ?
topic.asp@TOPIC_ID=553.html |
|
|
PL
14 Posts |
Posted - 06/30/2005 : 10:31:28
|
[/quote] topic.asp@TOPIC_ID=553.html Я видела это обсуждение. Спасибо. Решается только макросом, а через шейп лист - нельзя. Я правильно поняла Ваш ответ? |
|
|
Digitall
Russia
389 Posts |
Posted - 06/30/2005 : 10:35:52
|
quote: Originally posted by PL
topic.asp@TOPIC_ID=553.html Я видела это обсуждение. Спасибо. Решается только макросом, а через шейп лист - нельзя. Я правильно поняла Ваш ответ? [/quote] Да, но решается ГОТОВЫМ макросом. Если что-то непонятно, могу написать по шагам, что надо сделать, чтобы все заработало.
Хотя и через ShapeSheet тоже можно, но так гораздо удобнее. Зачем изобретать велосипед, который уже сделан? |
|
|
PL
14 Posts |
Posted - 06/30/2005 : 11:13:57
|
[Да, но решается ГОТОВЫМ макросом. Если что-то непонятно, могу написать по шагам, что надо сделать, чтобы все заработало.
Готовый макрос даст мне нужный результат, но я все равно не пойму, как это сделано. И что-то немного поменяв в задаче - буду просить у Вас готовый макрос.
Хотя и через ShapeSheet тоже можно, но так гораздо удобнее. Зачем изобретать велосипед, который уже сделан? [/quote]
Если это очень трудоемко, то изобретать не надо. Для меня сейчас работа с шейп листом - ближе, нагляднее и понятнее. А то, что для Вас она примитивна и неудобна - не удивительно. Но все когда-то начинали... |
|
|
Digitall
Russia
389 Posts |
Posted - 06/30/2005 : 11:28:57
|
quote: Originally posted by Digitall
Да, но решается ГОТОВЫМ макросом. Если что-то непонятно, могу написать по шагам, что надо сделать, чтобы все заработало.
quote: Готовый макрос даст мне нужный результат, но я все равно не пойму, как это сделано. И что-то немного поменяв в задаче - буду просить у Вас готовый макрос.
Нет. Т.к. этот макрос я просто сделал для себя, а он пригодился остальным. Возможно, пока придет время смены задачи вы уже разберетесь.
quote:
quote: Хотя и через ShapeSheet тоже можно, но так гораздо удобнее. Зачем изобретать велосипед, который уже сделан?
Если это очень трудоемко, то изобретать не надо. Для меня сейчас работа с шейп листом - ближе, нагляднее и понятнее. А то, что для Вас она примитивна и неудобна - не удивительно. Но все когда-то начинали...
Я не говорил, что работа с ShapeSheet'ом примитивна и неудобна. Я сам в VBA не силен, и пытаюсь тоже свести всё к формулам в ShapeSheet. Но в данном случае вы не сможете реализовать вашу задачу использую только ShapeSheet.
Я сам рисую схему трасс подвесных кабельных линий, и тоже суммирую общую длину всех линий, но используя при этом простой макрос, который я сам и составил.
Для понятности могу привести код макроса с пояснениями. |
|
|
PL
14 Posts |
Posted - 06/30/2005 : 11:43:27
|
Нет. Т.к. этот макрос я просто сделал для себя, а он пригодился остальным. Возможно, пока придет время смены задачи вы уже разберетесь.
Это вряд ли.
Я не говорил, что работа с ShapeSheet'ом примитивна и неудобна. Я сам в VBA не силен, и пытаюсь тоже свести всё к формулам в ShapeSheet. Но в данном случае вы не сможете реализовать вашу задачу использую только ShapeSheet.
Я сам рисую схему трасс подвесных кабельных линий, и тоже суммирую общую длину всех линий, но используя при этом простой макрос, который я сам и составил.
Для понятности могу привести код макроса с пояснениями. [/quote]
Теперь ясно. Если не реализуется через шейп лист, поясните пожалуйста код макроса и я его(макрос) на досуге помучаю. Или он меня... |
|
|
Digitall
Russia
389 Posts |
Posted - 06/30/2005 : 13:29:15
|
quote: Originally posted by PL
Нет. Т.к. этот макрос я просто сделал для себя, а он пригодился остальным. Возможно, пока придет время смены задачи вы уже разберетесь.
Это вряд ли.
Я не говорил, что работа с ShapeSheet'ом примитивна и неудобна. Я сам в VBA не силен, и пытаюсь тоже свести всё к формулам в ShapeSheet. Но в данном случае вы не сможете реализовать вашу задачу использую только ShapeSheet.
Я сам рисую схему трасс подвесных кабельных линий, и тоже суммирую общую длину всех линий, но используя при этом простой макрос, который я сам и составил.
Для понятности могу привести код макроса с пояснениями.
Теперь ясно. Если не реализуется через шейп лист, поясните пожалуйста код макроса и я его(макрос) на досуге помучаю. Или он меня... [/quote] Я немного изменил макрос, чтобы было как в вашем первом сообщении. Теперь значение длины берется из ячейки Custom Properties.
Вот полный код с пояснениями: Sub Summ() 'Начало макроса и его название Dim Summ, ESumm As Double 'Назначаем переменные Summ - длина, ESumm - Общая сумма Dim shpObj As Visio.Shape 'Назначаем наш объект как фигуру Visio Dim selectObj As Visio.Selection 'Назначаем данный объект как выделенные фигуры Set selectObj = ActiveWindow.Selection 'Устанавливаем текущее выделение фигур активного окна i = ActiveWindow.Selection.Count 'Приравниваем переменной i количество выделенных фигур For k = 1 To i 'Начинаем цикл от переменной k до i. Т.е. мы должны взять 'длины от первой выделенной фигуры, до последней. Set shpObj = ActiveWindow.Selection.Item(k) 'Устанавливаем, что первая, k=1, фигура - это фигура Visio Summ = shpObj.CellsSRC(visSectionProp, visRowProp + 0, visCustPropsValue) 'Приравниваем переменну Summ к значению ячейки Value, 'первой строки, раздела Custom Properties 'Если ваша строка с длиной не является первой, то 'смените 0 на кол-во строк до этой строки. ESumm = ESumm + Summ 'Прибавляем текущую длину к общей сумме Next k 'Завершаем цикл, увеличивая переменную k на единицу 'И далее повторяем цикл снова ESumm = ESumm * 0.0254 'Переводим дюймы в метры MsgBox "Суммарное значение = " & ESumm, vbOKOnly, "Visio" 'Показываем пользователю сообщение с общей суммарной длиной
'Конец макроса End Sub |
|
|
immortal
Russia
391 Posts |
Posted - 06/30/2005 : 13:32:14
|
допустим у вас коннекторы имеют имена Sheet.1 Sheet.2 Sheet.3 каждый имеет кустом пропертю Prop.Row_1 - это собственно ваша "Протяженность трассы"
формула в отделном шейпе который будет подсчитывать длинну будет выглядеть следующим образом:
=Sheet.1!Prop.Row_1 + Sheet.2!Prop.Row_1 + Sheet.3!Prop.Row_1
т.е. необходимо самостоятельно задавать элементы которые необходимо сосчитать, при удалении элемента с листа, но не удалив ссылку на него из формулы, в ячейке где была формула останется только значение.
проще однако сделать это васиком
визио 2003 форэвер
...а вобще-то я белый и пушистый. |
|
|
PL
14 Posts |
Posted - 06/30/2005 : 13:35:43
|
Я немного изменил макрос, чтобы было как в вашем первом сообщении. Теперь значение длины берется из ячейки Custom Properties.
Вот полный код с пояснениями: Sub Summ() 'Начало макроса и его название Dim Summ, ESumm As Double 'Назначаем переменные Summ - длина, ESumm - Общая сумма Dim shpObj As Visio.Shape 'Назначаем наш объект как фигуру Visio Dim selectObj As Visio.Selection 'Назначаем данный объект как выделенные фигуры Set selectObj = ActiveWindow.Selection 'Устанавливаем текущее выделение фигур активного окна i = ActiveWindow.Selection.Count 'Приравниваем переменной i количество выделенных фигур For k = 1 To i 'Начинаем цикл от переменной k до i. Т.е. мы должны взять 'длины от первой выделенной фигуры, до последней. Set shpObj = ActiveWindow.Selection.Item(k) 'Устанавливаем, что первая, k=1, фигура - это фигура Visio Summ = shpObj.CellsSRC(visSectionProp, visRowProp + 0, visCustPropsValue) 'Приравниваем переменну Summ к значению ячейки Value, 'первой строки, раздела Custom Properties 'Если ваша строка с длиной не является первой, то 'смените 0 на кол-во строк до этой строки. ESumm = ESumm + Summ 'Прибавляем текущую длину к общей сумме Next k 'Завершаем цикл, увеличивая переменную k на единицу 'И далее повторяем цикл снова ESumm = ESumm * 0.0254 'Переводим дюймы в метры MsgBox "Суммарное значение = " & ESumm, vbOKOnly, "Visio" 'Показываем пользователю сообщение с общей суммарной длиной
'Конец макроса End Sub [/quote]
Мда, страшно браться. Спа-си-бо!!! |
|
|
PL
14 Posts |
Posted - 06/30/2005 : 13:43:52
|
quote: Originally posted by immortal
допустим у вас коннекторы имеют имена Sheet.1 Sheet.2 Sheet.3 каждый имеет кустом пропертю Prop.Row_1 - это собственно ваша "Протяженность трассы"
формула в отделном шейпе который будет подсчитывать длинну будет выглядеть следующим образом:
=Sheet.1!Prop.Row_1 + Sheet.2!Prop.Row_1 + Sheet.3!Prop.Row_1
т.е. необходимо самостоятельно задавать элементы которые необходимо сосчитать, при удалении элемента с листа, но не удалив ссылку на него из формулы, в ячейке где была формула останется только значение.
С этим понятно!
проще однако сделать это васиком
Кому проще?
визио 2003 форэвер
...а вобще-то я белый и пушистый.
Спасибо всем белым и пушистым!!! |
|
|
immortal
Russia
391 Posts |
Posted - 06/30/2005 : 13:54:14
|
однако замечание, ссылка на ячейку у вас абсолютная CellsSRC(visSectionProp, visRowProp + 0, visCustPropsValue)
т.е. необходимо этот факт учитывать, на мой взгляд лучше обратится непосредственно по имени ячейки Cells("Prop.Row_1")
т.е. в первом случае ваша пропертя первая, ну если прибавите 1 то будет вторая, получается надо следить, а в моём случае надо лишь позаботиться чтобы имя совпадало.
в начале макроса я бы дописал после того как код будет отлажен: On Error Resume Next
это исключит останов при ошибке.
кроме того, действия происходят над выделенными объектами
рекомендую перебирать все элементы, пропертю назвать какнибудь оригинально заменить Prop.Row_1 на Prop.dlinna тогда макрос будит
Sub Macro3()
On Error Resume Next
dl = 0
For i = 1 To Application.ActiveWindow.Page.Shapes.Count ' перебирает от первого элемента до последнего
dl = dl + Application.ActiveWindow.Page.Shapes.ItemFromID(i).Cells("Prop.dlinna").FormulaU ' собственно приплюсовывает, если нет такой
'ячейки или в этой ячейке текст то on error resume next пропустит это
Next i
MsgBox dl 'это собственно длинна в переменной dl
End Sub
визио 2003 форэвер
...а вобще-то я белый и пушистый. |
Edited by - immortal on 06/30/2005 14:00:31 |
|
|
immortal
Russia
391 Posts |
Posted - 06/30/2005 : 13:59:29
|
если у вас в ячейке элемента длинна вычисляется формулой, то надо использовать не .FormulaU а помоему .Result(0)
визио 2003 форэвер
...а вобще-то я белый и пушистый. |
|
|
PL
14 Posts |
Posted - 06/30/2005 : 14:16:29
|
quote: Originally posted by immortal
если у вас в ячейке элемента длинна вычисляется формулой, то надо использовать не .FormulaU а помоему .Result(0)
визио 2003 форэвер
...а вобще-то я белый и пушистый.
immortal
Всего прочитанного сегодня мне хватит на неделю ковыряний.(Увы - не мастер). Я очень признательна Вам за помощь. |
|
|
|
Topic |
|
|
|