powered by simpleCommunicator - 2.0.54     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Вставка textbox при открытии документа Word без сохранения изменений
6 сообщений из 6, страница 1 из 1
Вставка textbox при открытии документа Word без сохранения изменений
    #37491406
NeverAngel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Написал скрипт, который при открытии файлов *.doc(x) - "только чтение", вставляет textbox с данными из Oracle database по средствам OO4O.
После того как textbox объявился в файле, который в режиме "только чтение" и никаких более изменений не производилось,
то при закрытии файла он предлагает сохранить изменения.
Как избежать события "сохранить изменения" при закрытии файла, если производилась только вставка textbox?
Собственно скрипт:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
Sub SilverBullet()

'Connection to Oracle with OO4O (Oracle object for OLE)
'Tools -> References.. -> Select <Oracle InProc Server 5.0 Type Library>
Dim oraSession  As Object
Dim oraDatabase As Object
Dim OraDynaset As OraDynaset
Dim OraFields As OraFields
Dim FieldDoc, FieldPol, FieldStat As String
Dim DocName As String

Dim strDocName As String
Dim strPath As String
Dim ldDoc As Document
Dim strAnyWord As String

'for testing
Dim lines() As String
Dim text1 As String

    Set ldDoc = ActiveDocument
'File name without extention .doc or .docx
    strDocName = Left(ldDoc.Name, InStr( 1 , ldDoc.Name, ".") -  1 )

'Fullpath of file
    strPath = ldDoc.Path
    'strAny = ldDoc.Content  'Insert text from file in object
    strAnyWord = "Aieoiaio:"
       
    Set oraSession = CreateObject("OracleInProcServer.XOraSession")
'Connection parameter
    Set oraDatabase = oraSession.OpenDatabase("landocst", "dbo/dbo",  0 )
    'MsgBox "Connected to " & oraDatabase.Connect & "@" & oraDatabase.DatabaseName

'Create the OraDynaset Object.
'if you are not call parameter for Bind variable, your SQl statment will ejected error
    oraDatabase.Parameters.Add "var1", strDocName,  1 
    
    Set OraDynaset = oraDatabase.CreateDynaset(" SELECT ver.""FileName"" as NameDoc, voc.""Name"" as Pol, stat.""Name"" as StatName " _
   & "FROM dbo.ldmail mail, DBO.LDERC erc, DBO.LDMAILSTATE stat, DBO.LDVOCABULARY voc, DBO.ldversion ver " _
   & "WHERE erc.""ID"" = mail.""ERCID"" AND ver.""FileName"" = :var1 AND erc.""ID"" = ver.""DocID"" AND erc.""JournalID"" = 340470 " _
   & " AND mail.""ReceiverID"" = voc.""ID"" AND mail.""MailStateID"" in (2,4,6) AND mail.""MailTypeID"" = 340468 AND mail.""MailStateID"" = stat.""ID"" ",  0 &)

'You can now display or manipulate the data in the dynaset. For example:
    Do While Not OraDynaset.EOF
        Set OraFields = OraDynaset.Fields
        FieldPol = OraFields("Pol").Value
        FieldStat = OraFields("StatName").Value
        lines() = Split(strAnyWord & " " & strDocName & " " & FieldPol & " -> " & FieldStat, "")
        'text1 = text1 & vbCrLf & FieldPol & FieldStat
        text1 = lines(i) & vbCrLf & text1
        OraDynaset.MoveNext
        Loop
        
'Insert data in textbox
    With ldDoc.Shapes.AddTextbox(msoTextOrientationHorizontal,  320 ,  780 ,  280 ,  50 )
        .LockAspectRatio = msoTrue
        .LockAspectRatio = msoTrue
        .Line.Visible = msoFalse    'Hide lines
        .TextFrame.TextRange.Text = text1
        .TextFrame.TextRange.Font.Name = "Times New Romans"  'Font
        .TextFrame.TextRange.Font.Size =  8      'Size font
        .TextFrame.AutoSize = True      'Autosize textbox
        '.TextFrame.VerticalAnchor = msoAnchorBottom
    End With
    
End Sub
...
Рейтинг: 0 / 0
Вставка textbox при открытии документа Word без сохранения изменений
    #37491434
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поставить свойство документа .Saved=True
...
Рейтинг: 0 / 0
Вставка textbox при открытии документа Word без сохранения изменений
    #37491460
NeverAngel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro Поставить свойство документа .Saved=True

Пробовал
Код: plaintext
1.
2.
3.
    If ThisDocument.Saved = True Then
    ldDoc.Close wdDoNotSaveChanges
    Else
    End If

Но все равно при закрытии файла выдает сохранить изменения.

Но в голову пришла новая идея. Поиграться с Undo, сделать подсчет изменений (у меня всего 7 изменений), которые происходят в процессе вставки textbox. Если количество изменений при вставке не будет превышать 7, то закрывать без сохранения. Может не очень толково изъяснился, скоро кину пример=)
...
Рейтинг: 0 / 0
Вставка textbox при открытии документа Word без сохранения изменений
    #37491470
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Saved доступно не только по чтению, но и по записи. Если установить его в True, документ не будет считаться измененным
...
Рейтинг: 0 / 0
Вставка textbox при открытии документа Word без сохранения изменений
    #37491483
NeverAngel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro Saved доступно не только по чтению, но и по записи. Если установить его в True, документ не будет считаться измененным

