Как сделать форму макроса VBA расширяемой? - PullRequest
1 голос
/ 11 февраля 2020

Контекст:

Я относительно новичок в использовании макросов VBA, особенно для разработки макросов для документов MS Word. Сегодня я поиграл с небольшим проектом, который, по моему мнению, был бы полезен для меня, поскольку я принимал участие в спонсорской поддержке клубов в моей школе, и это отличный и простой способ управления информацией, которую мне нужно отслеживать. (Эта форма просто генерирует PDF-файл, который я могу отправить компаниям, которые спонсируют мой клуб. Я также планирую сохранить эту информацию в листе Excel для удобства ведения учета и отслеживания средств!)

Что я ищу для руководства Это лучший способ сделать раздел «Предмет» внизу (таблица) гибким:

, если компания будет спонсировать нас несколькими способами (например, 1 денежное пожертвование в размере 500 долларов, а затем 10). строительные материалы), как лучше добавить новые элементы управления содержимым для дополнительных элементов? В настоящее время у меня есть настройка формы, чтобы я мог обрабатывать пожертвования 1 типа.

Я понимаю, что могу добавить новые элементы управления содержимым в файл шаблона, а затем использовать условные элементы управления в форме для добавления дополнительных типов пожертвований / приравнивается к тем элементам управления контентом, где это необходимо, но мне было интересно, есть ли что-то более изящное, чем просто «скрытие» элементов управления контентом на виду? Как и в случае с ними, я создаю их ТОЛЬКО тогда, когда они мне нужны, в отличие от того, чтобы они уже были в шаблоне и, возможно, не использовались.

Я также понимаю, что могу создавать закладки в своем шаблоне, а затем вводить информацию в эти местоположения закладок основаны на условных элементах управления из моей формы, но я чувствую, что это похоже на ситуацию, описанную выше, хотя, возможно, немного "чище".

Любые советы о том, как добавить новые элементы управления содержимым или закладки ТОЛЬКО по мере необходимости будет высоко ценится, так как я хотел бы убедиться, как я приобретаю все больше и новые навыки VBA, что я использую хорошие практики и пытаюсь попробовать себя sh на раннем этапе.

Снимок экрана шаблона счета и пользовательская форма

enter image description here

1 Ответ

1 голос
/ 11 февраля 2020

Вместо использования пользовательской формы вы, вероятно, можете выполнить всю работу в самом документе, используя элементы управления содержимым в таблице, с макросом, подобным следующему, который срабатывает при выходе из последнего элемента управления содержимым в таблице. Макрос вставляется в модуль кода документа ThisDocument:

Private Sub Document_ContentControlOnExit(ByVal CCtrl As ContentControl, Cancel As Boolean)
'The following code conditionally adds a new row, with content controls, to the designated table.
Dim i As Long, j As Long, Prot As Variant
Const Pwd As String = "" 'Insert password (if any) here
'Bookmarking the table provides the flexibility of being able to deal with the addition/deletion
' of other tables before the one we want to process.
Const StrBkMk As String = "TblBkMk"
With ActiveDocument
  If .Bookmarks.Exists(StrBkMk) = False Then
    MsgBox "The table bookmark: '" & StrBkMk & "' is missing." & vbCr & _
    "Please add it to the relevant table before continuing.", vbExclamation
    Exit Sub
  End If
End With
With CCtrl
  'Check that the Content Control is within our bookmarked range.
  ' One could test for a particular table instead
  If .Range.InRange(ActiveDocument.Bookmarks(StrBkMk).Range) = False Then Exit Sub
  'Get the number of ContentControls in the table
  i = .Range.Tables(1).Range.ContentControls.Count
  'Get our ContentControl's index # in the table
  j = ActiveDocument.Range(.Range.Tables(1).Range.Start, .Range.End).ContentControls.Count
  'Check that we're using the last content control
  If i <> j Then Exit Sub
End With
'Solicit user input
If MsgBox("Add new row?", vbQuestion + vbYesNo) <> vbYes Then Exit Sub
With ActiveDocument
  ' Un-protect the document, if applicable
  Prot = .ProtectionType
  If .ProtectionType <> wdNoProtection Then
    Prot = .ProtectionType
    .Unprotect Password:=Pwd
  End If
  With Selection.Tables(1).Rows
    'Insert an empty paragraph after our table, then replace it with a replica of the last row
    With .Last.Range
      .Next.InsertBefore vbCr
      .Next.FormattedText = .FormattedText
    End With
    'Reset all content controls in the new last row
    For Each CCtrl In .Last.Range.ContentControls
      With CCtrl
        If .Type = wdContentControlCheckBox Then .Checked = False
        If .Type = wdContentControlRichText Or .Type = wdContentControlText Then .Range.Text = ""
        If .Type = wdContentControlDropdownList Then .DropdownListEntries(1).Select
        If .Type = wdContentControlComboBox Then .DropdownListEntries(1).Select
        If .Type = wdContentControlDate Then .Range.Text = ""
      End With
    Next
  End With
  ' Re-protect the document, if applicable
  .Protect Type:=Prot, Password:=Pwd
End With
End Sub

Примечание: В приведенном выше коде предполагается, что таблица помечена закладкой «TblBkMk». Согласно комментариям в коде, это дает возможность того, что другие таблицы могут быть вставлены / удалены до той, которая вас интересует. Если вас это не беспокоит, см .: https://www.msofficeforums.com/word-vba/27809-code-add-new-row-table.html#post87989

Для некоторых демонстрационных документов см .:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...