I don't think you can avoid having to do the Modify().
The protect attribute is very nice, since you can use an expression, but what I don't like is that you always have to make sure that the cursor is not in the column when it needs to be protected and also, when ALL columns are protected you cannot do a ScrollToRow().
Instead, I prefer to use the tabsequence attribute. It needs some coding, but once you have coded 3 functions:
1 to initially store all columns and their tabsequences,
1 to set them all to 0
and 1 to restore them to their initial value,
... then it's easy to use. It neither prevents you from having to code though.
What I do to allow a user to copy a column's contents when "not editable" (protected or tabsequence=0), is to have an option "Copy value" in a right-mouse popup menu.
It's a shame you cannot use an expression for the "readOnly" attribute of a column.
regards