It is possible achieve the results you are after without changing the FileAccess to read only. You can use the Workbook_BeforeSave and Workbook_Beforeclose events to control one's ability to save the workbook. I have provided a complete code example below that I believe would suit your needs. You could use a toggle button or any method you choose to run the subMakeItSaveable and subMakeItUnSaveable, or you could implement that functionality in a single routine.
The funUpdateCustomDocumentProperty function writes a Boolean value to the workbooks custom properties to toggle the ability to save the sheet. Please note that this custom property doesn't do anything except provide a place to store a value that isn't in either code or in the sheet. This provides a handy method of persisting data that our code needs when the code isn't running.
The code I used follows:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
ThisWorkbook.Saved = True
End Sub
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
If ThisWorkbook.CustomDocumentProperties("SaveMyChanges").Value Then
SaveAsUI = True
Cancel = False
Else
SaveAsUI = False
Cancel = True
myTestValue = MsgBox("Read Only Workbook. Save Not Allowed.", vbInformation, "Operation Aborted")
End If
End Sub
Private Sub Workbook_Open()
myTestValue = funUpdateCustomDocumentProperty("SaveMyChanges", False, msoPropertyTypeBoolean)
End Sub
Public Function funUpdateCustomDocumentProperty(strPropertyName As String, _
varValue As Variant, docType As Office.MsoDocProperties) As Boolean
'Function returns true if custom property was added, false if it already exists
'Originally a sub built by Peter Albert
'http://stackoverflow.com/users/1867581/peter-albert
On Error Resume Next
funUpdateCustomDocumentProperty = False
ThisWorkbook.CustomDocumentProperties(strPropertyName).Value _
= varValue
If Err.Number > 0 Then
ThisWorkbook.CustomDocumentProperties.Add _
Name:=strPropertyName, _
LinkToContent:=False, _
Type:=docType, _
Value:=varValue
funUpdateCustomDocumentProperty = True
End If
End Function
Public Sub subMakeItSaveable()
myTestValue = funUpdateCustomDocumentProperty("SaveMyChanges", True, msoPropertyTypeBoolean)
End Sub
Public Sub subMakeItUnSaveable()
myTestValue = funUpdateCustomDocumentProperty("SaveMyChanges", False, msoPropertyTypeBoolean)
End Sub