Author |
Topic |
|
zz 5
Russia
54 Posts |
Posted - 05/23/2006 : 16:25:51
|
Здраствуйте. Пишу макросы, которые бы собирали всю информацию по шейпам и заносили в Эксель. Столкнулся с двумя проблемами:
1) Хочу пройтись по всем страницам открытого документа, но никак не могу найти свойство, возвращающее количество страниц документа. Оно мне необходимо для цикла соотвесвенно.
For I = 1 To Application.ActiveWindow.Page ???
2) В следубщем макросе я прохожусь по всем шейпам листа и, если имя шейпа содержит имя нужного класса, то необходимо его добавить в Эксель. Нижеследующий код как раз это и должен делать
Dim X As Integer
Dim N As Integer
N = 1
For I = 1 To Application.ActivePage.Shapes.Count
X = InStr(1, Application.ActivePage.Shapes(I).Name, "Process", vbTextCompare)
If X > 0 Then
Exl.Range("A" + Str(N),"A" + Str(N)).Value = "XXX"
N = N + 1
End If
Next
End
Но на строчке, где я заполняю конкретную ячейку программа валится. Видимо я неправильно указываю название ячейки. А как нужно ?
Если автор пишет о том, чего не понимает, его работа будет понята только теми читателями, которые понимают в этом больше, чем он ! |
|
brace
Russia
358 Posts |
Posted - 05/23/2006 : 17:40:12
|
а стоит ли лисапед изобретать есть штатное средство Tools > Reports подробности см. визио help -- reports. |
|
|
zz 5
Russia
54 Posts |
Posted - 05/23/2006 : 17:49:10
|
quote: Originally posted by brace
а стоит ли лисапед изобретать есть штатное средство Tools > Reports подробности см. визио help -- reports.
Конечно стоит. Я изначально посмотрел возможности Reports и они меня не слишком впечатлили. Дело в том, что пока я делаю простые запросы, но в дальнейшем планирую создавать более сложные отчеты, которые будут получаться не простым циклом по элементам, а более сложным алгоритмом отбора, поэтому для себя изначально решил использовать макросы. Ведь там возможности поистине неограничны, чего не скажешь о reports.
Если автор пишет о том, чего не понимает, его работа будет понята только теми читателями, которые понимают в этом больше, чем он ! |
|
|
Tumanov
Russia
1198 Posts |
Posted - 05/23/2006 : 19:43:31
|
1. Страницы находятся не в окне, а в документе. То есть не Application.ActiveWindow.Page, а ActiveDocument.Pages.Count 2. А второго вопроса вообще не понял. |
|
|
zz 5
Russia
54 Posts |
Posted - 05/23/2006 : 21:06:10
|
Спасибо, с первым вроде разобрался. По поводу второго: я цикле иду по шейпам, если текущий шейп меня удовлетворяет я заношу текст этого шейпа в следующую строчку таблицы Экселя. Основу данного текста я "слизал" из FAQ, немножко переделав под свои требования. Так вот там заносился текст в ячейку следующим образом: ExcelObject.Range("A1","A1").Value = "XXX" А мне же надо сделать все это в цикле, при этом наращивать номер строки, т.е. ExcelObject.Range("A2","A2"), ExcelObject.Range("A3","A3") и т.д. Для этого я и ввел переменную N. Но я видимо неправильно передаю параметры в Range, на этом и валится
Если автор пишет о том, чего не понимает, его работа будет понята только теми читателями, которые понимают в этом больше, чем он ! |
|
|
Tumanov
Russia
1198 Posts |
Posted - 05/23/2006 : 21:42:56
|
Мне кажется, что в данном случае лучше использовать Range с одним параметром и функцию CStr. Exl.Range("A" + СStr(N)).Value = "XXX" |
|
|
zz 5
Russia
54 Posts |
Posted - 05/24/2006 : 11:14:33
|
Спасибо, все заработало !
Если автор пишет о том, чего не понимает, его работа будет понята только теми читателями, которые понимают в этом больше, чем он ! |
|
|
zz 5
Russia
54 Posts |
Posted - 05/24/2006 : 14:26:44
|
Что-то я не пойму, как нужно делать вложенные циклы. Хочу пройтись по всем страницам открытого документа, а для каждой страницы - по всем шейпам. Имею следующий код:
Dim SH As Visio.Shape
Dim X As Integer
Dim N As Integer
N = 2
For I = 1 To ActiveDocument.Pages.Count
For N = 1 To ActiveDocument.Pages(I).Shapes.Count
Set SH = ActiveDocument.Pages(I).Shapes(N)
X = InStr(1, SH.Name, "Stamp", vbTextCompare)
If X > 0 Then
Exl.Range("A" + CStr(N)).Value = SH.CellsSRC(visSectionProp, 0,
visCustPropsValue).FormulaU
Exl.Range("B" + CStr(N)).Value = SH.CellsSRC(visSectionProp, 1,
visCustPropsValue).FormulaU
N = N + 1
End If
Next N
End
Next I
End Но в этом случае процедура заходит только в ПЕРВЫЙ лист, в другие она не попадает :(
Если автор пишет о том, чего не понимает, его работа будет понята только теми читателями, которые понимают в этом больше, чем он ! |
|
|
ivan
31 Posts |
Posted - 06/14/2006 : 15:54:59
|
Set Active Page: How to set the Active Page.
When you need to select shapes on a non-active page you can change the ActivePage through automation by:
ActiveWindow.Page = visDocument.Pages(iPagCtr).Name |
|
|
Tumanov
Russia
1198 Posts |
Posted - 06/14/2006 : 18:49:24
|
Да ладно, это совсем не обязательно. Приведенный макрос и так работает, если только выкинуть из него N = N + 1, заставляющую прыгать через один шейп и пару лишних End, которые и обрывали выполнение. То есть ошибки чисто технические, не имеющие отношения к Visio. |
|
|
|
Topic |
|
|
|