Сорри, затупил и не туда куда надо добавил ActiveDocument.saved = True. Отредактировал, испытал, работает!
Надо будет еще пару случаев проверить, и тогда вынесу сие вердикт..

Кстати с использованием ActiveDocument.Undo, файл закрывается без сохранения если только была вставка textbox:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Private Sub Document_Close()
Dim ldDoc As Document

Set ldDoc = ThisDocument

ActiveDocument.Undo  7  'ровно столько изменений требуется для вставки моего textbox

   If Not ldDoc.Undo = True Then
        MsgBox "No save"
    ldDoc.Close (wdDoNotSaveChanges)
    Else
           MsgBox "Yes save"
    End If

End Sub
...
Рейтинг: 0 / 0
Вставка textbox при открытии документа Word без сохранения изменений
    #37493374
NeverAngel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Отредактировал скрипт, теперь вместо textbox использую колонтитул (такова была просьба рук-ва). Полет нормальный. Теперь после вставки колонтитула в файл, он не требует сохранения изменений, когда его закрываешь.

Измененный макрос:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
Sub AddColontitul()

Dim oraSession  As Object
Dim oraDatabase As Object
Dim OraDynaset As OraDynaset
Dim OraFields As OraFields
Dim FieldRec As String
Dim FieldCnt As String

Dim strPath As String
Dim ldDoc As Document
Dim strDocNameWithoutExt As String
Dim strDocName1, strDocName2, strDocID As String
Dim strDocName3, strDocName As String
Dim lines() As String
Dim text1 As String
Dim Foot As HeaderFooter
Dim mytxtbox As Shape

    Set ldDoc = ActiveDocument
'-----------------------Get FileName without extention----------------
    strDocNameWithoutExt = Left(ldDoc.Name, InStr( 1 , ldDoc.Name, ".") -  1 )
    MsgBox strDocNameWithoutExt
    
'------------------------Get only ID from FileName--------------------
    strDocName1 = InStr( 1 , StrReverse(strDocNameWithoutExt), "(")
    strDocName2 = Right(strDocNameWithoutExt, strDocName1 -  1 )
    strDocID = Trim(Left(strDocName2, InStr( 1 , strDocName2, "_") -  1 ))

'----------------------------Get only FileName------------------------
    strDocName3 = Right(strDocNameWithoutExt, strDocName1 -  0 )
    strDocName = Trim(Replace(strDocNameWithoutExt, strDocName3, ""))
    
'------------------------Oracle Connection parameter------------------
    Set oraSession = CreateObject("OracleInProcServer.XOraSession")
    Set oraDatabase = oraSession.OpenDatabase("landocs2.keramin.int", "otchetman/loop",  0 )
    'MsgBox "Connected to " & oraDatabase.Connect & "@" & oraDatabase.DatabaseName

'------------------------Check type document--------------------------
    oraDatabase.Parameters.Add "var1", strDocID,  1 
    
       Set OraDynaset = oraDatabase.CreateDynaset(" SELECT count(ver.""ID"") as Cnt " _
        & "FROM dbo.ldmail mail, DBO.LDERC erc, DBO.ldversion ver " _
        & "WHERE erc.""ID"" = mail.""ERCID"" AND ver.""ID"" = :var1 " _
        & "AND erc.""ID"" = ver.""DocID"" " _
        & "AND mail.""MailStateID"" in (2,4,6) AND mail.""MailTypeID"" = 340468 " _
        & "AND ver.""VerN"" in (select max(ver.""VerN"") FROM dbo.ldmail mail, DBO.LDERC erc, DBO.ldversion ver " _
        & "WHERE erc.""ID"" = mail.""ERCID"" AND ver.""ID"" = :var1 " _
        & "AND erc.""ID"" = ver.""DocID"" " _
        & "AND mail.""MailStateID"" in (2,4,6) AND mail.""MailTypeID"" = 340468) ",  0 &)
       
       Set OraFields = OraDynaset.Fields
       FieldCnt = OraFields("Cnt").Value
       
'---------------------Main condition for working macros---------------
    If FieldCnt >  0  Then

'--------------------Execute sql-function-----------------------------
        Set OraDynaset = oraDatabase.CreateDynaset("select dbo.LDF_LDDOC_TYPE( :var1 ) as vRec from dual",  0 &)
        
'----------------------Get returned value-----------------------------
        Set OraFields = OraDynaset.Fields
        FieldRec = OraFields("vRec").Value

'---------------------Reaction by return value------------------------
        If FieldRec =  1  Then
            Stat = "Согласовано"
        ElseIf FieldRec =  2  Then
            Stat = "Не согласовано"
        Else
            Stat = "Ошибка!"
        End If
    
        lines() = Split(Left(strDocName,  100 ) & "  " & Stat, vbCrLf)
        text1 = Trim(lines(i))
        
'-----------------------Create Footer---------------------------------
       With ldDoc.Sections( 1 ).Footers(wdHeaderFooterPrimary)
        With .Range
            .Text = text1
            With .Font
                .Color = wdColorBlack
                .Name = "Times New Roman"
                .Size =  9 
            End With
          End With
        End With
        
'-----------------------If main condition is False--------------------
    Else
    MsgBox "По документу нет согласований"
    End If
    
    ldDoc.Saved = True

End Sub
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Вставка textbox при открытии документа Word без сохранения изменений
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]