All Forums
 Категория Visio
 Форум Вопросы и ответы
 Макросы
Author Previous Topic Topic Next 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.
Go to Top of Page

zz 5

Russia
54 Posts

Posted - 05/23/2006 :  17:49:10
quote:
Originally posted by brace


а стоит ли лисапед изобретать есть штатное средство Tools > Reports
подробности см. визио help -- reports.

Конечно стоит. Я изначально посмотрел возможности Reports и они меня не слишком впечатлили. Дело в том, что пока я делаю простые запросы, но в дальнейшем планирую создавать более сложные отчеты, которые будут получаться не простым циклом по элементам, а более сложным алгоритмом отбора, поэтому для себя изначально решил использовать макросы. Ведь там возможности поистине неограничны, чего не скажешь о reports.

Если автор пишет о том, чего не понимает, его работа будет понята только теми читателями, которые понимают в этом больше, чем он !
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 05/23/2006 :  19:43:31
1. Страницы находятся не в окне, а в документе. То есть не
Application.ActiveWindow.Page, а
ActiveDocument.Pages.Count
2. А второго вопроса вообще не понял.
Go to Top of Page

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, на этом и валится

Если автор пишет о том, чего не понимает, его работа будет понята только теми читателями, которые понимают в этом больше, чем он !
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 05/23/2006 :  21:42:56
Мне кажется, что в данном случае лучше использовать Range с одним параметром и функцию CStr.
Exl.Range("A" + СStr(N)).Value = "XXX"
Go to Top of Page

zz 5

Russia
54 Posts

Posted - 05/24/2006 :  11:14:33
Спасибо, все заработало !

Если автор пишет о том, чего не понимает, его работа будет понята только теми читателями, которые понимают в этом больше, чем он !
Go to Top of Page

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
Но в этом случае процедура заходит только в ПЕРВЫЙ лист, в другие она не попадает :(

Если автор пишет о том, чего не понимает, его работа будет понята только теми читателями, которые понимают в этом больше, чем он !
Go to Top of Page

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
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 06/14/2006 :  18:49:24
Да ладно, это совсем не обязательно.
Приведенный макрос и так работает, если только выкинуть из него N = N + 1, заставляющую прыгать через один шейп и пару лишних End, которые и обрывали выполнение.
То есть ошибки чисто технические, не имеющие отношения к Visio.
Go to Top of Page
  Previous Topic Topic Next Topic  
Данный сайт является архивом форума visio.artberg.ru, который был закрыт в связи с переходом на новую платформу visio.getbb.ru
Все материалы доступны только для чтения! Если у вас появились вопросы, или вы хотите что-то обсудить, связанное с Visio, обращайтесь на новый форум!
Архив был создан благодаря совместным усилиям Генадия Туманова @Tumanov (visio.artberg.ru), Александра ака @Surrogate (visio.getbb.ru), и Николая Белых @nbelyh (unmanagedvisio.com)