2015-05-03 4 views
1

У меня есть этот код в ThisDocument в слове .docm:Sub отключена после сохранения

Private Sub selConcept_Click() 
    'enable the content field, delete the other two fields, 
    'and delete the buttons including itself 

    ActiveDocument.ContentControls(3).LockContents = False 
    ActiveDocument.ContentControls(4).Delete 
    ActiveDocument.ContentControls(4).Delete 
    ActiveDocument.InlineShapes(3).Delete 
    ActiveDocument.InlineShapes(3).Delete 
    ActiveDocument.InlineShapes(3).Delete 


    End Sub 

    Private Sub selTask_Click() 

    ActiveDocument.ContentControls(4).LockContents = False 
    ActiveDocument.ContentControls(3).Delete 
    ActiveDocument.ContentControls(4).Delete 

    ActiveDocument.InlineShapes(3).Delete 
    ActiveDocument.InlineShapes(3).Delete 
    ActiveDocument.InlineShapes(3).Delete 


    End Sub 

    Private Sub selRef_Click() 

    ActiveDocument.ContentControls(5).LockContents = False 
    ActiveDocument.ContentControls(3).Delete 
    ActiveDocument.ContentControls(3).Delete 
    ActiveDocument.InlineShapes(3).Delete 
    ActiveDocument.InlineShapes(3).Delete 
    ActiveDocument.InlineShapes(3).Delete 
    End Sub 



    Private Sub formatSaveB_Click() 
    With Dialogs(wdDialogFileSaveAs) 
      .Format = wdFormatFilteredHTML 
      .Show 
     End With 
End Sub 

selConcept, selTask и selRef являются командными кнопками, и есть три мультимедийные контент текста управления на странице также. Щелчок одной из этих трех кнопок управления удаляет себя и две другие кнопки и удаляет два элемента управления расширенным текстом.

Путь по-другому: нажатие любой из кнопок sel оставляет вам один богатый текстовый элемент управления и ноль sel кнопок.

formatSaveB - это еще одна кнопка команды в конце, а связанный с ней код открывает диалоговое окно для сохранения в виде документа .htm.

Все работает, если пользователь проходит процесс и использует кнопку formatSaveB для сохранения; он сохраняется как HTM-файл.

Я хочу, чтобы пользователи могли спасти проекты Word, однако, если это возможно, но если я нажал одну из трех sel кнопок, то я сохраняю документ как переименованный .docm файл, как draft.docm, а затем, когда я снова откройте его, кнопка formatSaveB ничего не делает. Кажется, он полностью отключен после сохранения как .docm. Даже если я выберу все остальное из страницы Draft.docm ThisDocument, он все равно не работает.

Я заметил, что если я просто сохранить как draft.docm и не близко это, кнопка formatSaveB все еще работает.

При попытке отладки я вижу «Ошибка выполнения 430: Word класс VBA не поддерживает автоматизацию»

UPDATE:

Спасибо Петр, на самом деле я думаю, что правые становятся мишенью, это сложно потому что, когда он удаляет (3), тогда следующий становится (3), как вы говорите. Я думаю, что у меня это получилось, хотя в любом случае правильные поля удаляются, когда я нажимаю. Кнопка «Формат», которая перестает работать, не удаляется, она просто перестает работать, и она выбирается по имени. Он не выбирает и не удаляет какие-либо другие элементы управления, он просто должен сохранять как .htm (что он делает, пока я не сохраню .docm как черновик.)

С другой стороны, я нахожу выбор по индексу боль , но я не нашел способ выбрать ContentControls по имени, вы можете посоветовать об этом? Я могу выбрать кнопки по имени, но тот же метод не работает в ContentControls.

Например, у меня есть элемент управления содержимым Rich Text, созданный с использованием режима разработки в Word, и если я нажму на него правой кнопкой мыши, я могу назвать его именем (Concept) и тегом (ConceptTag). Именованные и помеченные таким образом, ни одна из этих работ:

ActiveDocument.ConceptControls("Concept").Delete 

ActiveDocument.ConceptControls("Concept").Select 
    Selection.Delete 

Любые советы по выбору и удалению их по имени? Я попробовал предложение выбрать по тегу, и это тоже не сработало.

+0

Опасности в использовании числового индекса для 'ContentControls' или' InlineShapes' является то, что вы всегда будете получать 3-й и 4-й контроль/форму, но нет никакой гарантии, какой контроль/форма это! Вам нужно найти другой отличительный аспект каждого из элементов управления и фигур, которые вы хотите удалить, и/или дать им определенное имя при их создании. Я сильно подозреваю, что ваши кнопки - «ContentControls (3)» и «ContentControls (4)». – PeterT

+0

Спасибо, Питер, см. Мое обновление. – user3762977

ответ

1

Трюк состоит в том, чтобы отметить элементы управления и формы. Мое предложение (и показано ниже в моем решении) заключается в использовании поля .Tag в каждом элементе управления, который вы хотите сохранить. Установите это поле в известную и уникальную строку (в моем примере - "KeepThisControl").

Затем в коде, когда вы проходите через все элементы управления, проверяйте тег и удаляете те элементы управления, которые не имеют меток, и обратите внимание на свой индекс списка управления.

(я включал много заявлений отладки ниже, чтобы проверить вашу работу, так что не забудьте удалить их.)

Option Explicit 

Const KEEPER_TAG = "KeepThisControl" 

Public Sub DeleteControlsAndShapes() 
    Dim thisDoc As Document 
    Dim totalNotDeleted As Integer 
    Dim total As Integer 
    Dim i As Integer 

    Set thisDoc = ActiveDocument 

    '----- delete this after fully debugged ------- 
    total = thisDoc.ContentControls.Count 
    Debug.Print "initial count of ALL controls = " & thisDoc.ContentControls.Count 
    totalNotDeleted = 0 
    For i = 1 To total 
     If thisDoc.ContentControls(i).Tag = KEEPER_TAG Then 
      totalNotDeleted = totalNotDeleted + 1 
     End If 
    Next i 
    Debug.Print "initial count of KEEPER controls = " & totalNotDeleted 
    '----- delete this after fully debugged ------- 

    '--- work up one index at a time and check the tag... 
    '  -- advance the index if the tag is a keeper 
    '  -- delete the item and keep the index if not 
    i = 1 
    Do 
     If thisDoc.ContentControls(i).Tag = KEEPER_TAG Then 
      i = i + 1 
     Else 
      thisDoc.ContentControls(i).Delete 
     End If 
    Loop Until (i = thisDoc.ContentControls.Count) 

    '----- delete this after fully debugged ------- 
    Debug.Print "All non-keeper controls deleted!" 
    total = thisDoc.ContentControls.Count 
    Debug.Print "initial count of ALL controls = " & thisDoc.ContentControls.Count 
    totalNotDeleted = 0 
    For i = 1 To total 
     If thisDoc.ContentControls(i).Tag = KEEPER_TAG Then 
      totalNotDeleted = totalNotDeleted + 1 
     End If 
    Next i 
    Debug.Print "initial count of KEEPER controls = " & totalNotDeleted 
    Debug.Print "Finished." 
    '----- delete this after fully debugged ------- 
End Sub 
Смежные вопросы