All Forums
 Категория Visio
 Форум Вопросы и ответы
 способы добавления макросов в уже готовые документ
Author Previous Topic Topic Next Topic  

Surrogate

Russia
122 Posts

Posted - 05/08/2010 :  10:03:27  Visit Surrogate's Homepage
Присоединюсь к обсуждению данной темы.

У меня есть 2 вида комплектов документации: рабочая (РД) и исполнительная (ИД). Большая часть листов в обоих документах совпадает. РД уже почти вся выпущена. Я сделал макрос для модификации РД в ИД который удаляет несколько "ненужных листов", вставляет сколько-то "нужных" и сохраняет получившийся документ в специальную папку.

Я создал макрос, сохранил его в файле шаблона - *.vst. Все последующие документы будут выполняться на базе этого шаблона. НО ранее было выпущено ~50 документов без макроса!
существует ли какое-то быстрое решение, как можно добавить данный макрос в ранее выпущенные документы РД (или только копи-паст кода в уже готовые РД из шаблона с макросом) ?
есть еще одна сложность: в макросе я использую компонент Microsoft Scripting Runtime (для работы с файловой системой).
Пока я в каждом редактируемом файле сначала подключаю этот компонент, потом копи-паст кода и запуск макроса

Tumanov

Russia
1198 Posts

Posted - 05/08/2010 :  14:07:25
У меня была ситуация, когда нужно было программно заменить макросы у заказчика. Задача примерно та же :)
Выполнялось вот так:
quote:
Public Sub ProcessOne_01(Doc As Visio.Document)
'Обработка очередного документа
'Работает при установке в Visio опции Tools / Macros / Security / Trust access to Visual Basic Project
'После использования опцию желательно снять
'===================================================
' В проекте заменяются три модуля: cProvod, Forvard, DBTolls
Dim Proj As VBProject
Set Proj = Visio.Application.Vbe.VBProjects(2)
For i = 1 To Proj.VBComponents.Count
'Debug.Print Proj.VBComponents(i).Name
If StrComp(Proj.VBComponents(i).Name, "cProvod") = 0 Then
Proj.VBComponents.Remove Proj.VBComponents(i)
Proj.VBComponents.Import ("cProvod.cls")
Debug.Print "Заменен модуль cProvod"
End If
If StrComp(Proj.VBComponents(i).Name, "Forvard") = 0 Then
Proj.VBComponents.Remove Proj.VBComponents(i)
Proj.VBComponents.Import ("Forvard.bas")
Debug.Print "Заменен модуль Forvard"
End If
If StrComp(Proj.VBComponents(i).Name, "DBTolls") = 0 Then
Proj.VBComponents.Remove Proj.VBComponents(i)
Proj.VBComponents.Import ("DBTolls.bas")
Debug.Print "Заменен модуль DBTolls"
End If
Next
'===================================================
' В трафарете исправляется один мастер: Provod
Dim mas As Visio.Master
Dim masCopy As Visio.Master
Dim Sh As Visio.Shape
Set mas = ActiveDocument.Masters("Provod")
Set masCopy = mas.Open
Debug.Print mas.Shapes(1).Name
Set Sh = masCopy.Shapes(1)
Rc = Sh.RowCount(visSectionProp)
Sh.AddNamedRow visSectionProp, "Model", visTagDefault
With Sh
.CellsSRC(visSectionProp, Rc, visCustPropsLabel).FormulaU = """Model"""
.CellsSRC(visSectionProp, Rc, visCustPropsType).FormulaU = "0"
.CellsSRC(visSectionProp, Rc, visCustPropsLangID).FormulaU = "1049"
End With
masCopy.Close
Set masCopy = Nothing
End Sub

Go to Top of Page

GDK

Russia
90 Posts

Posted - 06/15/2010 :  13:56:05
Microsoft Scripting Runtime тоже можно программно подключить. Или вообще использовать позднее связывание.
Go to Top of Page

Surrogate

Russia
122 Posts

Posted - 06/15/2010 :  15:49:55  Visit Surrogate's Homepage
я попытался программно добавить Microsoft Scripting Runtime, по аналогии с кодом

Private Declare Function GetComputerNameA Lib "kernel32" (ByVal lpBuffer As String, nSize As Long) As Long

не получилось, т.к. не знаю какие должны быть параметры и аргументы у этой функции, при подключении библиотеки scrrun.dll...

Edited by - Surrogate on 06/15/2010 15:52:34
Go to Top of Page

bdfy

Belarus
267 Posts

Posted - 06/15/2010 :  21:13:00
подключение references программно архиважная штука - регулярно набиваю себе шишки на непоключенных на других компах библиотеках.
Go to Top of Page

Surrogate

Russia
122 Posts

Posted - 06/15/2010 :  23:53:19  Visit Surrogate's Homepage
а как хоть добавлять стандартные библиотеки программно ? и где можно почитать про это ?
Go to Top of Page

GDK

Russia
90 Posts

Posted - 06/17/2010 :  10:48:45
Вот пример. Только я делал его для ворда и уже не помню что и как. Так что разбирайся самостоятельно. Я думаю в гугле несложно найти материалы и примеры по этому вопросу.
Для позднего связывания поискай по слову типа CreateObject и VBA.


Sub fff()

Dim hh As Variant

Debug.Print ThisDocument.VBProject.References.Count

Dim i As Long

For i = 1 To ThisDocument.VBProject.References.Count
    Debug.Print ThisDocument.VBProject.References(i).Name & "   " & ThisDocument.VBProject.References(i).Guid
    
    hh = ThisDocument.VBProject.References(i).Guid
'    Debug.Print VBA.VarType(hh)
Next i

'ThisDocument.VBProject.References.AddFromGuid(
End Sub

Sub DocsRefer()
Dim i As Long

Dim k As Long

Dim FO As New Scripting.FileSystemObject
Dim DirT As Scripting.Folder
Dim TmpF As Scripting.File

Dim TmpStr As String

Dim TmpDoc As Word.Document
Dim SDoc As Word.Document

Dim Gu As String
Dim Ma As Long
Dim Mi As Long

Dim CF As New Scripting.Dictionary

Gu = ThisDocument.VBProject.References(5).Guid


Set DirT = FO.GetFolder(ThisDocument.Path)
'Set SDoc = Word.Documents.Open(ThisDocument.Path & "/" & "Srv.doc")

For Each TmpF In DirT.Files
    TmpStr = TmpF.Name
    If VBA.Left$(TmpStr, 1) Like ("[1-9]") Then
        
        Call CF.Add(i, DirT.Path & "/" & TmpF.Name)
        
        i = i + 1
    End If
Next



For i = 0 To CF.Count - 1
    Set TmpDoc = Word.Documents.Open(CF(CF.Keys(i)))
    
        Gu = ThisDocument.VBProject.References(5).Guid
        Ma = ThisDocument.VBProject.References(5).Major
        Mi = ThisDocument.VBProject.References(5).Minor

        Call TmpDoc.VBProject.References.AddFromGuid(Gu, Ma, Mi)

        Gu = ThisDocument.VBProject.References(6).Guid
        Ma = ThisDocument.VBProject.References(6).Major
        Mi = ThisDocument.VBProject.References(6).Minor

        Call TmpDoc.VBProject.References.AddFromGuid(Gu, Ma, Mi)


        Call TmpDoc.VBProject.References.AddFromFile(ThisDocument.Path & "/" & "Srv.doc")
        
        TmpDoc.VBProject.VBComponents.Import (DirT.Path & "/" & "AUTO.bas")
        
        TmpDoc.Close True

Next i




End Sub

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)