The Problem:
I receive lots of documents that I need to read but that I'm not supposed to change. I know I could open them as read-only from the Open dialog box by using the drop-down on the Open button, but I usually open them directly from email or from Explorer, so I don't have that choice. What I'd like is a box to check that tells Word I want to handle a document as "read only" after I've already opened it.
The Solution:
As you say, there's no simple checkboxor other controlto switch an open document to read-only status. But you can create a macro that does this well enough (see Example 8-4). Also, from Windows Explorer, you can right-click a Word document and choose "Open as Read-Only" from the shortcut menu.
Example 8-4 probably looks impenetrable, but once you get the hang of the If... Then
statements, it's pretty straightforward. Here's what's happening:
Macro to switch the active document to read-only status
Example 8-4
Sub Reopen_Active_Document_As_Read_Only() 'close the active document and reopen it as read-only 'store the page number and return to it when the document is reopened Dim strDocName As String Dim strDocFullName As String Dim strTitle As String Dim intPage As Integer strDocName = ActiveDocument.Name strDocFullName = ActiveDocument.FullName strTitle = "Reopen Document As Read-Only" intPage = Selection.Information(wdActiveEndPageNumber) If MsgBox(Prompt:="Close " & strDocName & " and reopen as read-only?", _ Buttons:=vbYesNo + vbQuestion, Title:=strTitle) = vbYes Then If ActiveDocument.Path = "" Then MsgBox Prompt:="This document has never been saved." & vbCr & vbCr _ & "Please save it now.", _ Buttons:=vbOKOnly + vbExclamation, Title:=strTitle If Dialogs(wdDialogFileSaveAs).Show = 0 Then Exit Sub End If strDocFullName = ActiveDocument.FullName End If If Not ActiveDocument.Saved Then If MsgBox(Prompt:="The document contains unsaved changes." & vbCr _ & vbCr & "Click Yes to save the changes; " & _ "click No to discard the changes.", Buttons:=vbYesNo + vbQuestion, _ Title:=strTitle) = vbYes Then _ ActiveDocument.Save End If ActiveDocument.Close SaveChanges:=wdDoNotSaveChanges Documents.Open FileName:=strDocFullName, ReadOnly:=True Selection.GoTo What:=wdGoToPage, Which:=wdGoToAbsolute, Count:=intPage End If End Sub
-
The first few lines are comments explaining what the macro does.
-
The second group of lines uses
Dim
statements to declarevariables
, or storage slots for data used in the macro. The format isDim
variablename
As
variabletype
. The first three declarations create String variables, which are variables that can hold text characters. The fifth declaration creates an Integer variable, which is a variable that can contain only a whole number (either positive or negative). -
The third group of lines assigns information to the variables. The
strDocName
variable receives the document's name (without the path). ThestrDocFullName
variable receives the document's name and path. ThestrTitle
variable receives the text to be displayed in the titlebar of each message box. TheintPage
variable gets the page number of the end of the current selection. (This will be used for the macro to display this page again after reopening the document.) -
The first
If
statement displays a message box to confirm that the user wants to run the macro. If the user clicks the Yes button, returning the valuevbYes
, the rest of the macro runs; if not, execution branches to theEnd If
statement just before theEnd Sub
statement, and the macro ends without taking any action. -
Provided the user has clicked the Yes button in the first message box, the next
If
statement checks whether the active document's path is an empty string (""
double quotation marks with no characters between them). If so, that means the document has never been saved, so the macro displays a notification message box (with just an OK button) followed by the Save As dialog box, which is the object namedwdDialogFileSaveAs
in theDialogs
collection. If the value returned by the Save As dialog box is0
, the user has clicked the Cancel button rather than saving the document, so theExit Sub
statement exits the macro. Otherwise, thestrDocFullName = ActiveDocument.FullName
statement assigns the document's name and path (now that it has one) to thestrDocFullName
variable. -
The next
If
statement checks whether the document contains unsaved changes (If Not ActiveDocument.Saved
translates to "if the active document has not been saved") and, if so, displays a message box asking the user to click the Yes button to save the changes or the No button to discard the changes. If the user clicks the Yes button, theActiveDocument.Save
statement saves the changes. -
After all those preliminaries, it's time for action. The
ActiveDocument.Close SaveChanges:=wdDoNotSaveChanges
statement closes the document without saving changes. (If the user chose to save unsaved changes, they've already been saved.) TheDocuments.Open
statement then uses thestrDocFullName
variable to open the document again, this time as read-only. TheSelection.GoTo
statement displays the page whose number is stored in theintPage
variablethat is, the page that was displayed when the macro was run.