Don't use bookmarks with a protected form, use a docvariable field in the document and write the value of the selected item from the list box to the variable. Then the protection becomes irrelevant.
If using a multi-column list box, then you will need to re compile the address from the list box columns in the format you require into the variable. Something like the following. I have set the listbox to display only the first column to avoid clutter.
Insert { DocVariable Address } into the document at the place you want the address to appear.
Option Explicit
Private oVars As Variables
Private oSource As Document
Private oTable As Table
Private oRng As Range
Private strWidth As String
Private i As Long, j As Long, k As Long
Private m As Long, n As Long
Private Sub UserForm_Initialize()
Set oSource = Documents.Open(FileName:="C:\Addresses.doc", _
AddToRecentFiles:=False, _
Visible:=False)
Set oTable = oSource.Tables(1)
'Get the number of list members (i.e., table rows - 1 if header row is used)
i = oTable.Rows.Count - 1
'Get the number of list member attributes (i.e., table columns)
j = oTable.Columns.Count
'Set the number of columns in the Listbox
With Me.ListBox1
.ColumnCount = j
strWidth = .Width - 2
For k = 2 To j
strWidth = strWidth & ";" & 0
Next k
.ColumnWidths = strWidth
'Load list members into an array
ReDim myArray(i, j)
For n = 0 To j - 1
For m = 0 To i - 1
Set oRng = oTable.Cell(m + 2, n + 1).Range
oRng.End = oRng.End - 1
myArray(m, n) = oRng.Text
Next m
Next n
'Populate the ListBox using the array
.list() = myArray
.ListIndex = 0
End With
'Close the source file
oSource.Close SaveChanges:=wdDoNotSaveChanges
End Sub
Private Sub CommandButton1_Click()
Set oVars = ActiveDocument.Variables
oVars("Address").Value = Me.ListBox1.Column(0) & vbCr & _
Me.ListBox1.Column(1) & vbCr & _
Me.ListBox1.Column(2) & vbCr & _
Me.ListBox1.Column(3)
ActiveDocument.Fields.Update
Unload Me
End Sub